A memória está livre, mas ainda está trocando?

7

Tenho certeza de que essa é uma pergunta básica, mas estou apenas tentando entender o que está acontecendo com o meu servidor Ubuntu Hardy executando um site baseado em Rails. Parece que tenho memória livre disponível, mas o sistema está relatando que ainda está trocando memória (a menos que eu esteja lendo isso incorretamente?).

Aqui está a free -m output

              total       used       free     shared    buffers     cached
Mem:          1024        905        118          0         33        409
-/+ buffers/cache:        462        561
Swap:         2047         95       1952

Alguém poderia me explicar algumas razões possíveis que está mantendo 95MB de swap em todos os momentos (nunca é menos)? Eu só estou procurando algumas pistas sobre coisas que eu poderia checar que explicariam para mim exatamente como a memória é utilizada no Linux.

    
por orokusaki 19.04.2010 / 21:12

3 respostas

10

Eu estava treinando em uma aula ensinada por Ted Ts'o, e a maneira como ele me explicou quando fiz a mesma pergunta foi assim ...

Por padrão, o kernel reserva a maior parte da memória para armazenar coisas como metadados do sistema de arquivos. É por isso que sua coluna "usada" mostra 905MB. Essa é a memória total que é "usada", ou seja, por programas e por cache. A quantidade real de memória livre está sob a coluna "livre", ao lado de "- / + buffers / cache", em outras palavras, 561MB. Essa é a quantia disponível para uso pelos programas.

Agora, como o kernel tem 462MB usado para cache, ele deixa 118MB completamente disponíveis. Quando um programa diz ao kernel, "ei, eu preciso de 50MB de memória AGORA!", O kernel extrai a memória desse conjunto "livre". Isso faz com que o conjunto "livre" fique em torno de 68 MB, o que é muito pequeno para o conforto, portanto, depois que a memória é desenhada, a quantidade de coisas armazenadas no cache é diminuída e o pool "livre" volta a funcionar.

Mas o que acontece se um programa é um porco e diz "Preciso de 120MB de memória AGORA!". Você não tem muita memória "livre", então o kernel não pode fornecê-la ao programa, mesmo temporariamente, para que o kernel busque a troca, apenas o suficiente para alocar memória livre suficiente para dar ao programa o que ele precisa, então, dados de cache suficientes são liberados para permitir que a memória "livre" volte a um nível confortável.

Por meio do processo de acomodação, os dados na troca não são liberados da troca imediatamente, mesmo que sejam dados armazenados em cache. A única vez que a memória swap vai se acostumar é se algo solicitar os metadados (ou qualquer informação armazenada em cache) armazenada naquele pequeno segmento de swap. Então não há mal em deixá-lo.

Se isso te incomoda, você pode executar 'swapoff' e 'swapon' para se livrar dele, mas não está prejudicando nada.

    
por 19.04.2010 / 21:56
9

O gerenciamento de memória é muito complexo, Entendendo o Kernel do Linux da O'Reilly fornece muitos detalhes.

A idéia é que você pode trocar a memória que provavelmente nunca será usada novamente de forma proativa. Você pode controlar a probabilidade de o swap ser usado com um valor que varia de 0 a 100 em /proc/sys/vm/swappiness . Um número mais alto significa mais chances de ser trocado.

Antes de começar a mexer com isso, veja se a troca está ativamente sendo usada observando as colunas si / então de vmstat 3 . Se estes permanecem 0, então houve troca acontecendo, mas não há troca acontecendo atualmente, nesse caso, eu recomendo que você deixe ser :-) Uma razão é que esses arquivos em cache que livre lhe falaram pode ser útil ter em memória. Não permita que a memória de processo inútil seja trocada e você pode perder a chance de armazenar em cache alguns arquivos que seriam úteis para o cache.

    
por 19.04.2010 / 21:24
3

Se você tiver 95 MB de dados do programa que não foram acessados em uma hora, o que você preferiria fazer:

1) Desperdice 95MB de memória física contendo dados que nunca poderão ser acessados.

2) Troque 95MB para o disco e tenha 95MB de memória física extra.

O sistema, sensatamente, escolhe a opção 2.

Você tende a ter uma quantidade moderada de memória desse tipo em muitos sistemas. Uma causa comum são programas que alocam memória durante a inicialização e aguardam solicitações que nunca chegam. Muitos sistemas Linux têm meia dúzia de programas de servidor em execução, mas que na verdade nunca são usados.

    
por 25.08.2011 / 01:30