如何在Linux中计算进程及其所有subprocess的CPU利用率?

我想在Linux中知道一个进程和所有subprocess的CPU利用率,并保持一段固定的时间。

更具体地说,这是我的用例:

有一个等待用户执行程序的请求的过程。 为了执行这些程序,这个过程调用subprocess(一次最大限制为5个),这个subprocess的每一个执行这些提交的程序中的一个(假设用户一次提交了15个程序)。 所以,如果用户提交了15个程序,那么3个批次的5个subprocess都会运行。 subprocess一旦完成程序的执行就会被终止。

我想知道在这15个程序执行过程中,父进程及其所有subprocess的%CPU利用率。

有没有简单的方法来做到这一点使用顶部或另一个命令? (或者我应该附加到父进程的任何工具。)

Solutions Collecting From Web of "如何在Linux中计算进程及其所有subprocess的CPU利用率?"

您可以在/proc/PID/stat中找到此信息,其中PID是您的父进程的进程ID。 假设父进程等待其子进程,那么总CPU使用率可以从utimestimecutimecstime中计算出来:

utime%lu

在用户模式下计划此进程的时间量(以时钟周期为单位)(除以sysconf(_SC_CLK_TCK),包括访客时间,guest_time(运行虚拟CPU的时间,请参见下文),以便不知道的应用程序的客人时间字段不会从他们的计算中失去那个时间。

stime%lu

在内核模式下调度此进程的时间量,以时钟滴答度量(除以sysconf(_SC_CLK_TCK))。

cutime%ld

这个进程的等待子进程在用户模式下被计划的时间量,以时钟滴答度量(除以sysconf(_SC_CLK_TCK))(参见times(2)。)这包括访客时间,cguest_time(运行虚拟机CPU,见下文)。

cstime%ld

在内核模式下调度该进程等待的子进程的时间量,以时钟滴答度量(除以sysconf(_SC_CLK_TCK))。

有关详细信息,请参阅proc(5)手册页 。

当然,你可以用老式的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; } 

编译:

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

请享用!

可能不是确切的命令。 但是你可以做下面的事情来获取各种进程的CPU使用情况并添加它。

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

/ proc / [pid] / stat有关进程的状态信息。 这是由ps使用,并制成人类可读的形式。

另一种方法是使用cgroups并使用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

这里是计算所有进程总CPU的单线程。 您可以通过将列过滤器传递到顶部输出来调整它:

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