To vprašanje je zelo podrobno obravnavano tukaj.
Kako izmerite porabo pomnilnika aplikacije ali procesa v Linuxu?
Iz članka na blogu Understanding memory usage on Linux je razvidno, da ps
ni natančno orodje, ki bi ga lahko uporabili za ta namen.
Kaj je
ps
napačen"Odvisno od tega, kako gledate,
ps
ne poroča o dejanski porabi pomnilnika procesov. V resnici pa prikazuje, koliko pomnilnika bi vsak proces porabil, če bi bil edini delujoči proces. Seveda je v tipičnem računalniku Linux v vsakem trenutku zagnanih več deset procesov, kar pomeni, da so številke VSZ in RSS, ki jih sporočaps
, skoraj zagotovo nepravilne.
Z orodjem ps
ali podobnimi orodji boste dobili le količino pomnilniških strani, ki jih je dodelil ta proces. To število je pravilno, vendar:
ne odraža dejanske količine pomnilnika, ki ga uporablja aplikacija, temveč le količino pomnilnika, ki je zanjo rezervirana
je lahko zavajajoče, če si strani deli več niti ali če se uporabljajo dinamično povezane knjižnice
Če resnično želite vedeti, koliko pomnilnika dejansko uporablja vaša aplikacija, jo morate zagnati v programu za profiliranje. Na primer program valgrind
vam lahko da vpogled v količino uporabljenega pomnilnika in, kar je še pomembneje, v morebitno uhajanje pomnilnika v vašem programu. Orodje valgrinda za profiliranje kupa se imenuje 'massif':
Massif je orodje za profiliranje kopice. Izvaja podrobno profiliranje kupa z rednim snemanjem kupa programa. Pripravi graf, ki prikazuje porabo kupa skozi čas, vključno z informacijami o tem, kateri deli programa so odgovorni za največ dodelitev pomnilnika. Graf dopolnjuje besedilna datoteka ali datoteka HTML, ki vsebuje več informacij za ugotavljanje, kje se dodeljuje največ pomnilnika. Massif izvaja programe približno 20-krat počasneje kot običajno.
Kot je razloženo v dokumentaciji valgrind, morate program zaganjati s programom valgrind:
valgrind --tool=massif <executable> <arguments>
Massif zapiše izpis posnetkov porabe pomnilnika (npr. massif.out.12345
). Ti zagotavljajo (1) časovni potek uporabe pomnilnika, (2) za vsak posnetek zapis, kje v programu je bil pomnilnik dodeljen.
Odlično grafično orodje za analizo teh datotek je massif-visualizer. Vendar sem ugotovil, da je ms_print
, preprosto besedilno orodje, dobavljeno z valgrindom, že v veliko pomoč.
Za iskanje uhajanja pomnilnika uporabite (privzeto) orodje memcheck
iz programa valgrind.
Težko je to zagotovo ugotoviti, vendar sta tu dve "bližnji" stvari, ki lahko pomagata.
$ ps aux
vam bo dala virtualno velikost (VSZ)
Podrobno statistiko lahko dobite tudi iz datotečnega sistema /proc tako, da greste v /proc/$pid/status
Najpomembnejša je velikost VmSize, ki bi morala biti podobna tisti, ki jo daje ps aux
.
/proc/19420$ cat status Ime: firefox Stanje: S (spi) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 1000 1000 Velikost FDS: 256 Skupine: 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 Niti: 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 voluntary_ctxt_switches: 63422 neprostovoljni_ctxt_switchi: 7171
Priskrbite si valgrind. dajte mu svoj program za zagon in povedal vam bo veliko o njegovi porabi pomnilnika.
To velja le za program, ki nekaj časa teče in se nato ustavi. Ne vem, ali se valgrind lahko spravi na že zagnani proces ali na procese, ki se ne bi smeli ustaviti, kot so na primer demoni.