10

Linux で一定期間、プロセスとすべての子プロセスの CPU 使用率を知りたいです。

より具体的には、ここに私のユースケースがあります:

プログラムの実行には、ユーザーからの要求を待つプロセスがあります。プログラムを実行するために、このプロセスは子プロセス (一度に最大 5 つまで) を呼び出し、この子プロセスはそれぞれ、これらの送信されたプログラムの 1 つを実行します (ユーザーが一度に 15 個のプログラムを送信したとします)。したがって、ユーザーが 15 個のプログラムを送信すると、それぞれ 5 つの子プロセスの 3 つのバッチが実行されます。子プロセスは、プログラムの実行が終了するとすぐに強制終了されます。

これら 15 個のプログラムの実行中の親プロセスとそのすべての子プロセスの % CPU 使用率について知りたいです。

top または別のコマンドを使用してこれを行う簡単な方法はありますか? (または、親プロセスにアタッチする必要があるツール。)

4

4 に答える 4

10

この情報は/proc/PID/stat、PID が親プロセスのプロセス ID である場所にあります。親プロセスがその子プロセスを待機していると仮定すると、合計 CPU 使用率はutimestimecutime、およびcstimeから計算できます。

使用時間 %lu

このプロセスがユーザー モードでスケジュールされている時間。クロック ティックで測定されます (sysconf(_SC_CLK_TCK で割ります)。これには、ゲスト時間、guest_time (仮想 CPU の実行に費やされた時間、以下を参照) が含まれます。ゲスト時間フィールドの計算からその時間を失うことはありません。

時間 %lu

このプロセスがカーネル モードでスケジュールされている時間。クロック ティックで測定されます (sysconf(_SC_CLK_TCK) で割ります)。

キュータイム %ld

このプロセスの待機中の子プロセスがユーザー モードでスケジュールされている時間で、クロック ティックで測定されます (sysconf(_SC_CLK_TCK で除算)) (times(2) も参照)。 CPU、以下を参照)。

cstime %ld

このプロセスの待機中の子プロセスがカーネル モードでスケジュールされている時間。クロック ティックで測定されます (sysconf(_SC_CLK_TCK) で割ります)。

詳細については、 proc(5) マンページを参照してください。

于 2012-10-13T08:27:08.887 に答える
3

そしてもちろん、古き良き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

楽しみ!

于 2012-10-14T13:58:45.820 に答える
2

正確なコマンドではない可能性があります。しかし、以下のようにして、さまざまなプロセスの CPU 使用率を取得して追加することができます。

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

/proc/[pid]/stat プロセスに関するステータス情報。これは ps によって使用され、人間が読める形式に変換されます。

もう 1 つの方法は、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

于 2012-10-13T08:39:12.333 に答える
1

すべてのプロセスの合計 CPU を計算するためのワンライナーを次に示します。列フィルターをトップ出力に渡すことで調整できます。

top -b -d 5 -n 2 | awk '$1 == "PID" {block_num++; next} block_num == 2 {sum += $9;} END {print sum}'
于 2015-07-23T11:06:22.447 に答える