Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Linux OSリソースのパフォーマンス分析(2) ~ CPUとメモリの使用状況を分析してみよう

性能改善ノウハウを現場から直送! NTTデータのよりぬき『週刊まかせいのう』 第6回

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 Linuxサーバの「OSリソースのパフォーマンス分析方法」の続きです。性能問題が発生して処理遅延やスループット低下がみられる場合や、将来的な処理量増加に備えて設備増強を検討する際は、OSリソースの使用状況を分析することが重要になります。前回はOSリソースの分析対象について簡単に紹介しました。今回は、CPUとメモリの使用状況について、どのような観点から分析を行っていくかを解説したいと思います。

目次

前回説明したこと

  • 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列で、実行中+実行待ちプロセス数の瞬間値を確認できます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 若山 勝吾(株式会社NTTデータ 「まかせいのう」チーム)(ワカヤマ ショウゴ)

    NTTデータの性能プロフェッショナルチーム「まかせいのう」の古参メンバ。12年前、大規模プロジェクトの性能課題に直面し、満身創痍になる日々を経験する。からくも性能改善できたときの喜びをきっかけに、現場の教訓とともに性能の道を歩むことを決意する。今では、50を超えるプロジェクトにて、お客様とともに性能...

バックナンバー

連載:性能改善ノウハウを現場から直送! NTTデータのよりぬき『週刊まかせいのう』

もっと読む

All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5