Saltar al contenido

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

Solución:

Necesita analizar los datos de /proc/<PID>/stat. Estos son los primeros campos (de Documentation/filesystems/proc.txt en su fuente del 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 estas tras utime y / o stime. También necesitará leer el cpu línea de /proc/stat, que se parece a:

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. Necesita tomar la suma de los valores en esta línea para obtener un time_total la medida.

Leer ambos utime y stime para el proceso que le interesa y lea time_total de /proc/stat. Luego duerme un segundo más o menos y léelos todos de nuevo. 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 ayudarlo a determinar el uso del proceso actual o su hijo

Actualizar:
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% de CPU no es sencillo de calcular, puede usar el tipo de cosas 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)

Paso a paso fácil para principiantes como yo:

  1. Lea la primera línea de /proc/stat Llegar total_cpu_usage1.
    sscanf(line,"%*s %llu %llu %llu %llu",&user,&nice,&system,&idle);
    total_cpu_usage1 = user + nice + system + idle;
  1. Leer /proc/pid/stat dónde pid es el PID del proceso 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 usertime y systemtime y obten proc_times1
  2. Ahora espera 1 segundo o más
  3. Hazlo de nuevo y obtén total_cpu_usage2 y proc_times2

La formula 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *