リソースの見方を今一度確認してみよう~CPU使用率~
こんにちは。サイオステクノロジーの橋本です。
今回はリソースの見方 (CPU 使用率) について今一度確認してみましょう
前提
CPU、メモリ、DISK I/O に関わらず、すべてのリソースで言えることですが、
「使用率が高い状況 = 悪」と一概には言えない点に注意してください。
なぜか
使用率が高い状況は反対に言えば、
「限られた資源を無駄なく最大限に活用している」とも言えます。
リソースの見方で「これはよくないよね」と言える状況は主に 2 つです。
1: オーバスペックであり、使用率が非常に低い
例えばメモリを 100 GB も搭載しているのに、
最も利用された時間ですら使用率は 1~2 % でしか推移していない場合は無駄にお金をかけすぎと言えます。
2: リソースの利用待ちが発生している
リソースが利用できないほど使用率が高い状況は悪いとも言えます。
※この場合でもシステム要件や企業文化的に許容されるケースも多々あります。
使用率でのみシステムの状況を判断するのではなく、
システム全体の状況で柔軟に判断いただければと思います。
もう一歩踏み込んで申し上げますと、
システム全体として許容されているレスポンスタイムでリクエストに応答できている限り、
問題は無いと言えるます。
※この考え方は CPU のみならず、メモリ/SWAP/DISK すべてに共通します。
サーバに搭載されている CPU コア数の確認方法
/proc/cpuinfo を確認いただければ CPU コア数が確認できます。
# grep "processor" /proc/cpuinfo | wc -l
2
#
この場合は 2 コアと判断できます。
現在の CPU 使用率の見方
CPU 使用率の見方はメモリや DISK と違い非常にシンプルです。
通常 vmstat コマンドだけで使用率は確認できます。
RHEL 7~9 いずれのバージョンでも以下のような見え方となります。
$ vmstat -t 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
r b swpd free buff cache si so bi bo in cs us sy id wa st JST
7 0 0 269592 0 409528 0 0 120 82 101 58 2 4 94 0 0 2024-06-04 11:53:22
5 0 0 269472 0 409528 0 0 0 0 2014 201 20 77 0 0 3 2024-06-04 11:53:23
5 0 0 269472 0 409528 0 0 0 0 2008 188 24 75 0 0 2 2024-06-04 11:53:24
5 0 0 269472 0 409528 0 0 0 0 2004 200 22 77 0 0 2 2024-06-04 11:53:25
注意点としては最初の 1 行目 (06/04 11:53:22 の情報) は起動時から現在時刻まで負荷状況を平均した値となります。
vmstat は 2 行目から見てください。
どこを見ればよいのかというとこの部分です。
------cpu-----
us sy id wa st
2 4 94 0 0
20 77 0 0 3
24 75 0 0 2
22 77 0 0 2
us : Kernel 以外のプロセスの実行時間
平たく言うとユーザプロセスの CPU 使用率
sy : Kernel のプロセスの実行時間
平たく言うとシステムの CPU 使用率
id : アイドル時間
平たく言うと「CPU を利用していない待ち時間」となります。
wa : I/O の待ち時間です。
端的に言うと DISK にアクセスしていた時間です。
st : 仮想マシンに盗まれた時間
説明が少し難しいですが、仮想マシンである場合ハイパーバイザ等に起因して生じた値となります。
「id」の値が高ければ CPU 使用率は低いと言えます。
上記例の場合 id は 0 なので CPU 使用率は極めて高いと言えます。
誰が使っているかというと
Kernel の使用率が 75~77%
ユーザプロセスの使用率が20~24%となります。
重ねてとなりますが「id の値が低い = 悪」とは言えません。
CPU の利用待ちがプロセスが増えていて初めて性能劣化が発生していると言えます。
CPU の利用待ちプロセス数の確認方法
基本的には vmstat の以下項目の内 r 列を確認すれば OK です。
procs
r b
7 0
5 0
5 0
5 0
ただ、この項目 RHEL 7 以降だと「実行中または実行待ち」の数を表します。
RHEL 6 だと「実行待ち」の数のみでした。
この点は man vmstat にも記載されています。
・RHEL6 man vmstat 抜粋
Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.
・RHEL7 man vmstat 抜粋
Procs
r: The number of runnable processes (running or waiting for run time).
b: The number of processes blocked waiting for I/O to complete.
純粋に実行待ちプロセス数を確認するには sar コマンドで確認する必要があります。
sar -q で表示される項目「runq-sz」が実行待ちプロセス数となります。
なお sysstat サービスが起動している必要があります。
# sar -q
Linux 3.10.0-1160.80.1.el7.x86_64 (ip-172-31-12-211.ap-northeast-1.compute.internal) 2024年06月04日 _x86_64_ (2 CPU)
15時50分03秒 LINUX RESTART
16時00分01秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
16時10分01秒 0 111 0.00 0.01 0.03 0
平均値: 0 111 0.00 0.01 0.03 0
※ RHEL 7,8,9 いずれも上記のように表示されます。
CPU を利用しているプロセスの特定方法
コマンド「ps auxww –sort=-%cpu」で特定可能です。
このコマンドで以下のように CPU 使用率が高い順で表示してくれます。
$ ps auxww --sort=-%cpu | head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
test 3069 74.3 0.1 217092 824 pts/0 R+ 11:51 4:02 yes
test 3128 71.4 0.1 217092 860 pts/1 R+ 11:51 3:28 yes
test 3260 65.8 0.1 217092 836 pts/3 R+ 11:52 2:32 yes
root 1 0.1 1.1 172320 9592 ? Ss 11:10 0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
$
過去の CPU 使用率の見方
基本的に過去のリソース使用状況はデフォルトの状態では見ることはできません。
sysstat サービスを有効化し、sar コマンドが利用できる状況にしておく必要があります。
sar コマンドでは「どのプロセスが CPU を利用しているか」まではわからないので、
将来的に発生する可能性がある障害に備えて 5 分間隔で ps auxww コマンドの結果をログに残す等の監視をご検討ください。
CPU 使用率を確認する際に参考になればと思います。