GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿Obtener información sobre el uso de memoria de un proceso de /proc/pid/smaps?

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

  1. Limpieza_compartida
  2. Compartido_sucio
  3. Limpieza_privada
  4. 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 kernel
  • man proc(5)
  • Descripción general de la administración de memoria de Linux
  • Administración de memoria en TLDP.org
  • LinuxMM
Relacionado:Linux:¿el indicador de montaje noauto para?

Con respecto a las sumas de todo el proceso:

  • RSS se puede obtener (aproximadamente) sumando Rss: entradas en smaps (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 obtener PSS global de proceso .
  • USS no se informa en smaps , 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.


Linux
  1. Linux:¿limitar el uso de memoria para un solo proceso de Linux?

  2. Linux:¿cómo leer desde /proc/$pid/mem en Linux?

  3. Linux:¿cambiar /proc/pid/environ después del inicio del proceso?

  4. Linux – ¿Vincular /proc/mnt a /proc/mounts?

  5. Linux:¿cómo probar si un dispositivo de bloque es de solo lectura desde/sys o/proc?

¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

Una guía para el sistema de archivos '/proc' en Linux

Archivos /proc/cpuinfo y /proc/meminfo en Linux

¿Cómo obtengo la ruta de un proceso en Unix/Linux?

¿Cómo calcular el uso de CPU de un proceso por PID en Linux desde C?

¿Cómo obtengo el uso total de CPU de una aplicación de /proc/pid/stat?