2012-10-13 39 views
7

Tôi muốn biết việc sử dụng CPU của một quy trình và tất cả các quy trình con, trong một khoảng thời gian cố định, trong Linux.Làm thế nào để tính toán việc sử dụng CPU của một tiến trình và tất cả các tiến trình con của nó trong Linux?

Để cụ thể hơn, đây là use-case của tôi:

Có một quá trình mà chờ đợi cho một yêu cầu từ người dùng để thực hiện các chương trình. Để thực hiện các chương trình, quá trình này gọi các tiến trình con (tối đa là 5 lần) & mỗi tiến trình con này thực hiện 1 trong các chương trình đã gửi này (giả sử người dùng gửi 15 chương trình cùng một lúc). Vì vậy, nếu người dùng gửi 15 chương trình, thì 3 đợt của 5 tiến trình con sẽ chạy. Quy trình con bị giết ngay sau khi chúng hoàn thành việc thực hiện chương trình.

Tôi muốn biết về% CPU Sử dụng cho quy trình gốc và tất cả quy trình con của nó trong khi thực hiện 15 chương trình đó.

Có cách nào đơn giản để thực hiện việc này bằng cách sử dụng lệnh trên cùng hoặc lệnh khác không? (Hoặc bất kỳ công cụ nào tôi cũng phải đính kèm với quy trình gốc.)

Trả lời

8

Bạn có thể tìm thông tin này ở số /proc/PID/stat trong đó PID là ID tiến trình của quy trình gốc. Giả sử rằng quá trình cha mẹ chờ con của nó sau đó tổng sử dụng CPU có thể được tính từ utime, STIME, cutimecstime:

utime% lu

Lượng thời gian rằng quá trình này đã được lên lịch ở chế độ người dùng, được đo bằng đồng hồ (chia cho sysconf (_SC_CLK_TCK). Điều này bao gồm thời gian khách, guest_time (thời gian chạy CPU ảo, xem bên dưới), sao cho những vấn đề không nhận thức được trường thời gian khách không mất thời gian đó từ các tính toán của chúng.

STIME% lu

Lượng thời gian đó quá trình này đã được lên kế hoạch trong kernel mode, đo bằng đồng hồ bọ ve (chia sysconf (_SC_CLK_TCK).

cutime% ld

Lượng thời gian mà trẻ em chờ đợi của quá trình này đã được được lên lịch ở chế độ người dùng, được đo bằng đồng hồ (chia cho sysconf (_SC_CLK_TCK). (Xem thêm thời gian (2).) Điều này bao gồm thời gian của khách, cguest_time (thời gian chạy CPU ảo , xem bên dưới).

cstime% ld

Lượng thời điểm đó của quá trình này chờ đợi-cho trẻ em đã được dự kiến ​​trong kernel mode, đo bằng đồng hồ bọ ve (chia sysconf (_SC_CLK_TCK).

Xem proc(5) manpage

+0

Điều gì có nghĩa là cha mẹ phải chờ quá trình con? Kỹ thuật này sẽ thất bại nếu các tiến trình con được chia nhỏ để chạy trong nền? –

1

Có thể không phải là lệnh chính xác.Nhưng bạn có thể làm một cái gì đó như dưới đây để có được sử dụng CPU của quá trình khác nhau và thêm nó.

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

/proc/[pid]/Thông tin trạng thái stat về quá trình này. Điều này được sử dụng bởi ps và được tạo thành dạng có thể đọc được của con người.

Một cách khác là sử dụng cgroups và sử dụng 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

2

Và tất nhiên bạn có thể làm điều đó trong Hardcore chiều sử dụng tốt cũ 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; 
} 

Compile:

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

Tận hưởng!

0

Đây là một lớp lót để tính tổng CPU cho tất cả các quy trình. Bạn có thể điều chỉnh nó bằng cách chuyển bộ lọc cột vào đầu ra hàng đầu:

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