Quiero calcular programáticamente [en C] el% de uso de CPU para un ID de proceso dado en Linux.
¿Cómo podemos obtener el% de uso de CPU en tiempo real para un proceso determinado?
Para dejarlo más claro:
- Debería poder determinar el uso de la CPU para el proceso o id de proceso proporcionado.
- El proceso no tiene por qué ser el proceso hijo.
- Quiero la solución en lenguaje 'C'.
Respuestas:
Necesita analizar los datos de
/proc/<PID>/stat
. Estos son los primeros campos (deDocumentation/filesystems/proc.txt
la fuente del kernel):Probablemente estés buscando
utime
y / ostime
. También necesitará leer lacpu
línea de/proc/stat
, que se ve así:Esto le indica el tiempo de CPU acumulado que se ha utilizado en varias categorías, en unidades de jiffies. Debe tomar la suma de los valores en esta línea para obtener una
time_total
medida.Leer tanto
utime
ystime
para el proceso que le interesa, y leertime_total
a partir/proc/stat
. Luego duerme un segundo más o menos y vuelve a leerlos todos. Ahora puede calcular el uso de CPU del proceso durante el tiempo de muestreo, con:¿Tener sentido?
fuente
/proc/stat
le dice cuántos jiffies ha ejecutado la CPU en total, y/proc/<PID>/stat
le dice cuántos jiffies ha ejecutado un proceso único.man proc
is your friend (search for/proc/[pid]/stat
)/proc
pseudo sistema de archivos: la enseñanza de las funciones de acceso al sistema de archivos C estándar comofopen()
y noscanf()
viene al caso.getrusage () puede ayudarlo a determinar el uso del proceso actual o su hijo
Actualización: no recuerdo una API. Pero todos los detalles estarán en / proc / PID / stat, así que si pudiéramos analizarlo, obtendríamos el porcentaje.
EDITAR: Dado que el porcentaje de CPU no es sencillo de calcular, puede usar el tipo de muestreo aquí. Lea ctime y utime para un PID en un momento determinado y vuelva a leer los mismos valores después de 1 segundo. Encuentra la diferencia y divide por cien. Obtendrá la utilización de ese proceso durante más de un segundo.
(puede volverse más complejo si hay muchos procesadores)
fuente
Paso a paso fácil para principiantes como yo:
/proc/stat
para obtenertotal_cpu_usage1
./proc/pid/stat
dóndepid
está el PID del proceso en el que desea conocer el uso de la CPU, así:usertime
ysystemtime
e getproc_times1
total_cpu_usage2
yproc_times2
La formula es:
Puede obtener la cantidad de CPU de
/proc/cpuinfo
.fuente
#include <unistd.h>
y llamar a este métodoint nb = sysconf(_SC_NPROCESSORS_ONLN);
Escribí dos pequeñas funciones de C basadas en la respuesta de cafs para calcular el uso de la CPU de usuario + kernel de un proceso: https://github.com/fho/code_snippets/blob/master/c/getusage.c
fuente
Puede leer la página de manual de proc para obtener más detalles, pero en resumen puede leer / proc / [número] / stat para obtener la información sobre un proceso. Esto también lo usa el comando 'ps'.
Todos los campos y sus especificadores de formato scanf están documentados en proc manpag e.
A continuación, se muestra parte de la información de la página de manual copiada (es bastante larga):
fuente
ps aux
es mejor :)Eche un vistazo al comando "pidstat", parece exactamente lo que necesita.
fuente
Esta es mi solución ...
fuente
Cuando desee supervisar un proceso específico, normalmente se realiza mediante secuencias de comandos. Aquí está un ejemplo de Perl. Esto coloca los porcentajes de la misma manera que top, escalando a una CPU. Luego, cuando algún proceso está activo trabajando con 2 subprocesos, el uso de la CPU puede ser superior al 100%. Mire especialmente cómo se cuentan los núcleos de la CPU: D luego déjeme mostrar mi ejemplo:
Espero que te ayude en cualquier seguimiento. Por supuesto, debería usar scanf u otras funciones de C para convertir cualquier expresión regular de Perl que haya usado en fuente C. Por supuesto, 1 segundo para dormir no es obligatorio. se puede utilizar en cualquier momento. El efecto es que obtendrá una carga promedio en un período de tiempo especificado. Cuando lo usará para monitorear, por supuesto, los últimos valores deben poner afuera. Es necesario, porque la supervisión suele llamar a los scripts periódicamente, y el script debería terminar su trabajo lo antes posible.
fuente
Instalar
psacct
oacct
empaquetar. Luego use elsa
comando para mostrar el tiempo de CPU usado para varios comandos. una página de manualUn buen howto desde el sitio nixCraft.
fuente
Creo que vale la pena mirar el código fuente del comando "time" de GNU. tiempo Muestra el tiempo de la CPU del sistema / usuario junto con el tiempo real transcurrido. Llama a la llamada al sistema wait3 / wait4 (si está disponible) y, de lo contrario, llama a la llamada al sistema de tiempos. esperar * la llamada al sistema devuelve una variable de estructura "rusage" y las veces que la llamada al sistema devuelve "tms". Además, puede echar un vistazo a la llamada al sistema getrusage que también devuelve información de tiempo muy interesante. hora
fuente
En lugar de analizar esto desde proc, se pueden usar funciones como getrusage () o clock_gettime () y calcular el uso de la CPU como una relación o el tiempo del reloj de pared y el tiempo del proceso / subproceso utilizado en la CPU.
fuente
Use strace encontró que el uso de la CPU debe calcularse por un período de tiempo:
fuente