O que usou a memória do Linux? Cache baixo, buffer baixo, não uma VM

11

Primeiro de tudo, sim, eu li LinuxAteMyRAM , o que não explica minha situação.

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

Como mostrado acima, a linha -/+ buffers/cache: mostra que a taxa de memória usada é muito alta. No entanto, da saída de top , não vejo nenhum processo usado com mais de 100 MB de memória.

Então, o que usou a memória?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

Esta é uma máquina x86_64 (não é um servidor de marca comum) executando x84_64 Linux, não um contêiner em uma máquina virtual. Kernel ( uname -a ):

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Conteúdo de /proc/meminfo :

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

df não relata grande consumo de memória de tmpfs filesystems.

    
por Jason 07.06.2014 / 15:43

4 respostas

4

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.

    
por 12.06.2014 / 20:15
0

Esta é uma parte da resposta:

Existe uma diferença entre o que é designado como memória "Usada" (no comando "livre") e "Memória alocada para processos ativos (usuário)" (em / proc / meminfo). Ok, então o seu sistema tem 48149 MB total (aprox. 47Gb)

Se você olhar para o seu / proc / meminfo, você verá: Inativo: 17296272 kB = (aproximadamente 16,5 Gb) - A memória inativa pode ser de processos que foram encerrados. Também pode ser memória que não tenha sido usada por um longo tempo por um processo que esteja ativo. A memória não é "liberada" apenas porque o processo foi encerrado. Por quê? porque é mais trabalho. A mesma página de memória pode ser usada novamente, então o kernel do Linux simplesmente deixa os dados lá na lista "inativa" até que um processo precise dela.

Esta página explica um pouco disso. link ; Leia a seção sobre o PFRA (algoritmo de recuperação de quadros de página) usado pelo kernel do Linux: "Páginas incluídas em caches de disco e de memória não referenciados por qualquer processo devem ser recuperadas antes que as páginas pertencentes aos espaços de endereço do Modo de Usuário dos processos" Recuperando "signifiquem removê-las de" used "(inativo + ativo) e para" free " .

Isso explica o gerenciamento de memória em mais detalhes: como as listas ativas e inativas funcionam e como as páginas se movem entre elas link

Acredito que também há memória usada pelo kernel para estruturas de dados, e isso é mostrado como "slab 1049464 kb" (~ 1 GB), mas não estou certo de que isso seja contado separadamente.

    
por 17.06.2014 / 01:40
-2

Você usa o NFS em tudo?
Pode valer a pena correr slabtop -o de qualquer forma, o nfs_inode_cache pode ficar fora de controle.

    
por 11.02.2015 / 21:22
-4

A figura em que você deve estar olhando é used swap , em sua saída que é "0", o que significa que você NÃO ficou sem RAM. Enquanto o seu sistema não estiver trocando memória, você não deve se preocupar com as outras figuras, que são muito difíceis de interpretar de qualquer maneira.

Editar: Ok, parece que minha resposta está sendo considerada enigmática e não concisa. Então deixe-me elaborar.

Eu acho que o principal problema aqui é interpretar a saída de top / ps, que não é muito precisa. Por exemplo. como usos múltiplos das mesmas bibliotecas compartilhadas não são calculados como seria de se esperar, veja e. link

No entanto, o que é preciso é que, se o tamanho da troca for exatamente zero, o sistema não ficou sem memória (ainda). Claro, isso é uma declaração muito claro, mas para criar o perfil do uso de memória real do seu sistema, o topo não será a coisa certa. (E se você olhar no topo, pelo menos, classifique a saída para virt ou% mem.)

Veja também link

    
por 13.06.2014 / 15:21

Tags