前回説明したこと
- OSリソースを大まかに分けると、CPU、メモリ、ストレージ、ネットワークの4つ
- 各OSリソース使用状況を確認する代表的なコマンド(mpstat, vmstat, iostat, sar)
注意
- 本稿の動作確認環境は、Red Hat Enterprise Linux 6.4(以下、RHEL6.4)+sysstat9.0.4です。
- sysstatパッケージがインストール済みであることが前提です。
- 本稿に基づく運用については、お客様自身の責任と判断によって行ってください。
CPU使用状況の分析
CPUは、OSリソースの中でも特に重要なリソースです。CPUが限界になると、それ以上処理できなくなるためです。この状態をボトルネックが発生していると呼びます。基本的には、スループット(単位時間あたりの処理量)に比例してCPU使用率は増加していきます。
なお、OLTP系システムではトランザクション集中が発生しやすいため、計測されたCPU使用率が90%程度だとしても、実際には限界近くなることがあります。
さて、CPU使用状況を分析する際には、CPU使用率が高いか/低いかだけで判断するのではなく、次の点にも着目することが重要です。
- CPU使用状況のパターン
- CPU使用率の内訳
CPU使用状況のパターン
主なCPU使用状況のパターンには、次のものがあります。
パターン | CPU使用状況 |
---|---|
CPU負荷が高い |
・スループットに比例して順当にCPUが使われている状態 ・アプリケーション不具合などで突然CPU負荷が高くなるなど、過剰にCPUが使われている状態 |
CPU負荷が低い |
・処理多重度が低いため、CPUを使い切れていない状態 ・I/Oまたは何かの処理待ちが発生しており、CPUを使い切れない状態 |
CPU負荷が偏っている | ・特定プロセス(スレッド)に負荷が集中したことで、特定CPUのみ過負荷になっている状態 |
つまり、スループットに比例してCPU負荷が増加していれば、I/Oなどの競合待ち影響が少ないと考えられ、システムの処理方式として妥当という見方ができるのがポイントです。
それでは、これらのパターンがあることを念頭において、CPU使用率を確認していきましょう。
CPU使用率の内訳
CPU使用率とは、時間経過に対するCPUが使用された時間の割合を指します。例えば、10秒間においてCPUを使った処理で6秒かかった場合、CPU使用率は60%になります。
mpstat
コマンドは、CPUごとにCPU使用率の内訳を確認できるのが特徴です。CPU使用率の内訳からは、どのような処理に時間がかかっていたのかを推察できます。
mpstat -P ALL 10 | awk '{print(strftime("%Y/%m/%d %H:%M:%S"),$0);fflush();}'
2015/10/26 13:13:23 Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2015年10月26日 _x86_64_ (2 CPU) 2015/10/26 13:13:33 2015/10/26 13:13:33 13時13分23秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 2015/10/26 13:13:33 13時13分33秒 all 0.10 0.00 0.15 0.25 0.00 0.00 0.00 0.00 99.50 2015/10/26 13:13:33 13時13分33秒 0 0.00 0.00 0.10 0.40 0.00 0.00 0.00 0.00 99.50 2015/10/26 13:13:33 13時13分33秒 1 0.10 0.00 0.20 0.10 0.00 0.00 0.00 0.00 99.60 2015/10/26 13:13:43 2015/10/26 13:13:43 13時13分33秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 2015/10/26 13:13:43 13時13分43秒 all 0.05 0.00 0.10 0.10 0.05 0.00 0.00 0.00 99.70 2015/10/26 13:13:43 13時13分43秒 0 0.10 0.00 0.10 0.20 0.00 0.00 0.00 0.00 99.60 2015/10/26 13:13:43 13時13分43秒 1 0.10 0.00 0.10 0.00 0.00 0.00 0.00 0.00 99.80
項目 | 意味 |
---|---|
CPU | CPUの番号。allで示される統計は全体の平均値 |
%usr | ユーザレベル(アプリケーション)で使用されたCPU時間の割合。%niceは含まれない |
%nice | 優先度(nice値)設定されたユーザプロセス実行によるCPU時間の割合 |
%sys | システムレベル(カーネル)で使用されたCPU時間の割合。%irq、%softは含まれない |
%iowait | I/O待ちによるCPUが使用されていない時間の割合 |
%irq | ハードウェア割り込みによるCPU時間の割合 |
%soft | ソフトウェア割り込みによるCPU時間の割合 |
%steal | ゲストOSがCPU割り当て待ちとなった時間の割合 |
%guest | ゲストOS実行によるCPU時間の割合 |
%idle | CPUが使用されていない時間の割合。%iowaitは含まれない |
分析のポイント
%usrおよび%niceが高い
ユーザプロセス(アプリケーション)処理でCPU負荷が高いことを示しています。CPU負荷の高いプロセスを特定したい場合は、top
コマンドまたはpidstat
コマンドが便利です。
%sysが高い
カーネル処理でCPU負荷が高いことを示しています。ユーザプロセス(アプリケーション)からのシステムコール(カーネルへの命令)でCPU負荷が高くなっている可能性があります。関連するプロセスを特定するには、pidstat
コマンドが便利です[1]。
%iowaitが高い
ストレージに対するI/O競合が発生している可能性が高いことを示します。特に、特定のCPUに偏って%iowait
が高い場合は要注意です。なぜなら、特定プロセス(スレッド)がI/O待ちによってボトルネックになっているケースが考えられるためです。関連するストレージデバイスを特定するには、iostat
コマンドを使います[2]。
なお、I/O待ちになりにくいプロセスではCPUを使うことができます。
%irqおよび%softが高い
ハードウェア処理などで割り込みが頻発していることを示しています。代表的なのは、ネットワーク通信で負荷が高いケースです。この場合、%irq
はネットワークインタフェースのパケット送受信処理、%soft
はパケット解析処理に対応します。関連するネットワークインタフェースを特定するには、sar -n DEV
コマンドが便利です[3]。
HyperThreading有効時のCPU数に注意
HyperThreading有効時のCPU数は、基本的には物理CPUコア数の2倍になりますが、実際のCPU能力まで2倍になっているわけではありません。メモリアクセスオーバーヘッドや、CPU処理の割り当て待ちが生じるためです。
システム特性によるため一概にはいえませんが、全体のCPU使用率が50%を超える場合は、実質的には80%以上になっている可能性もあります。CPU使用率監視や設備増強を行う際には、こうした見かけ上のCPU使用率に注意しましょう。スループットおよびCPU使用率の傾向を性能検証で把握しておくことが賢明です。
HyperThreadingの有効状態はBIOSで確認できるほか、lscpu
コマンド(またはcat /proc/cpuinfo
コマンド)でCPU構成を確認できます。
実行待ちプロセス数について
本稿では解説しませんが、CPUが限界となっているかどうかの判断指標として、runキューを確認することが一般に知られています[4]。
例えば、runキューの値が過剰(CPU数の数倍)になっている場合には、CPUが限界という可能性が考えられますが、実行プロセス数が特定CPUに偏っているケースや、バッチ処理など少ないプロセス多重度でCPUが限界になるケースもあり、判断が難しいです。そのため、CPUが限界となっているかどうかは、CPU使用率で確認するのが原則です。
なお、vmstat
コマンドでもCPU使用率を確認できますが、情報が簡略的なため、CPU使用率の詳細はmpstat
コマンドで確認しましょう。
注
[1]: top
コマンドでもプロセス毎のCPU使用率を確認できますが、%usr
と%sys
の区別はつきません。
[2]: iostatによるストレージの分析については次回で解説します。
[3]: ネットワークの分析については次回で解説します。
[4]: vmstat
コマンドのr列で、実行中+実行待ちプロセス数の瞬間値を確認できます。