J'ai trouvé que ce pidstat
serait un bon outil pour surveiller les processus. Je veux calculer l'utilisation moyenne de la mémoire d'un processus particulier. Voici un exemple 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
(Cela fait partie de la sortie de pidstat -r -p 7276
.)
Devrais-je utiliser les informations RSS (Resident Set Size) ou Virtual Size (VSZ) pour calculer la consommation moyenne de mémoire? J'ai lu quelques informations sur Wikipedia et sur des 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éponses:
RSS correspond à la quantité de mémoire actuellement occupée par ce processus dans la mémoire principale (RAM). VSZ est la quantité de mémoire virtuelle totale du processus. Cela inclut tous les types de mémoire, à la fois en RAM et en permutation. Ces chiffres peuvent être biaisés car ils incluent également des bibliothèques partagées et d'autres types de mémoire. Vous pouvez avoir cinq cents instances en
bash
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 devez vous faire une idée plus détaillée de l'encombrement mémoire d'un processus, vous avez quelques options. Vous pouvez parcourir
/proc/$PID/map
et éliminer les choses que vous n'aimez pas. Si ce sont des bibliothèques partagées, le calcul pourrait 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 l'
[heap]
entrée dans lemap
fichier. La taille allouée par le noyau pour le tas de processus peut ou non refléter le nombre exact d'octets que le processus a demandé d'allouer. Il y a des détails minutieux, des éléments internes du noyau et des optimisations qui peuvent en être la cause. Dans un monde idéal, vos processus seront au maximum, arrondis au multiple le plus proche de la taille de la page système (getconf PAGESIZE
vous en dira plus sur les PC, probablement 4 096 octets).Si vous voulez voir la quantité de mémoire allouée par un processus , 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 légèrementvalgrind
pour obtenir des informations sur ce genre de chose. (Notez que l'application de l'instrumentation nécessitera le redémarrage du processus.)Notez que, étant donné que vous pouvez également effectuer des analyses comparatives des temps d'exécution,
valgrind
vos programmes seront légèrement plus lents (mais probablement dans les limites de vos tolérances).la source
/proc/$PID/maps
s'agit-il d'une différence typo ou distro?Exemple minimal exécutable
Pour que cela ait un sens, vous devez comprendre les bases de la pagination: https://stackoverflow.com/questions/18431261/how-does-x86-paging-work et en particulier le fait que le système d'exploitation peut allouer de la mémoire virtuelle via des tables de pages / sa comptabilité interne (mémoire virtuelle VSZ) avant d’avoir une sauvegarde sur mémoire vive ou sur disque (mémoire résidente RSS).
Maintenant, pour observer cela en action, créons un programme qui:
mmap
principal c
GitHub en amont .
Compiler et exécuter:
où:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
: requis pour que Linux puisse effectuer un appel mmap plus important que la RAM physique: https://stackoverflow.com/questions/2798330/maximum-memory-which-malloc-can-allocate/57687432#57687432Sortie du programme:
Etat de sortie:
ce qui, selon la règle des 128 + signaux, signifie que nous avons obtenu le numéro du signal
9
, quiman 7 signal
est SIGKILL , qui est envoyé par le tueur de mémoire insuffisante de Linux .Interprétation de sortie:
printf '0x%X\n' 0x40009A4 KiB ~= 64GiB
(lesps
valeurs sont en Ko) après le mmap.extra_memory_committed 0
qui signifie que nous n’avons encore touché aucune page. RSS est un petit1648 KiB
fichier qui a été alloué au démarrage normal du programme, comme la zone de texte, les globaux, etc.8388608 KiB == 8GiB
valeur de pages. En conséquence, RSS a augmenté d’exactement 8 GIB pour atteindre8390256 KiB == 8388608 KiB + 1648 KiB
Voir aussi: Besoin d'explications sur la taille de l'ensemble résident / la taille virtuelle
Les journaux tueurs de MOO
Nos
dmesg
commandes ont montré les journaux tueurs de MOO.Une interprétation exacte de ceux-ci a été posée à l'adresse suivante:
La toute première ligne du journal était:
Nous constatons donc que c’est intéressant, c’est le démon MongoDB qui s’exécute toujours sur l’arrière-plan de mon ordinateur portable qui a d’abord déclenché le tueur de MOO, probablement lorsque le pauvre essaie d’allouer de la mémoire.
Cependant, le tueur de MOO ne tue pas nécessairement celui qui l'a réveillé.
Après l’appel, le noyau imprime une table ou des processus comprenant
oom_score
:et plus loin nous voyons que notre propre petit
main.out
a été tué lors de la précédente invocation:Ce journal mentionne le résultat
score 865
le plus élevé (le plus mauvais) obtenu par ce processus, comme indiqué à: Comment le tueur OOM décide-t-il quel processus tuer en premier?Il est également intéressant de noter que tout s’est apparemment passé si vite qu’avant la prise en compte de la mémoire libérée,
oom
leDeadlineMonitor
processus l’ a réveillé :et cette fois-ci qui a tué un processus de chrome, qui est généralement la mémoire normale de mon ordinateur:
Testé sous Ubuntu 19.04, noyau Linux 5.0.0.
la source