Comment mesurez-vous l'empreinte mémoire d'un ensemble de processus bifurqués?

8

Supposons que j'ai un processus utilisant 200 Mo de mémoire, et que fork () s:

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

Des programmes comme «top» afficheront chaque processus utilisant 200 Mo, avec très peu de mémoire SHRd, il semble donc que les processus utilisent 400 Mo au total. Cependant, étant donné que fork () implémente la copie sur écriture (COW) pour les pages mémoire du processus, la réalité est que les processus n'utilisent que 200 Mo au total.

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

Remarque: «top» sur OSX semble avoir une colonne RSHRD qui fait ce que j'attendais. Ma question est pour Linux.

Dustin Boswell
la source

Réponses:

5

Vous pouvez obtenir ce type d'informations dans le /proc/<pid>/smapsfichier pour chaque processus sous la forme de l' Pssentrée (abréviation de "Proportionional share size").

Dans l'exemple ci-dessus avec 200 Mo "partagés" entre deux processus, chaque processus affichera 100 Mo dans l'entrée PSS pour ce mappage, c'est-à-dire que la mémoire est répartie uniformément entre les processus qui la partagent (jusqu'à ce qu'elle soit copiée et non partagée par l'un ou l'autre des processus).

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

$ 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 beaucoup de choses dans ces fichiers, y compris des mappages pour des bibliothèques partagées qui sont potentiellement partagées entre de nombreux processus, et donc chaque processus n'est pris en compte que dans une petite partie de son entrée PSS.)

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

Je ne connais pas d'outil de type top commun pour afficher ces informations, et je ne pense pas psavoir d'options pour le montrer malheureusement non plus. L'article pointe vers un référentiel avec des scripts python appelé pagemappar Matt Mackall que vous pouvez utiliser ou adapter.

Plug sans vergogne: vous trouverez quelques articles sur Unix et Linux sur PSS et le smapsfichier si cela vous intéresse.

Tapis
la source