Dette spørsmålet er dekket her i detalj .
Hvordan måler du minnebruken til et program eller en prosess i Linux?
Fra bloggartikkelen til Understanding memory usage on Linux, ps
er ikke et nøyaktig verktøy å bruke for denne hensikten.
Hvorfor
ps
er "feil"Avhengig av hvordan du ser på det, rapporterer
ps
ikke den virkelige minnebruken til prosesser. Det den egentlig gjør er å vise hvor mye reelt minne hver prosess ville tatt opp hvis det var den eneste prosessen som kjørte. Selvfølgelig har en typisk Linux-maskin flere dusin prosesser som kjører til enhver tid, noe som betyr at VSZ- og RSS-tallene rapportert avps
nesten definitivt er feil .
Med ps
eller lignende verktøy vil du bare få mengden minnesider som er tildelt av den prosessen. Dette tallet er riktig, men:
gjenspeiler ikke den faktiske mengden minne som brukes av applikasjonen, bare den mengden minne som er reservert for den.
kan være misvisende hvis sider deles, for eksempel av flere tråder eller ved bruk av dynamisk koblede biblioteker.
Hvis du virkelig vil vite hvor mye minne applikasjonen din faktisk bruker, må du kjøre den i en profiler. For eksempel kan valgrind
gi deg innsikt i hvor mye minne som brukes, og enda viktigere, om mulige minnelekkasjer i programmet ditt. Heap profiler-verktøyet til valgrind kalles 'massif':
Massif er en heap-profiler. Den utfører detaljert heap-profilering ved å ta regelmessige øyeblikksbilder av et programs heap. Den produserer en graf som viser heap-bruk over tid, inkludert informasjon om hvilke deler av programmet som er ansvarlig for de fleste minnetildelinger. Grafen suppleres med en tekst- eller HTML-fil som inneholder mer informasjon for å finne ut hvor det brukes mest minne. Massif kjører programmer omtrent 20 ganger saktere enn normalt.
Som forklart i valgrind-dokumentasjonen, må du kjøre programmet gjennom valgrind:
valgrind --tool=massif <executable> <arguments>
Massif skriver en dump av øyeblikksbilder av minnebruk (f.eks. massif.out.12345
). Disse gir, (1) en tidslinje for minnebruk, (2) for hvert øyeblikksbilde, en oversikt over hvor i programmet minne ble allokert.
Et flott grafisk verktøy for å analysere disse filene er massif-visualizer. Men jeg fant ms_print
, et enkelt tekstbasert verktøy som fulgte med valgrind, til stor hjelp allerede.
For å finne minnelekkasjer, bruk (standard) memcheck
-verktøyet til valgrind.
Vanskelig å si sikkert, men her er to "nære" ting som kan hjelpe.
$ ps aux
vil gi deg virtuell størrelse (VSZ)
Du kan også få detaljert statistikk fra /proc-filsystemet ved å gå til /proc/$pid/status
.
Det viktigste er VmSize, som bør være nær det ps aux
gir.
/proc/19420$ cat status Navn: firefox Status: S (sovende) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 1000 FDSize: 256 Grupper: 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 Tråder: 8 SigQ: 0/16382 SigPnd: 0000000000000000 ShdPnd: 000000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000020001000 SigCgt: 000000018000442f CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Cpus_allowed: 03 Mems_allowed: 1 frivillig_ctxt_switches: 63422 nonvoluntary_ctxt_switches: 7171
Få valgrind. gi det programmet ditt å kjøre, og det' vil fortelle deg mye om minnebruken.
Dette vil bare gjelde for et program som kjører i noen tid og stopper. Jeg vet ikke om valgrind kan få tak i en allerede kjørende prosess eller bør ikke stoppe prosesser som demoner.