GNU/Linux >> Tutoriels Linux >  >> Linux

Comment calculer l'utilisation du processeur d'un processus et de tous ses processus enfants sous Linux ?

Voici une ligne pour calculer le CPU total pour tous les processus. Vous pouvez l'ajuster en passant le filtre de colonne dans la sortie supérieure :

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

Vous pouvez trouver ces informations dans /proc/PID/stat où PID est l'ID de processus de votre processus parent. En supposant que le processus parent attend ses enfants, l'utilisation totale du processeur peut être calculée à partir de utime , temps , cutime et cstime :

utime %lu

Temps pendant lequel ce processus a été planifié en mode utilisateur, mesuré en ticks d'horloge (divisé par sysconf(_SC_CLK_TCK). Cela inclut le temps d'invité, guest_time (temps passé à exécuter un processeur virtuel, voir ci-dessous), de sorte que les applications qui ne sont pas conscientes de le champ de l'heure de l'invité ne perd pas ce temps de ses calculs.

temps %lu

Temps pendant lequel ce processus a été planifié en mode noyau, mesuré en tops d'horloge (divisé par sysconf(_SC_CLK_TCK).

temps %ld

Temps pendant lequel les enfants attendus de ce processus ont été planifiés en mode utilisateur, mesuré en tops d'horloge (divisé parsysconf(_SC_CLK_TCK). (Voir aussi times(2).) voir ci-dessous).

cstime %ld

Temps pendant lequel les enfants attendus de ce processus ont été planifiés en mode noyau, mesuré en tops d'horloge (divisé parsysconf(_SC_CLK_TCK).

Voir la page de manuel proc(5) pour plus de détails.


Ce n'est peut-être pas la commande exacte. Mais vous pouvez faire quelque chose comme ci-dessous pour obtenir l'utilisation du processeur de divers processus et l'ajouter.

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

/proc/[pid]/stat Informations d'état sur le processus. Ceci est utilisé par ps et transformé en une forme lisible par l'homme.

Une autre façon consiste à utiliser des cgroups et à utiliser 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


Et bien sûr, vous pouvez le faire de manière hardcore en utilisant le bon vieux 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;
}

Compiler :

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

Amusez-vous !


Linux
  1. Comment limiter l'utilisation du processeur d'un processus sous Linux

  2. 30 exercices de processus Linux pour les administrateurs système

  3. Linux – Init Process :ancêtre de tous les processus ?

  4. Comment calculer l'utilisation CPU d'un processus par PID sous Linux à partir de C ?

  5. Redémarrez le processus sur Linux par son numéro pidn avec la commande kill, comment ?

Comment changer la priorité d'un processus sous Linux

Comment vérifier les informations du processeur sous Linux

Comment tuer un processus sous Linux

Comment lister tous les utilisateurs d'un groupe sous Linux

Comment vérifier l'utilisation ou l'utilisation du processeur Linux

Comment envoyer des processus en arrière-plan sous Linux