¿Cómo calcular el uso de CPU de un proceso por PID en Linux desde C?

Resuelto codingfreak asked hace 15 años • 13 respuestas

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'.
codingfreak avatar Sep 14 '09 15:09 codingfreak
Aceptado

Necesita analizar los datos de /proc/<PID>/stat. Estos son los primeros campos (de Documentation/filesystems/proc.txtla 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 utimey/o stime. También necesitarás leer la cpulí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_totalmedida.

Lea ambos utimey stimepara el proceso que le interesa y lea time_totaldesde /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?

caf avatar Sep 15 '2009 00:09 caf

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)

vpram86 avatar Sep 14 '2009 09:09 vpram86

Paso a paso sencillo para principiantes como yo:

  1. Lea la primera línea de /proc/statpara obtener total_cpu_usage1.
    sscanf(line,"%*s %llu %llu %llu %llu",&user,&nice,&system,&idle);
    total_cpu_usage1 = user + nice + system + idle;
  1. Lea /proc/pid/statdónde pidestá 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
    ....)
  1. Ahora suma usertimey systemtimey obténproc_times1
  2. Ahora espera 1 segundo o más.
  3. Hazlo de nuevo y obtén total_cpu_usage2yproc_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.

zizzu avatar Sep 26 '2012 14:09 zizzu

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

fho avatar Dec 10 '2010 15:12 fho