Explicando o “free”, do Linux.

Alguns amigos e colegas, que estão enveredando pelo mundo do Linux, me mostraram algumas dúvidas sobre o gerenciamento de memória do Linux. Eis aqui uma explicação resumida de como interpretar os valores informados pelo comando free:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          3702       2217       1484          0        131        955
-/+ buffers/cache:       1130       2571
Swap:         3837          0       3837

À primeira vista pode parecer que o total de memória física livre, num linux box, de acordo com as informações acima, é de cerca de 1.5 GB. De fato, no momento que digitei o comando free esta é mesmo a quantidade atual de memória física livre. Só que tem um detalhe…

Linux mantém buffers e caches que são alocados e dealocados por demanda. A segunda linha “-/+ buffers/cache” indica as quantidades reais, considerando os efeitos dos buffers/caches. Não é a toa que é escrito “-/+” e não “+/-“. O total de memória usada, desconsiderando os buffers/cache deve ser o valor “used” da primeira linha menos a soma dos buffers/caches. Ao mesmo tempo, o total de memória física livre é a soma do valor “free” da primeira linha mais a soma dos buffers/caches.

Existe uma diferença entre memória “livre” e memória “não usada” aqui, do ponto de vista das aplicações… Isso significa que o kernel pode livrar-se de buffers e caches se os processos precisarem deste espaço. Menos cache significa menor rapidez, em certos casos (mais I/O, por exemplo).

Acho que ficou claro, mas vamos dar uma olhada no  utilitário “top”:

Eis a causa da confusão…

Esse snapshot foi tirado alguns minutos depois que chamei “free”. Note que “top” reporta uso de 80.7% da “memória”. No entanto, tem alguma coisa errada! Colocando a listagem em ordem pelo campo %MEM, nem de longe chegamos perto dos 80% de uso. Acontece que “top” mostra a primeira linha de “free” em seu cabeçalho seguido pelo tamanho dos buffers e caches (132.5 kB e 958 kB, respectivaemnte, neste caso).

Dando uma outra olhada na chamada de “free”:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          3702       2217       1484          0        131        955
-/+ buffers/cache:       1130       2571
Swap:         3837          0       3837

Se você quiser ter uma idéia do uso da memória num momento específico, use os valores em verde. Eles levam em consideração o consumo dos buffers e caches no instante em que free é chamado. Mas, do ponto de vista das aplicações, os valores em vermelho inficam o que está sendo usado desconsiderando os buffers e caches — que podem ser liberados a qualquer mommento pelo kernel.

Um jeito mais complicado de obter informações mais precisas sobre o gerenciamento de memória é lendo o “arquivo” /proc/meminfo que, convenhamos, é bem mais complicado de fazer (consulte a documentação do kernel para interpretá-lo, se quiser):

MemTotal:        3791408 kB
MemFree:         1169340 kB
Buffers:          137172 kB
Cached:          1003152 kB
SwapCached:            0 kB
Active:          1399276 kB
Inactive:         644248 kB
Active(anon):     903988 kB
Inactive(anon):     1088 kB
Active(file):     495288 kB
Inactive(file):   643160 kB
Unevictable:          36 kB
Mlocked:              36 kB
SwapTotal:       3930108 kB
SwapFree:        3930108 kB
Dirty:                76 kB
Writeback:             0 kB
AnonPages:        903256 kB
Mapped:           172580 kB
Shmem:              1880 kB
Slab:              99072 kB
SReclaimable:      74092 kB
SUnreclaim:        24980 kB
KernelStack:        3216 kB
PageTables:        28100 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5825812 kB
Committed_AS:    3399200 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      302004 kB
VmallocChunk:   34359434176 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     1330752 kB
DirectMap2M:     2600960 kB
DirectMap1G:           0 kB

Deixe um comentário