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 parps
sont presque certainement faux.
[2] : http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html
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 <executable> <arguments>
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
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
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’exécution ou sur des processus qui ne doivent pas s’arrêter, comme les démons.