1. 概要

このチュートリアルでは、プロセスの合計CPU使用率を計算する方法を学習します。 これを行うには、Bashスクリプトを記述して、からの値を使用して算術演算を実行します。 / proc / / stat / proc/uptime。

まず、特別ファイルの内容を確認します / proc / / stat そしてその列の意味。 次に、からの値を使用してCPU使用率を計算する方法を確認します。 / proc / / stat / proc / uptime ファイル。

最後に、プロセスの合計CPU使用率を計算するBashスクリプトを記述します。

2. の値を理解する / proc / / stat

Linuxシステムにはprocという特別なファイルシステムがあり、通常は /procディレクトリにマウントされます。 このディレクトリには、システムに関する情報を含むファイルが含まれています。

2.1. The / proc / / stat ファイル

内部 / proc ディレクトリ、各プロセスには独自の / proc / プロセスによって識別されるフォルダ PID 。 次に、各プロセスには特別なファイルがあります / proc / / stat プロセスのステータスが含まれています。

/ proc / / statファイルには、合計CPU使用率を計算するための情報が含まれています。 これは、空白で区切られたいくつかの値を保持するプレーンテキストファイルです。

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使用率

/proc/内 / stat特殊ファイル、プロセスのCPU使用率には2つの値があります。 1つの値はutimeと呼ばれ、もう1つの値はstimeと呼ばれ、それぞれ14番目と15番目の値です。 The utime valueは、プロセスがユーザーモードで実行されている時間です。 stime 値は、プロセスがカーネルモードで実行されている時間です。

通常、CPU使用率は、プロセスが開始されてからの経過時間のパーセンテージとして表されます。 したがって、アプリケーションの合計CPU使用率は、utimeとstimeの合計を、経過時間で割ったものになります。

プロセスが開始されてからの経過時間を取得するには、プロセスの開始時間を使用できます。 この値は、から22番目の列です。 / proc / / stat ファイルと呼ばれます始まる時間 。 プロセスのstarttimeは、システムが起動してから測定されます。 したがって、システムの稼働時間からプロセスの starttime を差し引くことにより、経過時間を計算できます。

/ proc / uptimeファイルを読み取ることで、システムの稼働時間を取得できます。 最初の値は、システムの稼働時間(秒単位)です。 の内容を見てみましょう / proc / uptime

$ cat /proc/uptime 
28057.65 218517.53

これで、合計CPU使用率を計算する方法がわかりました。 ただし、プロセスのutime、stime、およびstarttimeは秒単位ではありません。 代わりに、それらはクロックティックと呼ばれる単位になっています。 システムの稼働時間は秒単位であるため、プロセスのCPU使用率を計算するには、クロックティックを秒に変換する必要があります。

2.3. クロックティックから秒への変換

システムの構成を読み取ることにより、1秒間のクロックティック数を取得できます。 これを行うには、CLK_TCKパラメーターを指定してgetconfコマンドを使用できます。 CLK_TCKの値を取得しましょう。

$ getconf CLK_TCK
100

私たちのシステムでは、1秒間に100クロックティックがあることがわかります。 この値は、システム構成によって異なる場合があります。

したがって、たとえば、プロセスのutimestimeの合計が6000で、 CLK_TCK の値が100の場合、プロセスは60秒のCPU。 また、プロセスの starttime が360000クロックティックの場合、システムが起動してから3600秒(1時間)後にプロセスが開始されます。

3. プロセスのCPU使用率の計算

プロセスのCPU使用率を計算するために必要な値を見つけることができる場所を学習したので、それを計算するためのBashスクリプトを作成できます。

3.1. Bashスクリプトを書く

CPU使用率の計算は3つのステップに分割できます。 まず、プロセスの utime stime starttime 、およびシステムの稼働時間を取得します。 次に、プロセスの値をクロックティックから秒に変換します。 最後に、プロセスが開始されてからの経過時間を計算し、utimestimeの合計を経過時間で割ります。 このようにして、プロセスの合計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 / / stat そしてその値の意味。 次に、CPU使用率を計算するために実行する必要のある算術演算を確認しました。

最後に、プロセスの合計CPU使用率を計算するスクリプトを作成しました。