¿Cómo calcular el uso de CPU de un proceso por PID en Linux desde C?
Quiero calcular mediante programación [en C] el porcentaje de uso de CPU para un ID de proceso determinado en Linux.
¿Cómo podemos obtener el porcentaje de uso de CPU en tiempo real para un proceso determinado?
Para dejarlo más claro:
- Debería poder determinar el uso de CPU para el proceso o proceso proporcionado.
- El proceso no tiene por qué ser el proceso hijo.
- Quiero la solución en lenguaje 'C'.
Necesita analizar los datos de /proc/<PID>/stat
. Estos son los primeros campos (de Documentation/filesystems/proc.txt
la fuente de su kernel):
Table 1-3: Contents of the stat files (as of 2.6.22-rc3)
..............................................................................
Field Content
pid process id
tcomm filename of the executable
state state (R is running, S is sleeping, D is sleeping in an
uninterruptible wait, Z is zombie, T is traced or stopped)
ppid process id of the parent process
pgrp pgrp of the process
sid session id
tty_nr tty the process uses
tty_pgrp pgrp of the tty
flags task flags
min_flt number of minor faults
cmin_flt number of minor faults with child's
maj_flt number of major faults
cmaj_flt number of major faults with child's
utime user mode jiffies
stime kernel mode jiffies
cutime user mode jiffies with child's
cstime kernel mode jiffies with child's
Probablemente estés buscando utime
y/o stime
. También necesitarás leer la cpu
línea de /proc/stat
, que luce así:
cpu 192369 7119 480152 122044337 14142 9937 26747 0 0
Esto le indica el tiempo de CPU acumulado que se ha utilizado en varias categorías, en unidades de jiffies. Debes tomar la suma de los valores en esta línea para obtener una time_total
medida.
Lea ambos utime
y stime
para el proceso que le interesa y lea time_total
desde /proc/stat
. Luego duerme aproximadamente un segundo y léelos todos nuevamente. Ahora puede calcular el uso de CPU del proceso durante el tiempo de muestreo, con:
user_util = 100 * (utime_after - utime_before) / (time_total_after - time_total_before);
sys_util = 100 * (stime_after - stime_before) / (time_total_after - time_total_before);
¿Tener sentido?
getrusage() puede ayudarle 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, por lo que si pudiéramos analizarlos, podemos obtener el porcentaje.
EDITAR: Dado que el porcentaje de CPU no es sencillo de calcular, aquí podría utilizar elementos de muestreo. Lea ctime y utime para un PID en un momento dado y lea los mismos valores nuevamente después de 1 segundo. Encuentra la diferencia y divide por cien. Obtendrá utilización para ese proceso durante más de un segundo.
(podría volverse más complejo si hay muchos procesadores)
Paso a paso sencillo para principiantes como yo:
- Lea la primera línea de
/proc/stat
para obtenertotal_cpu_usage1
.
sscanf(line,"%*s %llu %llu %llu %llu",&user,&nice,&system,&idle);
total_cpu_usage1 = user + nice + system + idle;
- Lea
/proc/pid/stat
dóndepid
está el PID del proceso del que desea conocer el uso de la CPU, así:
sscanf(line,
"%*d %*s %*c %*d" //pid,command,state,ppid
"%*d %*d %*d %*d %*u %*lu %*lu %*lu %*lu"
"%lu %lu" //usertime,systemtime
"%*ld %*ld %*ld %*ld %*ld %*ld %*llu"
"%*lu", //virtual memory size in bytes
....)
- Ahora suma
usertime
ysystemtime
y obténproc_times1
- Ahora espera 1 segundo o más.
- Hazlo de nuevo y obtén
total_cpu_usage2
yproc_times2
La fórmula es:
(number of processors) * (proc_times2 - proc_times1) * 100 / (float) (total_cpu_usage2 - total_cpu_usage1)
Puede obtener la cantidad de CPU de /proc/cpuinfo
.
Escribí dos pequeñas funciones C basadas en la respuesta de cafs para calcular el uso de la CPU del usuario + kernel de un proceso: https://github.com/fho/code_snippets/blob/master/c/getusage.c