Copier/coller sans vergogne ma réponse de serverfault l'autre jour :-)
Le système de mémoire virtuelle Linux n'est pas si simple. Vous ne pouvez pas simplement additionner tous les champs RSS et obtenir la valeur rapportée used
par free
. Il y a plusieurs raisons à cela, mais je vais en citer quelques-unes parmi les plus importantes.
-
Lorsqu'un processus bifurque, le parent et l'enfant s'afficheront avec le même RSS. Cependant, Linux utilise la copie sur écriture afin que les deux processus utilisent réellement la même mémoire. Ce n'est que lorsque l'un des processus modifie la mémoire qu'elle sera réellement dupliquée.
Cela entraînera lefree
nombre inférieur autop
Somme RSS. -
La valeur RSS n'inclut pas la mémoire partagée. Étant donné que la mémoire partagée n'appartient à aucun processus en particulier,
top
ne l'inclut pas dans RSS.
Cela provoquera lefree
nombre supérieur autop
Somme RSS.
Si vous recherchez des numéros de mémoire qui s'additionnent, jetez un œil à smem :
smem est un outil qui peut fournir de nombreux rapports sur l'utilisation de la mémoire sur les systèmes Linux. Contrairement aux outils existants, smem peut signaler la taille d'ensemble proportionnelle (PSS), qui est une représentation plus significative de la quantité de mémoire utilisée par les bibliothèques et les applications dans un système de mémoire virtuelle.
Étant donné que de grandes parties de la mémoire physique sont généralement partagées entre plusieurs applications, la mesure standard de l'utilisation de la mémoire connue sous le nom de taille d'ensemble résidente (RSS) surestimera considérablement l'utilisation de la mémoire. PSS mesure plutôt la "part équitable" de chaque application de chaque zone partagée pour donner une mesure réaliste.
Par exemple ici :
# smem -t
PID User Command Swap USS PSS RSS
...
10593 root /usr/lib/chromium-browser/c 0 22868 26439 49364
11500 root /usr/lib/chromium-browser/c 0 22612 26486 49732
10474 browser /usr/lib/chromium-browser/c 0 39232 43806 61560
7777 user /usr/lib/thunderbird/thunde 0 89652 91118 102756
-------------------------------------------------------------------------------
118 4 40364 594228 653873 1153092
Donc PSS
est la colonne intéressante ici car elle tient compte de la mémoire partagée.
Contrairement à RSS
il est significatif de l'additionner. Nous obtenons ici un total de 654 Mo pour les processus utilisateur.
La sortie à l'échelle du système indique le reste :
# smem -tw
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 345784 297092 48692
userspace memory 654056 181076 472980
free memory 15828 15828 0
----------------------------------------------------------
1015668 493996 521672
Donc 1 Go de RAM totale =654 Mo de processus utilisateur + 346 Mo de mémoire noyau + 16 Mo gratuit
(plus ou moins quelques Mo)
Dans l'ensemble, environ la moitié de la mémoire est utilisée pour le cache (494 Mo).
Question bonus :qu'est-ce que le cache utilisateur vs le cache noyau ici ?
btw pour quelque chose de visuel, essayez :
# smem --pie=name
Un très bon outil est pmap
qui répertorie l'utilisation actuelle de la mémoire pour un certain processus :
pmap -d PID
Pour plus d'informations à ce sujet, consultez la page de manuel man pmap
et jetez également un coup d'œil à 20 outils de surveillance du système Linux que chaque administrateur système devrait connaître, qui répertorie les excellents outils que j'utilise toujours pour obtenir des informations sur ma machine Linux.