Ubuntu Linux: processo de troca de memória e uso de memória

14

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
David Halter
fonte
Devo salientar que "1043,84" não está muito longe de "1178", que é o número que você obterá com o cálculo que está fazendo.
Cjc 22/03/12
Eu tinha literalmente a mesma pergunta em unix.stackexchange (+1). Patrick fundiu minha mente lá também: P-- unix.stackexchange.com/questions/34795/...
GoldenNewby

Respostas:

10

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 usedpor free. 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-writepara 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 o freenúmero seja menor que a topsoma do RSS.

  • O valor do RSS não inclui memória compartilhada. Como a memória compartilhada não pertence a nenhum processo, topnão a inclui no RSS. Portanto, isso fará com que o freenúmero seja maior que a topsoma do RSS.

Patrick
fonte
Ah, obrigada! Eu sempre pensei que free -m mostra a soma real da memória compartilhada de todo o sistema. Mas como "man ps" aponta: "A coluna de memória compartilhada deve ser ignorada; é obsoleta".
David Halter
Desculpe, não posso aceitar esta resposta, porque ela não responde ao problema da troca, mas, de qualquer forma, obrigado!
David Halter
@DavidHalter que problema de troca? As informações que forneci se aplicam a toda a memória, incluindo swap.
25412 Patrick Patrick
memória compartilhada não é realmente grande, normalmente? Pelo menos foi o que vi no gerenciador de tarefas. Mas minha troca é muito usada: 1035 MB; A soma do PS é de 1 GB e a soma do swap + rss é> 2 GB. Quero ver quanta memória um processo está realmente usando, não apenas rss. Ainda mais interessante seria a quantidade de memória trocada que um processo está usando.
David Halter
1
@DavidHalter se você quiser ver quanta memória um processo está usando (incluindo compartilhado), consulte a coluna 'VSZ'.
25312 Patrick
1

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.

datn
fonte
1

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/ .

David Halter
fonte