Pro daný proces v /proc/<pid>/smaps
, co jsou pro daný záznam mapování:
- Shared_Clean
- Shared_Dirty
- Private_Clean
- Private_Dirty
Je Shared_Clean
+ Shared_Dirty
množství paměti sdílené s jinými procesy? Takže je to jako sdílené RSS?
Podobně je na tom Private_Clean
+ Private_Dirty
množství paměti, které je dostupné pouze pro jeden proces ? Takže je to jako soukromé RSS?
Je hodnota PSS =PrivateRSS + (SharedRSS / počet procesů, které ji sdílejí)?
Několik dalších otázek po přečtení tohoto odkazu:LWN
Nyní si promluvme o procesu jako celku, na jehož záznam smapy se díváme.
Všiml jsem si, že když udělám Shared_Clean
+ Shared_Dirty
+ Private_Clean
+ Private_Dirty
pro každý záznam smaps pro proces dostanu RSS procesu, jak
uvádí ps
, což je docela fajn. Například
ps -p $$ -o pid,rss
Dá mi (přibližně) stejnou hodnotu pro rss jako součet všech Shared_Clean
, Shared_Dirty
, Private_Clean
, Private_Dirty
záznam v /proc/$$/smaps.
Ale co PSS za celý proces? Jak tedy z výše uvedeného příkladu získám PSS za $$? Mohu jen přidat položku PSS pro každé mapování smap a dorazit na PSS za $$?
A co USS za celý proces? Znovu použiji výše uvedený příklad a hádám, že mohu dorazit na USS za $$ sečtením pouze položek Private_* pro každou položku smaps za $$..ne?
Poznámky:
PSS=Proporcionální velikost sady.
USS=Jedinečná velikost sady.
Přijatá odpověď:
Čisté stránky jsou stránky, které nebyly od namapování upraveny (obvykle se textové části ze sdílených knihoven pouze čtou z disku (je-li to nutné), nikdy se neupravují, takže budou na sdílených čistých stránkách).
Špinavé stránky jsou stránky, které nejsou čisté (tj. byly upraveny).
Soukromé stránky jsou dostupné pouze tomuto procesu, sdílené stránky jsou mapovány jinými procesy.
RSS je celkový počet stránek, sdílených nebo nesdílených, aktuálně mapovaných do procesu. Takže Shared_Clean
+ Shared_Dirty
by byla sdílená část RSS (tj. část RSS, která je také mapována do jiných procesů) a Private_Clean
+ Private_Dirty
privátní část RSS (tj. mapovaná pouze v tomto procesu).
PSS (proporcionální velikost podílu) je taková, jak popisujete. Soukromé stránky se sečtou tak, jak jsou, a velikost každého sdíleného mapování se vydělí počtem procesů, které je sdílejí.
Pokud tedy proces měl 100 000 soukromých stránek, 500 000 stránek sdílených s jedním dalším procesem a 500 000 sdílených se čtyřmi jiné procesy, PSS bude:
100k + (500k / 2) + (500k / 5) = 450k
Další čtení:
- ELC:Kolik paměti aplikace skutečně využívají?
Documentation/filesystems/proc.txt
ve zdrojovém kódu jádraman proc(5)
- Přehled správy paměti Linux
- Správa paměti na TLDP.org
- LinuxMM
Pokud jde o částky za celý proces:
-
RSS
lze (přibližně) získat sečtenímRss:
záznamy vsmaps
(nemusíte sčítat sdílené/soukromé sdílené/nečisté položky).awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
- Můžete shrnout
Pss:
hodnoty stejným způsobem, abyste získali process-globalPSS
. USS
není hlášeno vsmaps
, ale ve skutečnosti se jedná o součet soukromých mapování, takže jej můžete získat stejným způsobem
Upozorňujeme, že stránka „možná ke sdílení“ se počítá jako soukromé mapování, dokud není skutečně sdílené. tj. pokud existuje pouze jeden proces, který aktuálně používá libfoo
, textová část této knihovny se zobrazí v části soukromé procesu mapování. Bude zahrnuto ve sdílených mapováních (a odstraněno ze soukromých) pouze tehdy, když jiný proces začne tuto knihovnu používat.
Hodnoty se pro všechny procesy nesčítají přesně. Nevím přesně proč… omlouvám se.