Para un proceso dado en /proc/<pid>/smaps
, para una entrada de mapeo dada, cuáles son:
- Limpieza_compartida
- Compartido_sucio
- Limpieza_privada
- Privado_sucio
Es Shared_Clean
+ Shared_Dirty
la cantidad de memoria que se comparte con otros procesos? Entonces, ¿es como un RSS compartido?
Del mismo modo es Private_Clean
+ Private_Dirty
la cantidad de memoria que está disponible para un solo proceso ? Entonces, ¿es como un RSS privado?
¿El valor de PSS es =PrivateRSS + (SharedRSS / número de procesos que lo comparten)?
Algunas preguntas más después de leer este enlace:LWN
Ahora hablemos sobre el proceso en su conjunto, cuya entrada de smaps estamos viendo.
Noté que si hago Shared_Clean
+ Shared_Dirty
+ Private_Clean
+ Private_Dirty
por cada entrada de smaps para el proceso obtengo el RSS del proceso como
informado por ps
, lo cual es genial. Por ejemplo,
ps -p $$ -o pid,rss
Me dará el mismo valor (aproximado) para rss como la suma de cada Shared_Clean
, Shared_Dirty
, Private_Clean
, Private_Dirty
entrada en /proc/$$/smaps.
Pero ¿qué pasa con PSS para todo el proceso? Entonces, del ejemplo anterior, ¿cómo obtengo el PSS por $$? ¿Puedo simplemente agregar la entrada de PSS para cada mapeo de smaps y llegar a PSS por $$?
¿Y el USS? para todo el proceso? Nuevamente, tomando el ejemplo anterior, supongo que puedo llegar al USS por $$ sumando solo las entradas Private_* para cada entrada de smaps por $$... ¿verdad?
Notas:
PSS=Tamaño de conjunto proporcional.
USS=Tamaño de conjunto único.
Respuesta aceptada:
Las páginas limpias son páginas que no se han modificado desde que se mapearon (por lo general, las secciones de texto de las bibliotecas compartidas solo se leen desde el disco (cuando es necesario), nunca se modifican, por lo que estarán en páginas limpias compartidas).
Las páginas sucias son páginas que no están limpias (es decir, han sido modificadas).
Las páginas privadas están disponibles solo para ese proceso, las páginas compartidas están asignadas por otros procesos.
RSS es el número total de páginas, compartidas o no, asignadas actualmente al proceso. Así que Shared_Clean
+ Shared_Dirty
sería la parte compartida del RSS (es decir, la parte del RSS que también está asignada a otros procesos), y Private_Clean
+ Private_Dirty
la parte privada de RSS (es decir, solo asignada en este proceso).
PSS (tamaño de participación proporcional) es como usted describe. Las páginas privadas se resumen tal cual, y el tamaño de cada asignación compartida se divide por la cantidad de procesos que la comparten.
Entonces, si un proceso tiene 100 000 páginas privadas, 500 000 páginas compartidas con otro proceso y 500 000 compartidas con cuatro otros procesos, el PSS sería:
100k + (500k / 2) + (500k / 5) = 450k
Otras lecturas:
- ELC:¿Cuánta memoria utilizan realmente las aplicaciones?
Documentation/filesystems/proc.txt
en la fuente del kernelman proc(5)
- Descripción general de la administración de memoria de Linux
- Administración de memoria en TLDP.org
- LinuxMM
Con respecto a las sumas de todo el proceso:
-
RSS
se puede obtener (aproximadamente) sumandoRss:
entradas ensmaps
(no necesita sumar las entradas compartidas/privadas compartidas/sucias).awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
- Puedes resumir
Pss:
valores de la misma manera, para obtenerPSS
global de proceso . USS
no se informa ensmaps
, pero de hecho, es la suma de asignaciones privadas, por lo que también puede obtenerlo de la misma manera
Tenga en cuenta que una página "compartible" se cuenta como un mapeo privado hasta que realmente compartido. es decir, si solo hay un proceso actualmente usando libfoo
, la sección de texto de esa biblioteca aparecerá en el privado del proceso mapeos. Se contabilizará en las asignaciones compartidas (y se eliminará de las privadas) solo si otro proceso comienza a usar esa biblioteca.
Los valores no suman exactamente para todos los procesos. No estoy exactamente seguro de por qué... lo siento.