Ubuntu Linux: Processus d'échange de mémoire et d'utilisation de la mémoire

14

Mon Ubuntu mange plus de mémoire que le gestionnaire de tâches n'en montre:

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

C'est étrange. Quelqu'un peut-il expliquer cette différence?

Mais ce qui est plus important: j'aimerais savoir combien de mémoire un processus utilise réellement. Je ne veux pas connaître la taille de la mémoire virtuelle, mais plutôt la mémoire résidente plus l'échange d'un processus.

J'ai également essayé de produire le format param "sz" de 'ps', mais la somme de ceci est trop élevée (16000 Mo) (le paramètre 'taille' donne 36700 Mo). Il y a-t-il des alternatives?

Je veux vraiment l'utiliser pour déterminer quels programmes / processus consomment trop de mémoire (et les échanger), pour les tuer, car la mémoire est précieuse :-) Cela n'a vraiment aucun sens, alors je demande ici.

Sortie 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
la source
Je dois souligner que "1043.84" n'est pas très loin de "1178", qui est le nombre que vous allez obtenir avec ce calcul que vous faites.
cjc
J'avais littéralement la même question sur unix.stackexchange (+1). Patrick m'a aussi fait exploser l'esprit: P-- unix.stackexchange.com/questions/34795/…
GoldenNewby

Réponses:

10

Le système de mémoire virtuelle Linux n'est pas aussi simple. Vous ne pouvez pas simplement ajouter tous les champs RSS et obtenir la valeur signalée usedpar free. Il y a plusieurs raisons à cela, mais j'en toucherai quelques-unes.

  • Lorsqu'un processus bifurque, le parent et l'enfant s'affichent avec le même RSS. Cependant, Linux utilise de copy-on-writesorte que les deux processus utilisent vraiment la même mémoire. Ce n'est que lorsque l'un des processus modifie la mémoire qu'elle sera effectivement dupliquée. Ainsi, le freenombre sera inférieur à la topsomme RSS.

  • La valeur RSS n'inclut pas la mémoire partagée. Parce que la mémoire partagée n'appartient à aucun processus, topne l'inclut pas dans RSS. Cela entraînera donc un freenombre supérieur à la topsomme RSS.

Patrick
la source
Oh merci! J'ai toujours pensé que free -m montre la somme réelle de la mémoire partagée de tout le système. Mais comme le souligne "man ps": "La colonne de mémoire partagée doit être ignorée; elle est obsolète."
David Halter
Désolé, je ne peux pas accepter cette réponse, car elle ne répond pas au problème de swap, mais merci quand même!
David Halter
@DavidHalter quel problème de swap? Les informations que j'ai fournies s'appliquent à toute la mémoire, y compris l'échange.
Patrick
la mémoire partagée n'est pas vraiment grande, normalement? C'est du moins ce que j'ai vu dans le gestionnaire de tâches. Mais mon swap est assez largement utilisé: 1035 Mo; La somme de PS est de 1 Go et la somme de swap + rss est> 2 Go. Je veux voir combien de mémoire un processus utilise réellement, pas seulement rss. Encore plus intéressant serait la quantité de mémoire échangée utilisée par un processus.
David Halter
1
@DavidHalter si vous voulez voir combien de mémoire un processus utilise (y compris partagé), alors regardez la colonne 'VSZ'.
Patrick
1

Je pense que vous feriez mieux de faire confiance à la sortie de "free" en ce qui concerne votre utilisation totale de la mémoire, et de faire confiance à "ps" pour une idée générale de la quantité de mémoire utilisée par un seul processus.

Tout simplement parce que la somme des valeurs RSS "ps" n'est pas égale à "gratuit" ne vous empêche pas de trier vos processus par RSS et d'évaluer les plus grands pour les tuer.

Cela étant dit, si tous vos efforts ne visent qu'à vous assurer que la machine peut hiberner, la création de plus de swap (sous la forme d'un fichier sur disque, si nécessaire) est probablement un chemin plus facile à prendre.

datn
la source
1

J'ai finalement obtenu la réponse à ma question. Il existe un programme appelé smem (sur Ubuntu / Debian apt install smem) qui vous permet de répertorier séparément le swap et la mémoire utilisée.

Quelques façons différentes de lister le swap peuvent être trouvées ici: https://www.cyberciti.biz/faq/linux-which-process-is-using-swap/ .

David Halter
la source