Ottenere informazioni sull'utilizzo della memoria di un processo da / proc / pid / smaps


46

Per un dato processo in /proc/<pid>/smaps, per una data voce di mappatura quali sono:

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

Shared_Clean+ È Shared_Dirtyla quantità di memoria condivisa con altri processi? Quindi è come un RSS condiviso?

Allo stesso modo è Private_Clean+ Private_Dirtyla quantità di memoria disponibile per un solo processo ? Quindi è come un RSS privato?

Il valore PSS è PrivateRSS + (SharedRSS / numero di processi che lo condividono)?

Qualche altra domanda dopo aver letto questo link: LWN

Ora parliamo del processo nel suo insieme, di cui stiamo esaminando la voce degli smaps.

Ho notato che se faccio Shared_Clean+ Shared_Dirty+ Private_Clean+ Private_Dirtyper ogni voce di smaps per il processo ottengo l'RSS del processo come riportato da ps, il che è abbastanza bello. Per es

ps -p $$ -o pid,rss

Mi darà la (circa) stesso valore per rss come la somma di tutti Shared_Clean, Shared_Dirty, Private_Clean, Private_Dirtyvoce in / proc / $$ / smaps.

Ma che dire di PSS per l'intero processo? Quindi, dall'esempio sopra come ottengo il PSS per $$? Posso semplicemente aggiungere la voce PSS per ogni mappatura smaps e arrivare a PSS per $$?

E che dire di USS per l'intero processo? Riprendendo l'esempio sopra, suppongo di poter arrivare all'USS per $$ sommando solo le voci Private_ * per ogni voce di smaps per $$ .. giusto?

Note:
PSS = Dimensione proporzionale impostata.
USS = Dimensioni del set univoche.

Risposte:


50

Le pagine pulite sono pagine che non sono state modificate da quando sono state mappate (in genere, le sezioni di testo delle librerie condivise vengono lette solo dal disco (quando necessario), mai modificate, quindi saranno in pagine pulite e condivise).
Le pagine sporche sono pagine non pulite (ovvero sono state modificate).

Le pagine private sono disponibili solo per quel processo, le pagine condivise sono mappate da altri processi * .

RSS è il numero totale di pagine, condivise o meno, attualmente mappate nel processo. Quindi Shared_Clean+ Shared_Dirtysarebbe la parte condivisa di RSS (cioè la parte di RSS che è anche mappata in altri processi) e Private_Clean+ Private_Dirtyla parte privata di RSS (cioè solo mappata in questo processo).

PSS (dimensione proporzionale della quota) è come descritto. Le pagine private vengono riassunte così come sono e le dimensioni di ciascuna mappatura condivisa sono divise per il numero di processi che la condividono.
Quindi se un processo avesse 100k pagine private, 500k pagine condivise con un altro processo e 500k condivise con altri quattro processi, il PSS sarebbe:

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

Ulteriori letture:

Per quanto riguarda le somme a livello di processo:

  • RSSpuò essere (approssimativamente + ) ottenuto sommando le Rss:voci in smaps(non è necessario sommare le voci condivise / private condivise / sporche).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Puoi riassumere i Pss:valori allo stesso modo, per ottenere un processo globale PSS.
  • USSnon è riportato in smaps, ma in effetti è la somma dei mapping privati, quindi puoi ottenerlo allo stesso modo

* Si noti che una pagina "in grado di condividere" viene conteggiata come una mappatura privata fino a quando non viene effettivamente condivisa. vale a dire se al momento è in uso un solo processo libfoo, la sezione di testo della libreria verrà visualizzata nelle mappature private del processo . Sarà contabilizzato nei mapping condivisi (e rimosso da quelli privati) solo se / quando un altro processo inizia a utilizzare quella libreria.
+ I valori non si sommano esattamente per tutti i processi. Non sono sicuro del perché ... scusa.


Grazie per la magnifica risposta. Apprezzalo. Ho letto l'articolo di LWM e questo mi ha ispirato a fare qualche altra domanda, quindi le ho aggiunte alla mia domanda sopra.
Ankur Agarwal

Grande! è molto molto utile !!
camino

Sono ancora confuso su shared_dirty - la natura sporca di questo impedisce che venga ancora condiviso?
Kevin,

@Kevin: se non fossero condivisi, non verrebbero presi in considerazione Shared_Dirty- potresti chiarire la tua domanda?
Mat,

sporco significa modificato dall'originale. processo, giusto? quale non è come va dalla condivisione all'essere locale?
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.