Question Comment déterminer la mémoire utilisée par un processus forké (Linux)?


Suite à cette question. Debian, si cela compte.

Je comprends qu’une partie de la mémoire est partagée entre des processus forkés. Comment puis-je déterminer la quantité de mémoire utilisée par un processus / un ensemble de processus en chaîne?

Utilisation de l'outil smem recommandé dans cette question similaire, Je reçois des valeurs comme:

Command                         Swap      USS      PSS      RSS 
/usr/sbin/spamd --create-pr        0    16820    24974    41628
spamd chil                         0    19388    27581    44176
spamd chil                         0    32328    40038    55708

Je comprends la colonne swap et la colonne RSS correspond à ce qui est normalement indiqué (par exemple, dans ps). D'après la documentation de smem, USS est la mémoire spécifique à cet enfant et PSS est une partie de la mémoire partagée entre les processus. Cependant, ajouter USS à PSS donne des valeurs plus élevées que RSS et je pensais que le partage signifierait moins (par conséquent, j'interprète vraisemblablement de manière incorrecte).

Je ne suis pas lié à l'outil SMEM. Je voudrais juste un moyen d’obtenir un nombre "d’utilisation de la mémoire" qui reflète de manière assez précise la quantité de mémoire réelle utilisée par le processus.


5
2018-05-04 22:04


origine




Réponses:


La taille de jeu proportionnelle est probablement le meilleur chiffre d'utilisation de la mémoire par processus disponible. C'est la taille unique du jeu + (le nombre de pages partagées / le partage de processus).

Donc, un processus a utilisé 44176 pages, dont 19388 sont uniques à ce processus. Cela signifie que 24788 sont partagés avec d'autres.

En regardant PSS comme USS + (poids partagé). Le poids dans ce cas est 8193, ce qui correspond à la proportion de pages de mémoire partagée (24788) attribuable à ce processus. Plus vous avez de pages partagées, plus le poids de chaque processus est faible.

Vous pouvez additionner les services PSS sur plusieurs processus sans compter les pages partagées plus d'une fois. Cependant, vous ne pouvez pas additionner USS et PSS et attendre RSS, car PSS inclut déjà USS.


2
2018-05-05 15:06



Ah, je ne comprenais pas que PSS inclut déjà USS. Cela aide beaucoup, merci. - Tony Meyer


Si je comprends bien (mais s'il vous plaît, corrigez-moi si je me trompe), seul le segment de programme est partagé lorsqu'un processus se biface - les segments de données deviennent séparés.

Ainsi, l'exécutable (binaire) et toutes les bibliothèques partagées chargées seront partagés entre les processus.

Chaque processus obtiendra sa propre copie (*) de toute mémoire allouée avant le fork, mais toute mémoire allouée par la suite sera unique pour ce processus.

(*) Un système d'exploitation vraiment intelligent pourrait éviter de réellement allouer des segments de données pour la copie de l'enfant en utilisant un copie sur écriture algorithme, de sorte que la mémoire ne soit allouée que si l'un des processus tente de le modifier. Voir ici.


0
2018-05-04 22:43