/proc/pid/statからプロセスの合計CPU使用率を計算します
1. 概要
このチュートリアルでは、プロセスの合計CPU使用率を計算する方法を学習します。 これを行うには、Bashスクリプトを記述して、からの値を使用して算術演算を実行します。 / proc /
まず、特別ファイルの内容を確認します / proc /
最後に、プロセスの合計CPU使用率を計算するBashスクリプトを記述します。
2. の値を理解する / proc / / stat
Linuxシステムにはprocという特別なファイルシステムがあり、通常は /procディレクトリにマウントされます。 このディレクトリには、システムに関する情報を含むファイルが含まれています。
2.1. The / proc / / stat ファイル
内部 / proc ディレクトリ、各プロセスには独自の / proc /
/ proc /
cat を使用して、現在のシェルのステータスを確認しましょう。 現在のシェルPIDに置き換えられた$$特殊変数を使用できます。
$ cat /proc/$$/stat
6608 (bash) S 2782 6608 6608 34818 25989 4194304 6423 130989 0 428 3 1 903 124 20 0 1 0 84265 9269248 1452 18446744073709551615 4345856 5123037 140728509762160 0 0 0 65536 3686404 1266761467 0 0 0 17 6 0 0 0 0 0 5362544 5410152 9601024 140728509767363 140728509767374 140728509767374 140728509771758 0
空白で区切られたいくつかの値を見ることができ、それぞれの値には意味があります。
たとえば、最初の値はプロセスID、2番目の値はプロセスの名前、3番目の値はプロセスの状態です。 man 5 procコマンドを実行すると、値とその意味の完全なリストを確認できます。
2.2. CPU使用率
通常、CPU使用率は、プロセスが開始されてからの経過時間のパーセンテージとして表されます。 したがって、アプリケーションの合計CPU使用率は、utimeとstimeの合計を、経過時間で割ったものになります。
プロセスが開始されてからの経過時間を取得するには、プロセスの開始時間を使用できます。 この値は、から22番目の列です。 / proc /
$ cat /proc/uptime
28057.65 218517.53
これで、合計CPU使用率を計算する方法がわかりました。
2.3. クロックティックから秒への変換
システムの構成を読み取ることにより、1秒間のクロックティック数を取得できます。 これを行うには、CLK_TCKパラメーターを指定してgetconfコマンドを使用できます。 CLK_TCKの値を取得しましょう。
$ getconf CLK_TCK
100
私たちのシステムでは、1秒間に100クロックティックがあることがわかります。 この値は、システム構成によって異なる場合があります。
したがって、たとえば、プロセスのutimeとstimeの合計が6000で、 CLK_TCK の値が100の場合、プロセスは60秒のCPU。 また、プロセスの starttime が360000クロックティックの場合、システムが起動してから3600秒(1時間)後にプロセスが開始されます。
3. プロセスのCPU使用率の計算
プロセスのCPU使用率を計算するために必要な値を見つけることができる場所を学習したので、それを計算するためのBashスクリプトを作成できます。
3.1. Bashスクリプトを書く
CPU使用率の計算は3つのステップに分割できます。 まず、プロセスの utime 、 stime 、 starttime 、およびシステムの稼働時間を取得します。 次に、プロセスの値をクロックティックから秒に変換します。 最後に、プロセスが開始されてからの経過時間を計算し、utimeとstimeの合計を経過時間で割ります。 このようにして、プロセスの合計CPU使用率を簡単に計算できます。
計算を実行するtotal_cpu_usage.shというBashスクリプトを書いてみましょう:
#!/bin/bash
PID=$1
if [ -z "$PID" ]; then
echo Usage: $0 PID
exit 1
fi
PROCESS_STAT=($(sed -E 's/\([^)]+\)/X/' "/proc/$PID/stat"))
PROCESS_UTIME=${PROCESS_STAT[13]}
PROCESS_STIME=${PROCESS_STAT[14]}
PROCESS_STARTTIME=${PROCESS_STAT[21]}
SYSTEM_UPTIME_SEC=$(tr . ' ' </proc/uptime | awk '{print $1}')
CLK_TCK=$(getconf CLK_TCK)
let PROCESS_UTIME_SEC="$PROCESS_UTIME / $CLK_TCK"
let PROCESS_STIME_SEC="$PROCESS_STIME / $CLK_TCK"
let PROCESS_STARTTIME_SEC="$PROCESS_STARTTIME / $CLK_TCK"
let PROCESS_ELAPSED_SEC="$SYSTEM_UPTIME_SEC - $PROCESS_STARTTIME_SEC"
let PROCESS_USAGE_SEC="$PROCESS_UTIME_SEC + $PROCESS_STIME_SEC"
let PROCESS_USAGE="$PROCESS_USAGE_SEC * 100 / $PROCESS_ELAPSED_SEC"
echo The PID $PID has spent ${PROCESS_UTIME_SEC}s in user mode, ${PROCESS_STIME_SEC}s in kernel mode. Total CPU usage is ${PROCESS_USAGE_SEC}s
echo The process has been running for ${PROCESS_ELAPSED_SEC}s. So, the process has used ${PROCESS_USAGE}% of CPU
これで、スクリプトをテストできます。 プロセスのIDを見つけて、実行してスクリプトを実行しましょう ./total_cpu_usage.sh
$ ./total_cpu_usage.sh 4396
The PID 4396 has spent 416s in user mode, 126s in kernel mode. Total CPU usage is 542s
The process has been running for 8893s. So, the process has used 6% of CPU
ご覧のとおり、スクリプトにはプロセスID4396のすべての情報が表示されています。
まず、スクリプトは、プロセスが使用したCPU時間を秒単位で出力します。 次に、スクリプトは、プロセスが開始されてからの経過時間のパーセンテージとしてCPU使用率を出力します。
3.2. Bashスクリプトを理解する
それでは、前のBashスクリプトのいくつかの部分を確認しましょう。
まず、スクリプトがプロセスのIDをパラメーターとして受け取るかどうかを確認します。 次に、プロセスのステータスを/ proc / $ PID / statファイルから読み取り、配列に格納します。
sed コマンドを使用して、括弧の間にあるものをX文字に置き換えます。 これを行うのは、プロセスの名前が括弧内に配置され、空白を含めることができるためです。 プロセスの名前に空白があり、その状況を考慮しない場合、/ proc / $ PID/statファイルの各列の意味が変更されます。
その後、 PROCESS_STAT arrayからプロセスのutime、 stime 、およびstarttimeを取得して保存します。個々の変数に。 14、15、22の代わりにインデックス13、14、21を使用していることがわかります。 これは、Bashにゼロベースの配列があるためです。 したがって、/ proc / $ PID/statファイルの14番目の列が配列の13番目のインデックスになります。
また、 tr コマンドを使用してドットを空白に置き換えた後、awkコマンドを使用してシステムの稼働時間を取得します。 Bashの算術演算は整数でのみ機能するため、これを行います。
最後に、letを使用して算術演算を実行したことにも気付くでしょう。
4. 結論
この記事では、アプリケーションの合計CPU使用率を計算する方法を説明しました。
まず、 / proc /
最後に、プロセスの合計CPU使用率を計算するスクリプトを作成しました。