Obtener información sobre el uso de memoria de un proceso de / proc / pid / smaps

46

Para un proceso dado en /proc/<pid>/smaps, para una entrada de mapeo dada, cuáles son:

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

¿Es Shared_Clean+ Shared_Dirtyla cantidad de memoria que se comparte con otros procesos? Entonces, ¿es como RSS compartido?

De manera similar, ¿es Private_Clean+ Private_Dirtyla cantidad de memoria disponible para un solo proceso ? Entonces, ¿es como RSS privado?

¿Es el valor PSS = 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.

Me di cuenta de que si hago Shared_Clean+ Shared_Dirty+ Private_Clean+ Private_Dirtypara cada entrada de smaps para el proceso, obtengo el RSS del proceso según lo informado ps, lo cual es bastante bueno. Por ej.

ps -p $$ -o pid,rss

Me dará la (aprox) mismo valor para RSS como la suma de todos Shared_Clean, Shared_Dirty, Private_Clean, Private_Dirtyentrada en / proc / $$ / smaps.

Pero, ¿qué pasa con PSS para todo el proceso? Entonces, en el ejemplo anterior, ¿cómo obtengo el PSS para $$? ¿Puedo agregar la entrada de PSS para cada mapeo de smaps y llegar a PSS por $$?

¿Y qué hay de USS para todo el proceso? Una vez más, tomando el ejemplo anterior, supongo que puedo llegar al USS para $$ sumando solo las entradas Private_ * para cada entrada de smaps para $$ .. ¿verdad?

Notas:
PSS = Tamaño de conjunto proporcional.
USS = Tamaño de conjunto único.

Ankur Agarwal
fuente

Respuestas:

50

Las páginas limpias son páginas que no se han modificado desde que se asignaron (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 y compartidas).
Las páginas sucias son páginas que no están limpias (es decir, que se han modificado).

Las páginas privadas están disponibles solo para ese proceso, las páginas compartidas son mapeadas por otros procesos * .

RSS es el número total de páginas, compartidas o no, actualmente asignadas al proceso. Por lo tanto, Shared_Clean+ Shared_Dirtysería la parte compartida de RSS (es decir, la parte de RSS que también se asigna a otros procesos), y Private_Clean+ Private_Dirtyla parte privada de RSS (es decir, solo se asigna a este proceso).

PSS (tamaño compartido proporcional) es como usted describe. Las páginas privadas se resumen como están, y el tamaño de cada mapeo compartido se divide por el número de procesos que lo comparten.
Entonces, si un proceso tuviera 100k páginas privadas, 500k páginas compartidas con otro proceso y 500k compartidas con otros cuatro procesos, el PSS sería:

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

Lecturas adicionales:

Con respecto a las sumas de todo el proceso:

  • RSSse puede obtener (aproximadamente + ) sumando las Rss:entradas en smaps(no es necesario sumar las entradas compartidas / privadas compartidas / sucias).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Puede resumir Pss:valores de la misma manera, para obtener procesos globales PSS.
  • USSno se informa smaps, pero de hecho, es la suma de las asignaciones privadas, por lo que también puede obtenerlo de la misma manera

* Tenga en cuenta que una página "compartible" se cuenta como una asignación privada hasta que se comparta realmente . es decir, si solo hay un proceso actualmente en uso libfoo, la sección de texto de esa biblioteca aparecerá en las asignaciones privadas del proceso . Se contabilizará en las asignaciones compartidas (y se eliminará de las privadas) solo si / cuando otro proceso comienza a usar esa biblioteca.
+ Los valores no se suman exactamente para todos los procesos. No estoy seguro de por qué ... lo siento.

Estera
fuente
Gracias por la gran respuesta. Lo aprecio. Leí el artículo de LWM y eso me inspiró a hacer algunas preguntas más, así que las agregué a mi pregunta anterior.
Ankur Agarwal
¡Excelente! es muy muy útil !!
camino
Todavía estoy confundido acerca de shared_dirty: ¿la naturaleza sucia de esto impide que aún se comparta?
Kevin
@Kevin: si no se compartieran, no se tendrían en cuenta Shared_Dirty, ¿podría aclarar su pregunta?
Mat
sucio significa modificado desde el origen. proceso, ¿verdad? ¿cuál no es así como pasa de ser compartido a ser local?
Kevin