Meu Ubuntu consome mais memória do que o gerenciador de tarefas está mostrando:
sudo ps -e --format rss | awk 'BEGIN{c=0} {c+=$1} END{print c/1024}'
2750.29
free -m
total used free shared buffers cached
Mem: 3860 2765 1094 0 3 300
-/+ buffers/cache: 2461 1398
Swap: 2729 2374 354
Isso é estranho. Alguém pode explicar essa diferença?
Mas o que é mais importante: eu gostaria de saber quanta memória um processo está realmente usando. Não quero saber o tamanho da memória virtual, mas a memória residente mais a troca de um processo.
Também tentei exibir o formato param "sz" de 'ps', mas a soma disso é alta (16000 MB) (o tamanho do parâmetro fornece 36700 MB). Existem outras opções?
Eu realmente quero usar isso, para determinar quais programas / processos estão consumindo muita memória (e trocar), para matá-los, porque a memória é valiosa :-) Isso realmente não faz sentido, então estou perguntando aqui.
Saída de / proc / meminfo:
MemTotal: 3952812 kB
MemFree: 1119192 kB
Buffers: 2676 kB
Cached: 290068 kB
SwapCached: 160980 kB
Active: 1805396 kB
Inactive: 731680 kB
Active(anon): 1745820 kB
Inactive(anon): 689184 kB
Active(file): 59576 kB
Inactive(file): 42496 kB
Unevictable: 148 kB
Mlocked: 148 kB
SwapTotal: 2795272 kB
SwapFree: 390900 kB
Dirty: 1984 kB
Writeback: 0 kB
AnonPages: 2085472 kB
Mapped: 67432 kB
Shmem: 190676 kB
Slab: 88012 kB
SReclaimable: 42704 kB
SUnreclaim: 45308 kB
KernelStack: 5496 kB
PageTables: 87860 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 4771676 kB
Committed_AS: 9522364 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 374404 kB
VmallocChunk: 34359330144 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 61440 kB
DirectMap2M: 4030464 kB
Respostas:
O sistema de memória virtual linux não é tão simples. Você não pode simplesmente adicionar todos os campos RSS e obter o valor relatado
used
porfree
. Existem muitas razões para isso, mas vou abordar algumas das maiores.Quando um processo se bifurca, o pai e o filho são exibidos com o mesmo RSS. No entanto, o linux emprega
copy-on-write
para que ambos os processos estejam realmente usando a mesma memória. Somente quando um dos processos modifica a memória será realmente duplicada. Portanto, isso fará com que ofree
número seja menor que atop
soma do RSS.O valor do RSS não inclui memória compartilhada. Como a memória compartilhada não pertence a nenhum processo,
top
não a inclui no RSS. Portanto, isso fará com que ofree
número seja maior que atop
soma do RSS.fonte
Eu acho que é melhor confiar na saída de "free" no que diz respeito ao uso total de memória e confiar em "ps" para uma idéia geral de quanta memória um único processo está usando.
Só porque a soma dos valores de RSS "ps" não é igual a "livre" não impede que você classifique seus processos por RSS e avalie os maiores para matar.
Dito isto, se todo o seu esforço estiver apenas no serviço de garantir que a máquina possa hibernar, criar mais trocas (na forma de um arquivo em disco, se necessário) provavelmente será um caminho mais fácil.
fonte
Finalmente consegui a resposta para minha pergunta. Existe um programa chamado smem (no Ubuntu / Debian
apt install smem
) que permite listar a troca e a memória usada separadamente.Algumas maneiras diferentes de listar a troca podem ser encontradas aqui: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ .
fonte