
Estoy ejecutando algunos programas en *nix dentro de un contenedor y estoy intentando calcular de cerca la cantidad de RAM que está usando mi proceso. Tengo entendido que esta información debe estar en /proc/#{pid}/smaps
. Intenté sumar todos los PSS de todos smaps
los archivos en un sistema usando este script Ruby:https://gist.github.com/schneems/10025798
Sin embargo, veo que el uso de memoria se informa como inferior al que informa mi contenedor. Si cambio al uso de RSS, entonces el valor se vuelve mucho más alto (muy por encima de lo que informa mi contenedor). Estoy bastante seguro de que toda la información que necesito está disponible en formato /proc
, pero no sé cómo se informa para obtener una medición precisa. Mi pregunta es la siguiente: ¿qué valores smaps
debería sumar ya que el PSS por sí solo no es un buen indicador? ¿Existe una forma mejor o más precisa de obtener esta información desde una máquina Linux?
Respuesta1
RSS es el tamaño del conjunto residente, en otras palabras, la memoria global utilizada por un proceso, incluida cada biblioteca cargada en tiempo de ejecución. Una sola biblioteca se puede usar varias veces (piense en las bifurcaciones de procesos de Apache, por ejemplo, cada subproceso puede usar las mismas bibliotecas). Según el modelo de Memoria Virtual, cada proceso considera que esta memoria la utiliza él mismo. En realidad, el kernel asigna las direcciones de memoria virtual a la dirección de memoria única de la biblioteca.
Por otro lado, PSS suma cada USS (tamaño de conjunto no compartido) de un proceso. Piense en ello como la memoria que un proceso liberaría inmediatamente si lo matamos. No tiene en cuenta la memoria compartida, sino solo la memoria que el proceso puede utilizar de forma exclusiva.
Como consecuencia, el valor de RSS sobreestima la memoria efectiva utilizada. El PSS es más preciso si se asegura de tener en cuenta el tamaño de la memoria de las bibliotecas cargadas.
Más detallesaquí, especialmente en el último párrafo.