J'ai trouvé que pidstat
serait un bon outil pour surveiller les processus. Je veux calculer l'utilisation moyenne de la mémoire d'un processus particulier. Voici quelques exemples de sortie :
02:34:36 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:34:37 PM 7276 2.00 0.00 349212 210176 7.14 scalpel
(Ceci fait partie de la sortie de pidstat -r -p 7276
.)
Dois-je utiliser les informations Resident Set Size (RSS) ou Virtual Size (VSZ) pour calculer la consommation moyenne de mémoire ? J'ai lu quelques trucs sur Wikipédia et sur les forums mais je ne suis pas sûr de bien comprendre les différences. De plus, il semble qu'aucun d'entre eux ne soit fiable. Alors, comment puis-je surveiller un processus pour obtenir son utilisation de la mémoire ?
Toute aide à ce sujet serait utile.
Réponse acceptée :
RSS est la quantité de mémoire dont ce processus dispose actuellement dans la mémoire principale (RAM). VSZ est la quantité totale de mémoire virtuelle dont dispose le processus. Cela inclut tous les types de mémoire, à la fois en RAM et en échange. Ces chiffres peuvent être faussés car ils incluent également des bibliothèques partagées et d'autres types de mémoire. Vous pouvez avoir cinq cents instances de bash
en cours d'exécution, et la taille totale de leur empreinte mémoire ne sera pas la somme de leurs valeurs RSS ou VSZ.
Si vous avez besoin d'avoir une idée plus détaillée de l'empreinte mémoire d'un processus, vous avez quelques options. Vous pouvez passer par /proc/$PID/map
et éliminez les choses que vous n'aimez pas. S'il s'agit de bibliothèques partagées, le calcul peut devenir complexe en fonction de vos besoins (ce dont je pense me souvenir).
Si vous ne vous souciez que de la taille du tas du processus, vous pouvez toujours simplement analyser le [heap]
entrée dans la map
dossier. La taille que le noyau a allouée au tas du processus peut ou non refléter le nombre exact d'octets que le processus a demandé à allouer. Il y a des détails infimes, des éléments internes du noyau et des optimisations qui peuvent perturber cela. Dans un monde idéal, ce sera autant que votre processus a besoin, arrondi au multiple le plus proche de la taille de la page système (getconf PAGESIZE
vous dira ce que c'est - sur les PC, c'est probablement 4 096 octets).
Si vous voulez voir combien de mémoire un processus a alloué , l'un des meilleurs moyens consiste à renoncer aux métriques côté noyau. Au lieu de cela, vous instrumentez les fonctions d'allocation de mémoire de tas de la bibliothèque C avec le LD_PRELOAD
mécanisme. Personnellement, j'abuse un peu de valgrind
pour obtenir des informations sur ce genre de choses. (Notez que l'application de l'instrumentation nécessitera de redémarrer le processus.)
Veuillez noter, puisque vous pouvez également comparer les runtimes, que valgrind
rendra vos programmes très légèrement plus lents (mais probablement dans vos tolérances).