En un sistema multiusuario, quiero medir el uso de CPU de cada usuario en segundos de tiempo de CPU. Para el propósito de esta medición, supongo que si un PID pertenece a un usuario, este usuario está causando el tiempo de CPU, es decir, estoy ignorando los demonios y el núcleo.
Actualmente estoy haciendo esto, cada cinco segundos:
- Obtenga cada usuario y los PID que están ejecutando a través de
ps aux
- Para cada PID, obtenga
x
la suma de tiempo, tiempo de corte, tiempo y cstime de/proc/[pid]/stat
- calcular
t = x / interval
(el intervalo no siempre es exactamente 5 segundos cuando hay mucha carga)
Si ejecuto esto, obtengo valores razonables. Por ejemplo: un usuario en este sistema estaba girando en python ( while True: pass
), y el sistema mostraba alrededor de 750 milisegundos de tiempo de CPU por segundo. Cuando el sistema se colgó por un momento, reportó 1600 ms para un inverval de 1 segundo. Lo que parece correcto, pero entiendo que estos valores pueden ser engañosos, especialmente dado que realmente no los entiendo.
Así que mi pregunta es esta:
¿Cuál es una forma justa y correcta de medir la carga de la CPU por usuario?
El método tiene que ser bastante preciso. Puede haber muchos cientos de usuarios en este sistema, por lo que extraer porcentajes ps aux
no será lo suficientemente preciso, especialmente para los hilos de corta duración que muchas piezas de software les gusta generar.
Si bien esto puede ser complicado, sé absolutamente que es posible. Este fue mi punto de partida:
El núcleo realiza un seguimiento del tiempo de creación de procesos y del tiempo de CPU que consume durante su vida útil. Cada vez que se marca el reloj, el kernel actualiza la cantidad de tiempo en segundos que el proceso actual ha pasado en el sistema y en el modo de usuario. - (del Proyecto de documentación de Linux )
El valor que busco es la cantidad de segundos (o segundos) que un usuario ha gastado en la CPU, no un porcentaje de la carga del sistema o el uso de la CPU.
Es importante medir el tiempo de CPU mientras los procesos aún se están ejecutando. Algunos procesos solo durarán medio segundo, algunos durarán muchos meses, y necesitamos capturar ambos tipos, para que podamos dar cuenta del tiempo de CPU de los usuarios con granularidad fina.
top
puede hacer el modo por lotes? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
debería mostrar la carga para {usuario} en ese momento.