GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:ottenere informazioni sull'utilizzo della memoria di un processo da /proc/pid/smaps?

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

  1. Pulizia_condivisa
  2. Condiviso_sporco
  3. Pulizia_privata
  4. 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 kernel
  • man proc(5)
  • Panoramica sulla gestione della memoria Linux
  • Gestione della memoria su TLDP.org
  • LinuxMM
Correlati:Linux:il flag di montaggio noauto per?

Per quanto riguarda gli importi a livello di processo:

  • RSS può essere (approssimativamente) ottenuto sommando il Rss: voci in smaps (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 ottenere PSS globale di processo .
  • USS non è segnalato in smaps , 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.


Linux
  1. Picco di utilizzo della memoria di un processo Linux/Unix

  2. /proc/[pid]/pagemaps e /proc/[pid]/maps | Linux

  3. Nome del processo dal suo pid in Linux

  4. Come scoprire da quale cartella è in esecuzione un processo?

  5. Limita l'utilizzo della memoria per un singolo processo Linux

Una guida al file system '/proc' in Linux

/proc/cpuinfo e /proc/meminfo in Linux

Come posso ottenere l'utilizzo totale della CPU di un'applicazione da /proc/pid/stat?

Come posso leggere da /proc/$pid/mem sotto Linux?

Come viene riportato l'utilizzo della memoria in Linux?

Utilizzo della memoria del processo grafico su Linux