GNU/Linux >> Linux の 問題 >  >> Linux

CからLinuxでPIDによってプロセスのCPU使用率を計算する方法は?

/proc/<PID>/stat からのデータを解析する必要があります .これらは最初のいくつかのフィールドです (Documentation/filesystems/proc.txt から) カーネルソースで):

Table 1-3: Contents of the stat files (as of 2.6.22-rc3)
..............................................................................
 Field          Content
  pid           process id
  tcomm         filename of the executable
  state         state (R is running, S is sleeping, D is sleeping in an
                uninterruptible wait, Z is zombie, T is traced or stopped)
  ppid          process id of the parent process
  pgrp          pgrp of the process
  sid           session id
  tty_nr        tty the process uses
  tty_pgrp      pgrp of the tty
  flags         task flags
  min_flt       number of minor faults
  cmin_flt      number of minor faults with child's
  maj_flt       number of major faults
  cmaj_flt      number of major faults with child's
  utime         user mode jiffies
  stime         kernel mode jiffies
  cutime        user mode jiffies with child's
  cstime        kernel mode jiffies with child's

あなたはおそらく utime の後です および/または stime . cpu も読む必要があります /proc/stat からの行 、次のようになります:

cpu  192369 7119 480152 122044337 14142 9937 26747 0 0

これは、さまざまなカテゴリで使用された累積 CPU 時間を jiffy 単位で示します。 time_total を取得するには、この行の値の合計を取る必要があります

utime の両方を読む と stime 興味のあるプロセスについて、time_total を読んでください。 /proc/stat から .それから 1 秒ほど寝てから、すべてをもう一度読みます。以下を使用して、サンプリング時間中のプロセスの CPU 使用率を計算できるようになりました。

user_util = 100 * (utime_after - utime_before) / (time_total_after - time_total_before);
sys_util = 100 * (stime_after - stime_before) / (time_total_after - time_total_before);

理にかなっていますか?


getrusage() は、現在のプロセスまたはその子プロセスの使用状況を判断するのに役立ちます

更新: API が思い浮かびません。ただし、すべての詳細は /proc/PID にあります /stat なので、解析できればパーセンテージを取得できます。

編集: CPU % の計算は簡単ではないため、ここではサンプリングのようなものを使用できます。ある時点で PID の ctime と utime を読み取り、1 秒後に同じ値を再度読み取ります。差を見つけて百で割ります。過去 1 秒間、そのプロセスの使用率が得られます。

(プロセッサが多数ある場合は、より複雑になる可能性があります)


Linux
  1. Linux で C または C++ からプロセスの CPU アフィニティを設定する方法は?

  2. Unix / Linux でプロセスのパスを取得するにはどうすればよいですか

  3. Linux カーネルの copy_from_user は内部でどのように機能しますか?

  1. コマンドラインからGNU/Linuxで特定のプロセスの親PIDを取得するには?

  2. Linux はシングルコア マシンで CPU の制御をどのように保持しますか?

  3. Linux でメモリ使用量はどのように報告されますか?

  1. LinuxでプロセスのCPU使用率を制限する方法

  2. LinuxでターミナルからWebを検索する方法

  3. Linux –Linuxで/proc / $ pid / memから読み取る方法は?