Našel jsem, že pidstat
by byl dobrým nástrojem pro sledování procesů. Chci vypočítat průměrné využití paměti konkrétního procesu. Zde je několik příkladů výstupu:
02:34:36 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:34:37 PM 7276 2.00 0.00 349212 210176 7.14 scalpel
(Toto je část výstupu z pidstat -r -p 7276
.)
Mám použít informace o velikosti rezidentní sady (RSS) nebo virtuální velikosti (VSZ) k výpočtu průměrné spotřeby paměti? Přečetl jsem si pár věcí na Wikipedii a na fórech, ale nejsem si jistý, zda plně rozumím rozdílům. Navíc se zdá, že žádný z nich není spolehlivý. Jak tedy mohu monitorovat proces, abych zjistil využití paměti?
Jakákoli pomoc v této záležitosti by byla užitečná.
Přijatá odpověď:
RSS udává, kolik paměti má tento proces aktuálně v hlavní paměti (RAM). VSZ udává, kolik virtuální paměti má proces celkem. To zahrnuje všechny typy pamětí, a to jak v RAM, tak swapované. Tato čísla mohou být zkreslená, protože zahrnují také sdílené knihovny a další typy paměti. Můžete mít pět set instancí bash
běží a celková velikost jejich paměťové stopy nebude součtem jejich hodnot RSS nebo VSZ.
Pokud potřebujete získat podrobnější představu o paměťové stopě procesu, máte několik možností. Můžete projít /proc/$PID/map
a vyřadit věci, které se vám nelíbí. Pokud se jedná o sdílené knihovny, výpočet by mohl být složitý v závislosti na vašich potřebách (což si myslím, že si pamatuji).
Pokud vám záleží pouze na velikosti haldy procesu, můžete vždy analyzovat [heap]
záznam v map
soubor. Velikost, kterou jádro alokovalo pro hromadu procesu, může, ale nemusí odrážet přesný počet bajtů, o které proces požádal k přidělení. Existují drobné detaily, vnitřnosti jádra a optimalizace, které to mohou shodit. V ideálním světě to bude tolik, kolik váš proces potřebuje, zaokrouhleno nahoru na nejbližší násobek velikosti systémové stránky (getconf PAGESIZE
vám řekne, co to je – na počítačích je to pravděpodobně 4 096 bajtů).
Pokud chcete vidět, kolik paměti proces přidělil , jedním z nejlepších způsobů je vzdát se metrik na straně jádra. Místo toho instrumentujete (de)alokační funkce paměti haldy C knihovny pomocí LD_PRELOAD
mechanismus. Osobně valgrind
mírně zneužívám získat informace o takových věcech. (Všimněte si, že použití instrumentace bude vyžadovat restartování procesu.)
Vezměte prosím na vědomí, protože můžete také srovnávat běhové prostředí, že valgrind
vaše programy budou velmi mírně pomalejší (ale pravděpodobně v rámci vašich tolerancí).