8 votes

Comment mesurer l'empreinte mémoire d'un ensemble de processus bifurqués ?

Disons que j'ai un processus qui utilise 200MB de mémoire, et qu'il fork()s :

python -c "import os; data='x'*200000000; os.fork(); raw_input()"

Des programmes comme 'top' montreront que chaque processus utilise 200MB, avec très peu de mémoire SHRd, de sorte qu'il semble que les processus utilisent 400MB au total. Cependant, comme fork() implémente la fonction COW (copy-on-write) pour les pages de mémoire du processus, la réalité est que les processus n'utilisent que 200MB au total.

Pourquoi top ne montre-t-il pas quelle fraction de la mémoire est COW ? Existe-t-il un moyen de l'obliger à le faire ? Ou existe-t-il une autre commande que je peux utiliser à la place ?

Remarque : sous OSX, la colonne "top" semble avoir une colonne RSHRD qui fait ce que j'attends. Ma question s'adresse à Linux.

5voto

Ryan Points 1189

Vous pouvez obtenir ce genre d'informations auprès du /proc/<pid>/smaps pour chaque processus sous la forme du fichier Pss (abréviation de "Proportional share size").

Dans l'exemple ci-dessus avec 200MB "partagés" entre deux processus, chaque processus afficherait 100MB dans l'entrée PSS pour ce mappage, c'est-à-dire que la mémoire est distribuée de manière égale entre les processus qui la partagent (jusqu'à ce qu'elle soit copiée et non partagée par l'un ou l'autre processus).

Voici un extrait de l'exécution de quelque chose comme ce que vous avez posté :

$ top
...
30986 me        20   0  790m 769m 2200 S    0  4.8   0:00.48 python3.2
30987 me        20   0  790m 767m  224 S    0  4.8   0:00.00 python3.2
$ cat /proc/30986/smaps
...
0119a000-015b7000 rw-p 00000000 00:00 0                                  [heap]
Size:               4212 kB
Rss:                3924 kB
Pss:                1992 kB
...
7fa06b020000-7fa09ab11000 rw-p 00000000 00:00 0 
Size:             781252 kB
Rss:              781252 kB
Pss:              390626 kB
...
7fff8e45a000-7fff8e489000 rw-p 00000000 00:00 0                          [stack]
Size:                192 kB
Rss:                 160 kB
Pss:                  82 kB
...

(Il y a un lot de choses dans ces fichiers, y compris les mappages pour les bibliothèques partagées qui sont potentiellement partagées entre de nombreux processus, et donc chaque processus ne reçoit qu'une petite partie comptabilisée dans son entrée PSS pour ceux-ci).

Voici un bon article à ce sujet : ELC : Quelle quantité de mémoire les applications utilisent-elles réellement ?

Je ne connais pas d'outil commun de type "top" pour afficher ces informations, et je ne pense pas que l'on puisse trouver une solution à ce problème. ps n'a pas d'options pour montrer cela non plus malheureusement. L'article pointe vers un dépôt avec des scripts Python appelé pagemap par Matt Mackall que vous pourriez utiliser ou adapter.

Shameless plug : vous trouverez quelques posts sur <a href="https://unix.stackexchange.com/search?q=pss">Unix et Linux </a>sur PSS et le <code>smaps</code> si cela vous intéresse.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X