¿Es la suma de todos los PID "utime" el tiempo total del sistema?

9

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 utimede 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:

Stefano Palazzo
fuente
/proc/cputimeno 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.
Gilles parada SO ser maligno '
1
Su "tiempo de usuario" también tendría que agregar los valores de tiempo de todos los procesos muertos. ¿Cómo los tomas en cuenta?
Gilles 'SO- deja de ser malvado'
Mhh Lo que llamo "tiempo de CPU del sistema" es simplemente el primer valor de / proc / uptime, "segundos del sistema". Pensé que esto era demasiado alto, ya que también cuenta los hilos del kernel, pero como puede ver, la suma de todos los valores de "utime" sigue siendo más alta que la hora del sistema desde / proc / utime. Su enlace, por lo que puedo decir, explica por qué. Aunque para ser claros: no estoy interesado en ese número realmente. Estoy interesado en el "tiempo de CPU por usuario".
Stefano Palazzo
En cuanto al segundo comentario: por el momento, estaba planeando medir esto periódicamente (digamos cada segundo), lo que ignoraría los procesos de corta duración.
Stefano Palazzo
¿Entonces el cálculo del tiempo de CPU de su sistema es ($ 1- $ 2 / $ number_of_cups) de donde son los valores $ 1 y $ 2 /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 vividos
Gilles 'SO- deja de ser malvado'

Respuestas:

3

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 lastcommpara 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 muchos 0.00). Ejecutar sapara mostrar varias sumas y estadísticas. En particular, sa -mmuestra los totales por usuario. Las estadísticas acumuladas por la saejecució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/uptimeparece 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 .

Gilles 'SO- deja de ser malvado'
fuente
¿Qué pasa con los procesos de ejecución muy larga? ¿ saEspera a que el proceso se cierre antes de informar que es hora de la CPU?
Stefano Palazzo
@StefanoPalazzo Sí, los datos contables se escriben cuando un proceso muere. Eso también significa que no se obtienen datos de los procesos que se estaban ejecutando después de un bloqueo del sistema, que yo sepa.
Gilles 'SO- deja de ser malvado'
Eso es un problema, significa que no puedo usarlo, ya que tendremos muchos procesos de larga duración.
Stefano Palazzo