GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo calcular la utilización de la CPU de un proceso y todos sus procesos secundarios en Linux?

Aquí hay una sola línea para calcular la CPU total para todos los procesos. Puede ajustarlo pasando el filtro de columna a la salida superior:

top -b -d 5 -n 2 | awk '$1 == "PID" {block_num++; next} block_num == 2 {sum += $9;} END {print sum}'

Puede encontrar esta información en /proc/PID/stat donde PID es el ID de proceso de su proceso principal. Suponiendo que el proceso principal espera a sus hijos, el uso total de la CPU se puede calcular a partir de utime , tiempo , tiempo lindo y cstime :

tiempo de uso %lu

Cantidad de tiempo que este proceso ha sido programado en modo de usuario, medido en pulsos de reloj (dividido por sysconf (_SC_CLK_TCK). Esto incluye el tiempo de invitado, guest_time (tiempo dedicado a ejecutar una CPU virtual, consulte a continuación), de modo que las aplicaciones que no conocen el campo de tiempo del invitado no pierda ese tiempo de sus cálculos.

tiempo %lu

Cantidad de tiempo que este proceso ha sido programado en modo kernel, medido en pulsos de reloj (dividido por sysconf(_SC_CLK_TCK).

tiempo de espera %ld

Cantidad de tiempo que los hijos esperados de este proceso han sido programados en modo de usuario, medido en pulsos de reloj (dividido por sysconf (_SC_CLK_TCK). (Consulte también tiempos (2).) Esto incluye el tiempo de invitado, cguest_time (tiempo dedicado a ejecutar una CPU virtual, ver más abajo).

cstime %ld

Cantidad de tiempo que los hijos esperados de este proceso han sido programados en modo kernel, medido en tics de reloj (dividido por sysconf(_SC_CLK_TCK).

Consulte la página de manual de proc(5) para obtener más detalles.


Puede que no sea el comando exacto. Pero puede hacer algo como a continuación para obtener el uso de la CPU de varios procesos y agregarlo.

#ps -C sendmail,firefox -o pcpu= | awk '{s+=$1} END {print s}'

/proc/[pid]/stat Información de estado sobre el proceso. Esto es usado por ps y hecho en forma legible por humanos.

Otra forma es usar cgroups y usar cpuacct.

http://www.kernel.org/doc/Documentation/cgroups/cpuacct.txt

https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-cpuacct.html


Y, por supuesto, puedes hacerlo de manera hardcore usando el viejo C

encontrar_cpu.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAX_CHILDREN 100

/**
 *  System command execution output
 *    @param <char> command - system command to execute
 *    @returb <char> execution output
 */
char *system_output (const char *command)
{
  FILE *pipe;
  static char out[1000];
  pipe = popen (command, "r");
  fgets (out, sizeof(out), pipe);
  pclose (pipe);
  return out;
}

/**
 *  Finding all process's children
 *    @param <Int> - process ID 
 *    @param <Int> - array of childs
 */
void find_children (int pid, int children[])
{
  char empty_command[] = "/bin/ps h -o pid --ppid ";
  char pid_string[5];

  snprintf(pid_string, 5, "%d", pid);

  char *command = (char*) malloc(strlen(empty_command) + strlen(pid_string) + 1);
  sprintf(command, "%s%s", empty_command, pid_string);

  FILE *fp = popen(command, "r");

  int child_pid, i = 1;
  while (fscanf(fp, "%i", &child_pid) != EOF)
  {
    children[i] = child_pid;
    i++;
  }
}

/**
 *  Parsign `ps` command output
 *    @param <char> out - ps command output
 *    @return <int> cpu utilization
 */
float parse_cpu_utilization (const char *out)
{
  float cpu;
  sscanf (out, "%f", &cpu);
  return cpu;
}


int main(void)
{
  unsigned pid = 1;

  // getting array with process children
  int process_children[MAX_CHILDREN] = { 0 };
  process_children[0] = pid; // parent PID as first element
  find_children(pid, process_children);

  // calculating summary processor utilization
  unsigned i;
  float common_cpu_usage = 0.0;
  for (i = 0; i < sizeof(process_children)/sizeof(int); ++i) 
  {
    if (process_children[i] > 0) 
    {
      char *command = (char*)malloc(1000);
      sprintf (command, "/bin/ps -p %i -o 'pcpu' --no-headers", process_children[i]);
      common_cpu_usage += parse_cpu_utilization(system_output(command));
    }
  }
  printf("%f\n", common_cpu_usage);
  return 0;
}

Compilar:

gcc -Wall -pedantic --std=gnu99 find_cpu.c

¡Disfrútalo!


Linux
  1. Cómo limitar el uso de la CPU de un proceso en Linux

  2. Linux – Proceso de inicio:¿ancestro de todos los procesos?

  3. Procesos UNIX/Linux:Función C fork()

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

  5. Reinicie el proceso en Linux por su número pidn con el comando kill, ¿cómo?

Cómo cambiar la prioridad de un proceso en Linux

Cómo verificar la información de la CPU en Linux

Cómo MATAR un proceso en Linux

Cómo enumerar todos los usuarios de un grupo en Linux

Cómo verificar el uso o la utilización de la CPU de Linux

Cómo enviar procesos a segundo plano en Linux