GNU/Linux >> Linux Esercitazione >  >> Linux

Come calcolare l'utilizzo della CPU di un processo e tutti i suoi processi figlio in Linux?

Ecco una riga per calcolare la CPU totale per tutti i processi. Puoi regolarlo passando il filtro di colonna nell'output superiore:

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

Puoi trovare queste informazioni in /proc/PID/stat dove PID è l'ID del processo del tuo processo padre. Supponendo che il processo padre attenda i suoi figli, l'utilizzo totale della CPU può essere calcolato da utime , tempo , cutime e cstime :

utime %lu

La quantità di tempo in cui questo processo è stato pianificato in modalità utente, misurata in tick di clock (diviso per sysconf(_SC_CLK_TCK). Ciò include guest time, guest_time (tempo trascorso con l'esecuzione di una CPU virtuale, vedi sotto), in modo che le applicazioni che non sono a conoscenza di il campo del tempo dell'ospite non perde quel tempo dai loro calcoli.

stima %lu

Quantità di tempo in cui questo processo è stato pianificato in modalità kernel, misurata in tick di clock (dividi per sysconf(_SC_CLK_TCK).

cuttime %ld

La quantità di tempo in cui i figli di questo processo sono stati attesi in modalità utente, misurata in tick di clock (dividi persysconf(_SC_CLK_TCK). vedi sotto).

cstime %ld

Quantità di tempo in cui i figli attesi di questo processo sono stati pianificati in modalità kernel, misurata in tick di clock (divide bysysconf(_SC_CLK_TCK).

Vedere la manpage di proc(5) per i dettagli.


Potrebbe non essere il comando esatto. Ma puoi fare qualcosa come sotto per ottenere l'utilizzo della cpu di vari processi e aggiungerlo.

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

/proc/[pid]/stat Informazioni sullo stato del processo. Questo è usato da ps e trasformato in una forma leggibile dall'uomo.

Un altro modo è usare cgroups e usare 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


E ovviamente puoi farlo in modo hardcore usando il buon vecchio C

find_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;
}

Compila:

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

Buon divertimento!


Linux
  1. Come limitare l'utilizzo della CPU di un processo in Linux

  2. Linux – Init Process:antenato di tutti i processi?

  3. Come uccidere un processo su Linux usando il comando?

  4. Processi UNIX / Linux:funzione C fork()

  5. Come trovare tutti i processi figlio?

Come modificare la priorità di un processo in Linux

Come controllare le informazioni sulla CPU in Linux

Come KILL un processo su Linux

Come elencare tutti gli utenti di un gruppo in Linux

Come controllare l'utilizzo o l'utilizzo della CPU di Linux

Come inviare processi in background su Linux