it-swarm-eu.dev

Získání informací o využití paměti procesu z / proc / pid / smaps

Pro daný proces v /proc/<pid>/smaps pro danou položku mapování:

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. Private_Dirty

Je Shared_Clean + Shared_Dirty množství paměti, která je sdílena s jinými procesy? Je to jako sdílený RSS?

Podobně je Private_Clean + Private_Dirty množství paměti, které je k dispozici pouze pro jeden proces ? 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í můžeme hovořit o procesu jako o celku, jehož smaps vstupu se díváme.

Všiml jsem si, že pokud ano Shared_Clean + Shared_Dirty + Private_Clean + Private_Dirty pro každou položku smaps pro tento proces dostávám RSS procesu podle hlášení ps, což je docela v pohodě. 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 položka v/proc/$$/smaps.

Ale co PSS pro celý proces? Takže z výše uvedeného příkladu, jak získám PSS za $$? Mohu přidat položku PSS pro každé mapování smaps a dorazit na PSS za $$?

A co USS pro celý proces? Znovu vezmu příklad uvedený výše a hádám, že mohu dospět na USS pro $$ tím, že shrnuji pouze položky Private_ * pro každou položku smaps pro $$ .. že jo?

Poznámky:
PSS = Proporční velikost sady.
USS = Unikátní velikost sady.

48
Ankur Agarwal

Čisté stránky jsou stránky, které se od mapování nezměnily (textové sekce ze sdílených knihoven se obvykle čtou pouze 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 k dispozici pouze pro tento proces, sdílené stránky jsou mapovány jinými procesy*.

RSS je celkový počet stránek, sdílených nebo ne sdí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 soukromá část RSS (tj. mapována pouze v tomto procesu).

PSS (poměrná velikost sdílené složky) je, jak jste popsali. Soukromé stránky se sčítají tak, jak jsou, a velikost každého sdíleného mapování se dělí počtem procesů, které je sdílejí.
Takže pokud měl proces 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 dalšími procesy, PSS by byla:

100k + (500k / 2) + (500k / 5) = 450k

Další údaje:

Pokud jde o částky za celý proces:

  • RSS může být (přibližně+) získané součtem položek Rss: v smaps (nemusíte sčítat sdílené/soukromé sdílené/špinavé položky).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Hodnoty Pss: Můžete sčítat stejným způsobem, abyste získali globální proces PSS.
  • USS není hlášeno v smaps, ale ve skutečnosti jde o součet soukromých mapování, takže je můžete získat stejným způsobem

*Upozorňujeme, že stránka „sdílená s možností sdílení“ se počítá jako soukromé mapování, dokud není skutečně sdílena. tj. pokud v současné době existuje pouze jeden proces používající libfoo, textová část knihovny se objeví v soukromých mapování procesu. Ve sdílených mapováních (a odstraněných ze soukromých) bude účtována pouze v případě, že/když jiný proces začne používat tuto knihovnu.
+Hodnoty se nesčítají přesně pro všechny procesy. Není si úplně jistý, proč ... promiňte.

51
Mat