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.txten 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:
-
RSSse 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 obtenerPSSglobal de proceso . USSno 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.