Tejto otázke sa podrobne venujeme tu.
Ako meriate využitie pamäte aplikácie alebo procesu v Linuxe?
Z článku na blogu Understanding memory usage on Linux vyplýva, že ps
nie je presný nástroj na tento účel.
Prečo je
ps
"nesprávny"V závislosti od toho, ako sa na to pozeráte,
ps
neuvádza skutočné využitie pamäte procesov. V skutočnosti ukazuje, koľko skutočnej pamäte by každý proces zabral, keby bol jediným bežiacim procesom. Samozrejme, na typickom linuxovom počítači beží v danom čase niekoľko desiatok procesov, čo znamená, že čísla VSZ a RSS, ktoré hlásips
, sú takmer určite nesprávne.
Pomocou nástrojov ps
alebo podobných nástrojov získate iba množstvo pamäťových stránok pridelených danému procesu. Toto číslo je správne, ale:
neodráža skutočné množstvo pamäte využívané aplikáciou, iba množstvo pamäte pre ňu rezervovanej
môže byť zavádzajúce, ak sú stránky zdieľané, napríklad viacerými vláknami alebo použitím dynamicky linkovaných knižníc
Ak chcete skutočne zistiť, aké množstvo pamäte vaša aplikácia skutočne využíva, musíte ju spustiť v rámci profilera. Napríklad program valgrind
vám môže poskytnúť informácie o množstve použitej pamäte, a čo je dôležitejšie, o možných únikoch pamäte vo vašom programe. Profilovací nástroj haldy valgrind sa nazýva 'massif':
Massif je profilovač haldy. Vykonáva podrobné profilovanie haldy pravidelným vytváraním snímok haldy programu'. Vytvára graf zobrazujúci využitie haldy v priebehu času vrátane informácií o tom, ktoré časti programu sú zodpovedné za najviac alokácií pamäte. Graf je doplnený textovým súborom alebo súborom HTML, ktorý obsahuje ďalšie informácie na určenie toho, kde sa alokuje najviac pamäte. Massif spúšťa programy približne 20x pomalšie ako zvyčajne.
Ako je vysvetlené v dokumentácii valgrind, program musíte spustiť cez valgrind:
valgrind --tool=massif <executable> <arguments>
Massif vypíše výpis snímok využitia pamäte (napr. massif.out.12345
). Tieto poskytujú (1) časovú os využitia pamäte, (2) pre každý snímok záznam o tom, kde v programe bola alokovaná pamäť.
Skvelým grafickým nástrojom na analýzu týchto súborov je massif-visualizer. Mne však veľmi pomohol už ms_print
, jednoduchý textový nástroj dodávaný s nástrojom valgrind.
Ak chcete nájsť úniky pamäte, použite (predvolený) nástroj memcheck
nástroja valgrind.
Ťažko povedať s istotou, ale tu sú dve veci, ktoré môžu pomôcť.
$ ps aux
vám poskytne virtuálnu veľkosť (VSZ)
Podrobné štatistiky zo súborového systému /proc môžete získať aj tak, že prejdete na /proc/$pid/status
Najdôležitejšia je VmSize, ktorá by mala byť blízka tej, ktorú poskytuje ps aux
.
/proc/19420$ cat status Názov: firefox Stav: S (spí) Tgid: 19420 Pid: 19420 PPid: 1 TracerPid: 0 Uid: 1000 1000 1000 1000 1000 Gid: 1000 1000 1000 1000 1000 FDSize: 256 Skupiny: 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 Vlákna: 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 nonvoluntary_ctxt_switches: 7171
Kúpte si valgrind. dajte mu spustiť svoj program a on vám povie veľa o jeho využití pamäte.
To by platilo len pre prípad programu, ktorý beží nejaký čas a zastaví sa. Neviem, či valgrind môže dostať do rúk už bežiaci proces alebo by'mal zastaviť procesy, ako sú démoni.