Encontré que pidstat
sería una buena herramienta para monitorear procesos. Quiero calcular el uso promedio de memoria de un proceso en particular. Aquí hay una salida de ejemplo:
02:34:36 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:34:37 PM 7276 2.00 0.00 349212 210176 7.14 scalpel
(Esto es parte de la salida de pidstat -r -p 7276
.)
¿Debo usar la información de tamaño del conjunto residente (RSS) o tamaño virtual (VSZ) para calcular el consumo promedio de memoria? He leído algunas cosas en Wikipedia y en foros, pero no estoy seguro de entender completamente las diferencias. Además, parece que ninguno de ellos es confiable. Entonces, ¿cómo puedo monitorear un proceso para obtener su uso de memoria?
Cualquier ayuda sobre este asunto sería útil.
Respuesta aceptada:
RSS es la cantidad de memoria que este proceso tiene actualmente en la memoria principal (RAM). VSZ es la cantidad de memoria virtual que tiene el proceso en total. Esto incluye todos los tipos de memoria, tanto en RAM como intercambiada. Estos números pueden distorsionarse porque también incluyen bibliotecas compartidas y otros tipos de memoria. Puede tener quinientas instancias de bash
ejecutándose, y el tamaño total de su huella de memoria no será la suma de sus valores RSS o VSZ.
Si necesita obtener una idea más detallada sobre la huella de memoria de un proceso, tiene algunas opciones. Puede pasar por /proc/$PID/map
y elimina las cosas que no te gustan. Si se trata de bibliotecas compartidas, el cálculo podría volverse complejo dependiendo de sus necesidades (que creo recordar).
Si solo le importa el tamaño del montón del proceso, siempre puede analizar el [heap]
entrada en el map
expediente. El tamaño que el kernel ha asignado para el montón del proceso puede o no reflejar la cantidad exacta de bytes que el proceso pidió. para ser asignado. Hay detalles minuciosos, elementos internos del kernel y optimizaciones que pueden descartar esto. En un mundo ideal, será tanto como necesite su proceso, redondeado al múltiplo más cercano del tamaño de la página del sistema (getconf PAGESIZE
le dirá cuál es:en las PC, probablemente sean 4096 bytes).
Si desea ver cuánta memoria ha asignado un proceso , una de las mejores formas es renunciar a las métricas del lado del kernel. En su lugar, instrumenta las funciones de asignación (des)asignación de memoria de almacenamiento dinámico de la biblioteca C con LD_PRELOAD
mecanismo. Personalmente, abuso un poco de valgrind
para obtener información sobre este tipo de cosas. (Tenga en cuenta que la aplicación de la instrumentación requerirá reiniciar el proceso).
Tenga en cuenta que, dado que también puede realizar evaluaciones comparativas de los tiempos de ejecución, valgrind
hará que sus programas sean un poco más lentos (pero probablemente dentro de sus tolerancias).