Para medir el tiempo total de CPU de un usuario, estoy usando el campo "utime" de /proc/[pid]/stat
:
utime %lu Amount of time that this process has been scheduled in user
mode, measured in clock ticks (divide by
sysconf(_SC_CLK_TCK). This includes guest time, guest_time
(time spent running a virtual CPU, see below), so that
applications that are not aware of the guest time field do
not lose that time from their calculations.
(de man proc (5) )
Entonces, mi "tiempo de usuario" es la suma utime
de todos los PID que este usuario está ejecutando.
Espero que esto me dé un valor preciso para la cantidad de segundos de CPU que este usuario ha gastado. ¿Estoy en el camino correcto?
Algunas de las cosas que aún no entiendo o que no tengo en cuenta:
- Cada PID también tiene un PID primario (o cero). Pero estoy contando cada PID, no solo los que tienen un ppid de 0. ¿Es esto correcto?
- Hay, además de utime, stime, cutime y cstime. ¿Debo preocuparme por eso? Supongo que utime es el número total de segundos de CPU para un PID, sin contar el padre.
Si calculo el tiempo de CPU total del sistema usando /proc/uptime
, este valor es bastante cercano a mi suma para todos los usuarios, pero la diferencia es significativa. Por ejemplo (en minutos):
system cpu_time: 96.13
sum of users_cputime: 111.45
Corrección:
Obtengo valores de "apariencia sensata" para todo tipo de cosas. En este momento estoy usando la suma de tiempo, tiempo, tiempo de corte y cstime. E informa valores que, aunque no los entiendo, se correlacionan muy bien con las mediciones de time
.
Si estoy completamente en el camino equivocado, hay otra pregunta:
- ¿Cuál es la forma más justa de monitorear el tiempo total de CPU por usuario? (+500 Bounty) en Ask Ubuntu
/proc/cputime
no tiene ninguna información sobre el tiempo que pasan las CPUs ejecutando procesos, por lo que estoy desconcertado sobre cuál es el cálculo de su "sistema cpu_time". Si está haciendo algo con el segundo número, es el tiempo que dedica la tarea inactiva ; No sé exactamente qué significa eso en la práctica./proc/uptime
? Entonces supongo que la E / S atribuida a la tarea inactiva explicaría la diferencia. No sé nada sobre el tema, por lo que sospecho que me estoy perdiendo algo importante: no esperaría que suceda tanto en la tarea inactiva, especialmente teniendo en cuenta que su suma de usuarios cputime probablemente falte mucho procesos vividosRespuestas:
La forma tradicional de registrar y rastrear el tiempo de CPU del usuario es la contabilidad de procesos . En Linux, instale las utilidades de contabilidad de GNU , generalmente proporcionadas por un paquete llamado
acct
. No estoy seguro de cuán preciso será para hacer un seguimiento del tiempo empleado en procesos de muy corta duración, pero al menos enumerará todos los procesos ejecutados.Ejecútelo
lastcomm
para obtener una lista de todos los comandos ejecutados por cualquier usuario y el tiempo empleado en cada uno (redondeado a ~ 10 ms para procesos de corta duración, espere ver muchos0.00
). Ejecutarsa
para mostrar varias sumas y estadísticas. En particular,sa -m
muestra los totales por usuario. Las estadísticas acumuladas por lasa
ejecución desde la última rotación de los registros de contabilidad (generalmente ubicados en/var/log/account/
).Tenga en cuenta que no capturará todos los procesos muestreando a intervalos, no muy lejos. Te perderás casi todos los procesos de corta duración y los últimos segundos de procesos largos. La contabilidad de procesos enumera todos los procesos pasados.
En
/proc/$pid/stat
, el tiempo del usuario es el tiempo dedicado a la computación, en oposición al tiempo del sistema dedicado a realizar E / S. Cuál contar depende de lo que quieras hacer con la información.Contar todos los PID es correcto. No sé qué tiene que ver el PID de los padres con esto.
En el lado del sistema, su descripción de
/proc/uptime
parece incorrecta. Wikipedia tiene razón mientras escribo. El primer campo es el tiempo real transcurrido desde que se inició el sistema, menos el tiempo que pasó suspendido o hibernando. El segundo campo es el tiempo acumulado empleado en la tarea inactiva en todas las CPU. No estoy seguro de lo que eso realmente significa; ciertamente no es el tiempo de inactividad total en mi máquina. En el núcleo, el valor se suma auptime_proc_show
partir de variables actualizadas enaccount_idle_time
.fuente
sa
Espera a que el proceso se cierre antes de informar que es hora de la CPU?