Dette spørgsmål er behandlet her meget detaljeret.
Hvordan måler man hukommelsesforbruget for et program eller en proces i Linux?
Fra blogartiklen Forståelse af hukommelsesforbrug på Linux er ps
ikke et præcist værktøj til at bruge til dette formål.
Hvorfor
ps
er "forkert"Afhængigt af hvordan du ser på det, rapporterer
ps
ikke processernes reelle hukommelsesforbrug. Det, den i virkeligheden gør, er at vise, hvor meget reel hukommelse hver proces ville optage hvis den var den eneste proces, der kørte. Selvfølgelig har en typisk Linux-maskine flere dusin processer kørende på et givet tidspunkt, hvilket betyder, at de VSZ- og RSS-tal, somps
rapporterer, næsten helt sikkert er forkerte.
Med ps
eller lignende værktøjer får du kun det antal hukommelsessider, der er allokeret af den pågældende proces. Dette tal er korrekt, men:
afspejler ikke den faktiske mængde hukommelse, der bruges af programmet, men kun den mængde hukommelse, der er reserveret til det
kan være misvisende, hvis siderne deles, f.eks. af flere tråde eller ved brug af dynamisk linkede biblioteker
Hvis du virkelig ønsker at vide, hvor meget hukommelse dit program faktisk bruger, skal du køre det i en profiler. F.eks. kan valgrind
give dig indsigt i hvor meget hukommelse der bruges, og, endnu vigtigere, i mulige hukommelseslækager i dit program. Værktøjet til heap-profilering i valgrind hedder 'massif':
Massif er en heap profiler. Den udfører detaljeret heap-profilering ved at tage regelmæssige snapshots af et programs heap. Den producerer en graf, der viser heap-anvendelsen over tid, herunder oplysninger om hvilke dele af programmet der er ansvarlige for de fleste hukommelsesallokeringer. Grafen suppleres af en tekst- eller HTML-fil, der indeholder flere oplysninger til bestemmelse af, hvor der allokeres mest hukommelse. Massif kører programmer ca. 20 gange langsommere end normalt.
Som forklaret i valgrind-dokumentationen skal du køre programmet gennem valgrind:
valgrind --tool=massif <executable> <arguments>
Massif skriver et dump af øjebliksbilleder af hukommelsesforbruget (f.eks. massif.out.12345
). Disse giver (1) en tidslinje over hukommelsesforbruget, (2) for hvert snapshot en registrering af, hvor i dit program hukommelse blev allokeret.
Et godt grafisk værktøj til analyse af disse filer er massif-visualizer. Men jeg fandt ms_print
, et simpelt tekstbaseret værktøj, der leveres med valgrind, som en stor hjælp allerede.
For at finde hukommelseslækager skal du bruge værktøjet memcheck
(standard) i valgrind.
Det er svært at sige med sikkerhed, men her er to ting, der kan hjælpe.
$ ps aux
vil give dig Virtual Size (VSZ)
Du kan også få detaljeret statistik fra /proc-filsystemet ved at gå til /proc/$pid/status
Det vigtigste er VmSize, som bør ligge tæt på det, som ps aux
giver.
/proc/19420$ cat status Navn: firefox Status: S (sovende) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 1000 1000 1000 1000 FDSize: 256 Grupper: 4 6 20 20 24 25 25 29 29 30 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 Tråde: 8 SigQ: 0/16382 SigPnd: 00000000000000000000 ShdPnd: 000000000000000000000000 SigBlk: 000000000000000000000000 SigIgn: 0000000020001000 SigCgt: 000000018000442f CapInh: 000000000000000000000000 CapPrm: 000000000000000000000000 CapEff: 000000000000000000000000 Cpus_allowed: 03 Mems_allowed: 1 frivillige_ctxt_switches: 63422 nonvoluntary_ctxt_switches: 7171
Hent valgrind. giv det dit program til at køre, og det vil fortælle dig en masse om dets hukommelsesforbrug.
Dette gælder kun for et program, der kører i et stykke tid og stopper. Jeg ved ikke om valgrind kan få fat i en allerede kørende proces eller shouldn't-stop processer som f.eks. daemons.