Comment mesurer l'utilisation réelle de la mémoire d'une application ou d'un processus ?

Cette question est traitée ici de manière très détaillée.

Comment mesurer l'utilisation de la mémoire d'une application ou d'un processus sous Linux ?

D'après l'article du blog [Comprendre l'utilisation de la mémoire sous Linux][2], ps n'est pas un outil précis à utiliser dans ce but.

Pourquoi ps est "incorrect".

Selon la façon dont vous le regardez, ps ne rapporte pas l'utilisation réelle de la mémoire des processus. Ce qu'il fait réellement, c'est montrer combien de mémoire réelle chaque processus prendrait s'il était le seul processus en cours d'exécution. Bien sûr, une machine Linux typique a plusieurs douzaines de processus en cours d'exécution à tout moment, ce qui signifie que les nombres VSZ et RSS indiqués par ps sont presque certainement faux.

[2] : http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html

Solution

Avec ps ou des outils similaires, vous obtiendrez seulement la quantité de pages de mémoire allouées par ce processus. Ce nombre est correct, mais :

  • ne reflète pas la quantité réelle de mémoire utilisée par l'application, seulement la quantité de mémoire qui lui est réservée

  • peut être trompeur si les pages sont partagées, par exemple par plusieurs threads ou par l'utilisation de bibliothèques liées dynamiquement.

Si vous voulez vraiment savoir quelle quantité de mémoire votre application utilise réellement, vous devez l'exécuter avec un profileur. Par exemple, valgrind peut vous donner des indications sur la quantité de mémoire utilisée, et, plus important encore, sur les éventuelles fuites de mémoire dans votre programme. L'outil de profilage de tas de valgrind s'appelle 'massif' :

Massif est un profileur de tas. Il effectue un profilage détaillé du tas en prenant régulièrement des instantanés du tas d'un programme. Il produit un graphique montrant l'utilisation du tas au fil du temps, y compris des informations sur les parties du programme qui sont responsables de la plupart des allocations de mémoire. Le graphique est complété par un fichier texte ou HTML qui comprend plus d'informations pour déterminer où la plus grande partie de la mémoire est allouée. Massif exécute les programmes environ 20x plus lentement que la normale.

Comme expliqué dans la [documentation valgrind][1], vous devez exécuter le programme à travers valgrind :

valgrind --tool=massif  

Massif écrit un dump d'instantanés d'utilisation de la mémoire (par exemple massif.out.12345). Ceux-ci fournissent, (1) une chronologie de l'utilisation de la mémoire, (2) pour chaque instantané, un enregistrement de l'endroit où la mémoire a été allouée dans votre programme. Un excellent outil graphique pour analyser ces fichiers est [massif-visualizer][2]. Mais j'ai trouvé que ms_print, un simple outil textuel livré avec valgrind, était déjà d'une grande aide.

Pour trouver les fuites de mémoire, utilisez l'outil (par défaut) memcheck de valgrind.

[1] : http://valgrind.org/docs/manual/ms-manual.html [2] : https://github.com/KDE/massif-visualizer

Commentaires (18)

Difficile à dire avec certitude, mais voici deux choses proches qui peuvent aider.

$ ps aux 

vous donnera la taille virtuelle (VSZ)

Vous pouvez également obtenir des statistiques détaillées à partir du système de fichiers /proc en allant dans /proc/$pid/status.

Le plus important est la VmSize, qui devrait être proche de ce que donne ps aux.

/proc/19420$ cat status
Nom : firefox
Etat : S (sleeping)
Tgid : 19420
Pid : 19420
PPid : 1
TracerPid : 0
Uid : 1000 1000 1000 1000
Gid : 1000 1000 1000 1000
Taille FDS : 256
Groupes : 4 6 20 24 25 29 30 44 46 107 109 115 124 1000
VmPeak : 222956 kB
VmSize : 212520 kB
VmLck : 0 kB
VmHWM : 127912 kB
VmRSS : 118768 kB
VmData : 170180 kB
VmStk : 228 kB
VmExe : 28 kB
VmLib : 35424 kB
VmPTE : 184 kB
Threads : 8
SigQ : 0/16382
SigPnd : 0000000000000000
ShdPnd : 0000000000000000
SigBlk : 0000000000000000
SigIgn : 0000000020001000
SigCgt : 000000018000442f
CapInh : 0000000000000000
CapPrm : 0000000000000000
CapEff : 0000000000000000
Cpus_allowed : 03
Mems_allowed : 1
interrupteurs_ctxt volontaires : 63422
Commutateurs de texte non volontaires : 7171
Commentaires (3)

Procurez-vous valgrind. Donnez-lui votre programme à exécuter, et il vous en dira long sur son utilisation de la mémoire.

Cela ne s'applique que dans le cas d'un programme qui s'exécute pendant un certain temps et s'arrête. Je ne sais pas si valgrind peut mettre la main sur un processus déjà en cours d&#8217exécution ou sur des processus qui ne doivent pas s&#8217arrêter, comme les démons.

Commentaires (1)