A memória no Linux pode ser uma fera estranha para diagnosticar e entender.
Em operação normal, a maioria, se não todos, da sua memória será alocada para uma tarefa ou outra. Alguns serão alocados para os processos em andamento no primeiro plano. Alguns armazenarão dados em cache do disco. Alguns manterão dados associados a processos que não estão sendo executados ativamente naquele momento específico.
Um processo no Linux possui seu próprio espaço de endereço virtual (VIRT na saída de top
). Contém todos os dados associados ao processo e pode ser considerado como "grande" o processo. No entanto, é raro que toda essa memória seja parte ativa do mapa de memória "real" (RES na saída de top
). O RES, ou memória residente, são os dados que estão diretamente acessíveis na RAM no momento. Então também há memória compartilhada (SHR) em cima disso. Isso pode ser compartilhado entre várias instâncias do mesmo processo. Portanto, a memória em uso por um processo ocorre em qualquer ponto no tempo RES mais SHR, mas se houver mais de uma instância do processo usando a memória compartilhada, o uso é RES mais RES mais RES ... mais SHR.
Então, por que a diferença entre RES e VIRT? Certamente, se um processo tem um bloco de memória alocada, é alocado memória, não é? Não. A memória é alocada nas páginas e as páginas podem ser Ativas ou Inativas. Os ativos são o que estão em RES. Inativo são "o resto". Eles podem ser empurrados para um lado, pois não estão sendo acessados no momento. Isso significa que eles podem ser trocados para o disco se a memória ficar apertada. Mas eles não vão direto para o disco. Primeiro eles se sentam em um cache. Você não quer estar trocando o tempo todo, então há um buffer entre o aplicativo e o espaço de troca. Esses buffers estão constantemente mudando, pois o swapper seleciona um processo diferente para executar e diferentes páginas tornam-se ativas e inativas. E tudo o que está acontecendo é rápido para um mero humano acompanhar.
E além de tudo isso, há os buffers de disco. Não apenas a memória inativa vai para um cache, mas quando esse cache é trocado para o disco, ele primeiro vai para um buffer de disco para ser enfileirado para gravação. Então essa é uma segunda camada de cache no mix. E esses buffers de disco também são usados por outras partes do sistema para buffer geral de E / S. Então eles estão constantemente mudando também.
Então, o que você está vendo em coisas como top
e free
etc são instantâneos instantâneos do estado atual da máquina ou estatísticas agregadas ao longo de um período de tempo. No momento em que você leu os dados, ele está desatualizado.
Qualquer processo pode acessar grandes quantidades de memória, mas raramente é sensato fazê-lo. Ele não pode estar acessando toda a memória de uma só vez, então a memória que não está procurando é movida para o cache, a menos que seja especificamente sinalizada como "bloqueada no núcleo".
Assim, a quantidade de memória "usada" por um aplicativo e a quantidade de memória "tem" são duas coisas completamente diferentes. Grande parte do espaço de dados de um aplicativo está realmente no cache, não na memória "core", mas como o cache está na RAM a maior parte do tempo ele fica instantaneamente disponível e precisa apenas "ativar" para se tornar memória "core". Isto é, a menos que tenha sido trocado para o disco, quando precisar de unswapping (que pode ser rápido se estiver no buffer).
Devido à natureza de alta velocidade da besta e ao fato de que as figuras estão sempre mudando, os números podem até mudar parcialmente através do cálculo do que eles são, então nunca é possível dizer exatamente "isso é o quanto de memória está use "da perspectiva do usuário. O meminfo é um instantâneo no tempo fornecido pelo kernel, mas como é o kernel que está sendo executado, não está necessariamente mostrando o estado real de qualquer um dos processos, já que nenhum processo está sendo executado ativamente naquele momento - entre processos. p>
Como eu disse, é tudo muito confuso.
Mas no final do dia isso realmente não importa. O que importa não é quanta memória você tem "livre", mas quanto espaço de troca você usou, e com que frequência o espaço de troca está sendo acessado. É a troca que desacelera o sistema, não a falta de memória (embora a falta de memória cause excesso de troca). Se você tem muita memória usada, mas não está usando nenhum (ou muito pouco) espaço de troca, então as coisas estão normais. A memória livre em geral não é desejável, e geralmente é puramente transicional, pois estava em uso para uma finalidade, mas ainda não foi alocada para outra - por exemplo, era memória cache e foi trocada para disco, mas ainda não foi usado para mais nada, ou foram buffers de disco, os buffers foram liberados para o disco, mas nenhum aplicativo solicitou o cache ainda.