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”:
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