Per un determinato processo in /proc/<pid>/smaps
, per una data voce di mappatura cosa sono:
- Pulizia_condivisa
- Condiviso_sporco
- Pulizia_privata
- Privato_Sporco
Shared_Clean
+ Shared_Dirty
la quantità di memoria condivisa con altri processi? Quindi è come un RSS condiviso?
Allo stesso modo è Private_Clean
+ Private_Dirty
la quantità di memoria disponibile per un solo processo ? Quindi è come un RSS privato?
Il valore PSS è =PrivateRSS + (SharedRSS / numero di processi che lo condividono)?
Altre domande dopo aver letto questo link:LWN
Ora parliamo del processo nel suo insieme, di cui stiamo esaminando la voce smaps.
Ho notato che se eseguo Shared_Clean
+ Shared_Dirty
+ Private_Clean
+ Private_Dirty
per ogni voce di smaps per il processo ottengo l'RSS del processo come
riportato da ps
, che è piuttosto interessante. Ad es.
ps -p $$ -o pid,rss
Mi darà lo stesso valore (approssimativamente) per rss della somma di ogni Shared_Clean
, Shared_Dirty
, Private_Clean
, Private_Dirty
voce in /proc/$$/smaps.
Ma che dire del PSS per l'intero processo? Quindi, dall'esempio sopra, come ottengo il PSS per $$? Posso semplicemente aggiungere la voce PSS per ogni mappatura smap e arrivare a PSS per $$?
E che dire della USS per l'intero processo? Riprendendo l'esempio sopra, immagino di poter arrivare alla USS per $$ sommando solo le voci Private_* per ogni voce di smaps per $$..giusto?
Note:
PSS=dimensione del set proporzionale.
USS=dimensione del set univoca.
Risposta accettata:
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 (se necessario), mai modificate, quindi saranno in pagine pulite e condivise).
Le pagine sporche sono pagine che non sono pulite (cioè 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_Dirty
sarebbe la parte condivisa dell'RSS (ovvero la parte dell'RSS che è anche mappata in altri processi) e Private_Clean
+ Private_Dirty
la parte privata dell'RSS (cioè mappata solo in questo processo).
PSS (dimensione proporzionale della condivisione) è come descrivi. Le pagine private sono riassunte così com'è e la dimensione di ciascuna mappatura condivisa è divisa per il numero di processi che la condividono. altri processi, il PSS sarebbe:
100k + (500k / 2) + (500k / 5) = 450k
Ulteriori letture:
- ELC:quanta memoria stanno effettivamente utilizzando le applicazioni?
Documentation/filesystems/proc.txt
nel sorgente del kernelman proc(5)
- Panoramica sulla gestione della memoria Linux
- Gestione della memoria su TLDP.org
- LinuxMM
Per quanto riguarda gli importi a livello di processo:
-
RSS
può essere (approssimativamente) ottenuto sommando ilRss:
voci insmaps
(non è necessario sommare le voci condivise/private condivise/sporche).awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
- Puoi riassumere
Pss:
valori allo stesso modo, per ottenerePSS
globale di processo . USS
non è segnalato insmaps
, ma in effetti è la somma delle mappature private, quindi puoi ottenerla anche tu allo stesso modo
Tieni presente che una pagina "condivisibile" viene conteggiata come mappatura privata finché non è effettivamente condivisa. cioè se c'è un solo processo che sta usando libfoo
, la sezione di testo di quella libreria apparirà nella sezione privata del processo mappature. Verrà contabilizzato nelle mappature condivise (e rimosso da quelle private) solo se/quando un altro processo inizierà a utilizzare quella libreria.
I valori non si sommano esattamente per tutti i processi. Non sono esattamente sicuro del perché... mi dispiace.