GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menghitung pemanfaatan CPU dari suatu proses &semua proses anaknya di Linux?

Inilah one-liner untuk menghitung total CPU untuk semua proses. Anda dapat menyesuaikannya dengan meneruskan filter kolom ke output teratas:

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

Anda dapat menemukan informasi ini di /proc/PID/stat di mana PID adalah ID proses proses induk Anda. Dengan asumsi bahwa proses induk menunggu anaknya maka total penggunaan CPU dapat dihitung dari utime , waktu , lucu dan cstime :

utime %lu

Jumlah waktu proses ini telah dijadwalkan dalam mode pengguna, diukur dalam detak jam (dibagi dengan sysconf(_SC_CLK_TCK). Ini termasuk waktu tamu, waktu_tamu (waktu yang dihabiskan untuk menjalankan CPU virtual, lihat di bawah), sehingga aplikasi yang tidak mengetahui bidang waktu tamu tidak kehilangan waktu itu dari perhitungannya.

waktu %lu

Jumlah waktu proses ini telah dijadwalkan dalam mode kernel, diukur dalam detak jam (dibagi dengan sysconf(_SC_CLK_TCK).

lucu %ld

Jumlah waktu menunggu anak proses ini telah dijadwalkan dalam mode pengguna, diukur dalam detak jam (dibagi dengan sysconf(_SC_CLK_TCK). (Lihat juga waktu(2).) Ini termasuk waktu tamu, waktu_cguest (waktu yang dihabiskan untuk menjalankan CPU virtual, lihat di bawah).

waktu %ld

Jumlah waktu menunggu anak proses ini telah dijadwalkan dalam mode kernel, diukur dalam detak jam (dibagi dengan sysconf(_SC_CLK_TCK).

Lihat halaman manual proc(5) untuk detailnya.


Mungkin bukan perintah yang tepat. Tetapi Anda dapat melakukan sesuatu seperti di bawah ini untuk mendapatkan penggunaan cpu dari berbagai proses dan menambahkannya.

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

/proc/[pid]/stat Informasi status tentang proses. Ini digunakan oleh ps dan dibuat menjadi bentuk yang dapat dibaca manusia.

Cara lain adalah dengan menggunakan cgroups dan menggunakan 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


Dan tentu saja Anda dapat melakukannya dengan cara yang keras menggunakan C

lama yang bagus

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

Kompilasi:

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

Selamat menikmati!


Linux
  1. Linux – Proses Init:Leluhur Semua Proses?

  2. Bagaimana cara mematikan proses di Linux menggunakan perintah?

  3. Proses UNIX / Linux:C fork() Fungsi

  1. Cara Membatasi Penggunaan CPU Suatu Proses Di Linux

  2. Bagaimana menemukan semua proses anak?

  3. Restart proses di linux dengan nomor pidn nya dengan perintah kill, bagaimana caranya?

  1. Cara Memeriksa Utilisasi CPU di Linux dengan Command Line

  2. 30 Latihan Proses Linux Untuk Sysadmin

  3. Bagaimana cara menghitung penggunaan CPU dari suatu proses oleh PID di Linux dari C?