Linuxで全体的なCPU使用率を取得する
1. 序章
ストレージ、メモリ、CPU(中央処理装置)などの不十分なシステムリソースは、アプリケーションのパフォーマンスに大きな影響を与える可能性があります。 したがって、これらのコンポーネントを監視することが重要です。
ディスクやメモリとは異なり、LinuxシステムでのCPU使用率の監視はそれほど簡単ではありません。 この記事では、CPUメトリックを解釈し、人間が読める形式で表示する方法について説明します。
2. CPU負荷と CPU使用率
CPU負荷とCPU使用率は同じように聞こえますが、互換性はありません。 CPU負荷は、ある時点で1つのコアを使用しているまたは使用を待機しているプロセスの数として定義されます。
シングルコアシステムがあり、CPU負荷の平均が常に0.6未満であるとします。 これは、CPUを使用する必要のあるすべてのプロセスが、待機せずにCPUを即座に使用できることを示しています。 CPU負荷平均が1を超える場合、これは、CPUを使用する必要があるが、CPUが使用できないために現時点では使用できないプロセスがあることを示します。
ただし、マルチプロセッサシステムでの1を超える負荷平均は、より多くのコアがすぐに利用できるため、問題にはなりません。
uptime コマンドは、1、5、および15分間隔での平均負荷を表示します。
[root@localhost ~]# uptime
12:40:05 up 2:29, 1 user, load average: 0.37, 0.08, 0.03
システムのコア数を知らなければ、負荷平均の解釈はできません。
[root@localhost ~]# cat /proc/cpuinfo |grep core
core id : 0
cpu cores : 1
一方、 CPU使用率は、CPUが非アイドルタスクを処理するのにかかる時間のパーセンテージです。 CPU使用率は、指定された時間間隔でのみ測定できます。 アイドリングに費やされた時間のパーセンテージを100から差し引くことにより、CPU使用率を判断できます。
3. CPU使用率の計算
3.1. vmstatを使用したCPU使用率の取得
vmstat コマンドは、CPUアクティビティをほぼリアルタイムで表示します。
[root@localhost ~]# vmstat 3 4
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 1347080 6120 941464 0 0 68 11 72 137 1 2 97 0 0
1 0 0 1347080 6120 941464 0 0 0 0 84 157 1 2 97 0 0
1 0 0 1347080 6120 941464 0 0 0 0 59 107 1 1 98 0 0
1 0 0 1347080 6120 941464 0 0 0 1 59 104 1 1 98 0 0
CPUの下の列は、プロセッサ時間が費やされた場所の概要を示しています。
- us –カーネル以外のコードの実行に費やされた時間
- sy –カーネルコードの実行に費やされた時間
- id –アイドル状態で費やされた時間
- wa – I/Oの待機に費やされた時間
- st –時間は仮想マシンから盗まれます
id列が私たちが興味を持っているものです。 1秒の遅延で、vmstatを使用してCPU使用率を計算します。
[root@localhost ~]# echo "CPU Usage: "$[100-$(vmstat 1 2|tail -1|awk '{print $15}')]"%"
CPU Usage: 2%
引数が指定されていないvmstatコマンドは、起動後のCPU時間を示します。 これは正確なCPU使用率を提供しません。 したがって、引数は1と2のみになり、1秒後に計算されたメトリックを取得します。
vmstat 1 2
3.2. / proc /statを使用したCPU使用率の取得
CPUアクティビティは、 / proc /statファイルから抽出することもできます。 このファイルには、起動後のシステムに関するさまざまなメトリックが含まれています。
[root@localhost ~]# cat /proc/stat
cpu 3020 28 1863 22404 35 432 47 0 0 0
cpu0 3020 28 1863 22404 35 432 47 0 0 0
intr 96468 28 100 0 0 0 0 0 0 1 0 0 0 1263 0 0 0 3696 0 153 928 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 207 0 41 14600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 343 97 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 340950
btime 1628404433
processes 3276
procs_running 2
procs_blocked 0
softirq 112867 1 16857 56 269 510 0 261 0 0 94913
最初の行、 ‘CPU’ システムのすべてのコアのメトリックの集計です
- user –ユーザーモードで費やされた時間
- nice –ユーザーモードでのniceプロセスの処理に費やされた時間
- system –カーネルコードの実行に費やされた時間
- idle –アイドル状態で費やされた時間
- iowait – I/Oの待機に費やされた時間
- irq –割り込みのサービスに費やされた時間
- softirq –ソフトウェア割り込みのサービスに費やされた時間
- steal –仮想マシンから盗まれた時間
- guest –ゲストオペレーティングシステムの仮想CPUの実行に費やされた時間
- guest_nice –「niced」ゲストオペレーティングシステムの仮想CPUの実行に費やされた時間
これらのメトリックを使用して、平均アイドル率を計算します。 続いて、計算値を使用してCPU使用率を計算します。 Linuxの古いディストリビューションでは、 steal 、 guest 、またはguest_niceメトリックが計算されないことに注意してください。 古いシステムを使用していた場合は、計算でこれらのメトリックを省略します。
平均アイドル時間(%)=(idle * 100)/(user + nice + system + idle + iowait + irq + softirq + steal + guest + guest_nice)
cat /proc/stat |grep cpu |tail -1|awk '{print ($5*100)/($2+$3+$4+$5+$6+$7+$8+$9+$10)}'|awk '{print "CPU Usage: " 100-$1}'
CPU Usage: 2.4219
シングルコアシステムで作業しているため、‘cpu’行は‘cpu1‘と同じになります。 したがって、 tail -1を使用すると、で1行のみを取得できます。 ただし、マルチプロセッサシステムでは「 cpu 」行を使用します。これは、すべてのコアのメトリックの集合体であるためです。
3.3. topを使用してCPU使用率を取得する
一般に、 top コマンドは通常、システム上のアクティブなプロセスと、プロセスが消費しているリソースの量を表示するために使用されます。 それでも、このコマンドを使用してCPUの状態を測定できます。
[root@localhost ~]# top
top - 07:08:31 up 2:41, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 322 total, 2 running, 320 sleeping, 0 stopped, 0 zombie
%Cpu(s): 10.0 us, 15.0 sy, 0.0 ni, 97.8 id, 0.0 wa, 5.0 hi, 0.0 si, 0.0 st
MiB Mem : 3709.4 total, 1483.1 free, 1402.0 used, 824.4 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2053.4 avail Mem
さらに、topコマンドはシングルコアのCPUパーセンテージを表示することに注意することが重要です。 マルチプロセッサシステムでは、CPUの割合が100%を超える可能性があります。たとえば、4つのコアが75%の場合、 top コマンドはCPUが300%であることを示します。
アイドリングに費やした時間の値を取得して、100から減算して使用量を取得できるようにする必要があります。
[root@localhost ~]# top -bn2 | grep '%Cpu' | tail -1 | grep -P '(....|...) id,'|awk '{print "CPU Usage: " 100-$8 "%"}'
CPU Usage: 2.2%
-n オプションは、topコマンドが終了する前に使用する必要のある反復回数です。 取得するメトリックは起動後の値になるため、最初のループの使用は避けます。 したがって、2回目の反復を行いました。
または、マルチプロセッサシステムでは、指定された’ id’ 値をコア数で除算し、100から値を減算する必要があります。 たとえば、クアッドコアシステムで動作していて、「 id 」の値が304%の場合、CPU使用率は次のように計算されます。
CPU使用率%= 100 –(304/4)
[root@localhost ~]# top -bn2 | grep '%Cpu' | tail -1 | grep -P '(....|...) id,'|awk '{print "CPU Usage: " 100-($8/4) "%"}'
4. 結論
この記事では、CPU使用率とCPU負荷の違いについて説明しました。 多くの人がこれら2つの概念を同じ意味で使用していますが、これは正しくありません。 その後、CPU使用率メトリックを取得するために使用されるさまざまな方法を詳しく調べました。
また、精度を高めるために避けるべきことも指摘しました。