3. 性能管理実践編(システムリソース管理)

2. アプリケーション性能管理を行うための情報活用体制 に戻る

アプリケーション性能問題におけるシステムリソース管理

* 意義 そもそも性能管理とは

アプリケーションの性能を計測・管理する上で、システムのリソース(特にシステムのCPU、メモリ等)を計測することは、マシンの基礎的な負荷状況を把握するために重要であるとともに、例えば、大量ユーザーアクセスをシュミレートした負荷テスト等を行って、その負荷の度合いとシステムリソースの変化を相関分析することで、リソースプランニングの予測を立てる際に役立ちます。

また運用時においても、Webシステム運用の世界で一般的なWeb、AP、DBの階層構成の環境で、どの段階・部分で性能的なボトルネックが発生しているか、切り分けるために重要な指標となります。

ただ、システムリソースの計測は、単純にCPUやメモリの使用率だけを追っていても見えて来ない種類の問題も存在します。今号では、そのポイントをさらに掘り下げて論じてみたいと思います。

利用効率の問題

* 利用率100%の意味

例えばシステムに負荷が掛かり、提供するWebページのレスポンスタイムに大幅な遅延が発生する現象が起きた際に、そのシステムのCPU使用率やメモリ利用率が100%に近いという現象が見受けられた場合、これは、どのような解釈をすれば良いのでしょうか?

実は、これだけではCPUやメモリのリソース不足が遅延の原因と言えません。

例え、CPU使用率が100%近くだとしても、処理待ちプロセスの発生数がほとんどなく、単に効率的にCPU資源がフルに使われて処理されているだけであるケースも考えられます。また、メモリ使用率100%近くの場合にも、アプリケーションは追加でメモリを必要としておらず、現在のサイズで十分である場合も考えられます。

逆に、CPU使用率が平均的には90%以下だとしても、特定の処理負荷が集中するその中の区間では、100%使用されるだけでは無く不足が生じて、遅延が発生するケースもあります。また、マルチプロセッサのシステムであるように、分配用のCPUには余裕を持たせ、常に全体で100%使用することは無いという場合もあります。

* CPU使用率とは

システムのCPU使用率の値を構成するものは主として以下の2要素です。

o 各プロセスやカーネルCPU処理がCPUを占有する時間の総計 = 利用占有部分

o Idle時間と呼ばれる、CPU Idle loop(thread)に入っていた処理時間の総計 = 非使用部分

そしてCPU使用率は、一定時間内での「利用占有部分」/(「利用占有部分」+「非使用部分」)で割り出した、"CPU時間あたり"の占有比率に過ぎず、過剰に使われたかどうかの指標は持ちません。そのため、例えCPU使用率100%で、Idleが無かった時間帯において、実際にどのくらいのCPU資源利用要求や処理待ち列があったかどうかは把握することは出来ません。

逆に、もしCPU資源の処理待ちの度合いを計測することが出来れば、CPU使用率100%前後の状況においてのリソース不足の深刻度が計測・把握出来ると言えます。

ボトルネックとして検出するには

* CPU処理待ちプロセスの計測方法

以上のようにCPU使用率とは別に、CPU資源の処理待ちの度合いを計測することは有用です。実際の計測方法を、システム環境別に以下に列挙します。

o Windows NT/2000/XP/2003の場合

パフォーマンスカウンタのSystemオブジェクトから、"Processor Queue Length"をモニターする。

Processor Queue Lengthは、Windowsシステム内において実行準備が出来ていて、かつ、まだ実行されずに処理待ちキューに入っているスレッド(プロセッサ命令実行の基本単位)の個数のサンプリング値です。

実際にも、この数が多いほど、処理待ちで遅延が発生していると理解することが出来ます。

o UNIX / Linuxマシンの場合

まず、最も単純な指標の一つとしてLoad Averageが存在します。例えば w コマンドや top コマンドを実行した際に表示されるもので、通常は、「load average: 0.00, 0.02, 0.02」という形式で、過去1分間、過去5分間、過去15分間のそれぞれの平均値を指し示します。

数値の意味としては、厳密にはアーキテクチャ毎に異なる部分もありますが、1プロセッサあたりの瞬間の処理要求数の平均で、1の場合にはちょうどフルにCPU資源が使用されていることを示し、1を超えた場合には、処理遅延が発生している可能性が高いことを示します。場合によっては値が3桁

に達することもあります。

o UNIX / Linuxマシンの場合 その2

次に、vmstatの値に注目しましょう。

例えばSolarisの場合、vmstatは以下のような実行結果になります:

$ vmstat 1 2
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr dd f0 s0 -- in sy cs us sy id
0 0 0 576416 53680 0 1 1 0 0 0 0 0 0 0 0 305 34 107 0 1 99
0 0 0 569504 49928 0 7 0 0 0 0 0 0 0 0 0 306 44 116 0 0 100

このうち、cpuの欄のus,sy,idがそれぞれCPU使用率のユーザモード、システムモード、Idleを指し示します。しかし、これだけでは単なる CPU使用率です。重要な指標は行頭部分のrとbの値です。

r: 現時点での実行可能で実行キューに入っているカーネルスレッドの数。実行されているものも含みます。その為、この値がシステムのCPU個数と等しい場合には、システムのCPUはフルで使われていることを示唆します。もしCPU数より多い数は、それは処理待ちになっている数です。

b: I/Oやページング等にブロックされて処理待ちになっている個数です。この処理待ち数が高い場合には、CPU以外のシステムボトルネックが存在して、処理を妨げている可能性があります。

* 仮想メモリについて

またメモリの場合には、物理メモリの使用率だけでは無く、仮想記憶領域(ディスク)に配置されているメモリのサイズ、及びその、SWAPやページングの頻度に注意することが重要です。

o Windows NT/2000/XP/2003の場合の仮想領域のサイズの求め方

パフォーマンスカウンタのMemoryオブジェクトの"Committed Bytes" - (システムの物理メモリサイズ - "Abailable Bytes")を算出した結果

o UNIX系の例

例えば、Linuxの場合にはfreeコマンドでサイズを求めることが出来ます。

$ free
total used free shared buffers cached
Mem:  126692 109000 13692 1122 12540 29448
-/+ buffers/cache: 71180 55512
Swap:  353380 5828 347552

* スワップやページング頻度の求め方

o Windows NT/2000/XP/2003の場合

パフォーマンスカウンタのMemoryオブジェクトの"page/sec"。

秒間あたりのメモリアクセス中のページ領域への頻度を、ページ数で示します。この数値が高い場合には、処理時の参照や書き込みが物理メモリに無い領域へのアクセス、つまり、仮想領域へのアクセスとなり、その為、スレッド上の処理はディスクへの書き込みや読み込みの処理待ち状態になり応答遅延が発生します。

o UNIX系

Solarisの場合にはvmstat -Sコマンドで、ページングだけでは無く、SWAPの書き込み・読み出しの回数も取得することが出来ます。

procs memory page disk faults cpu
r b w swap free si so pi po fr de sr dd f0 s0 -- in sy cs us sy id
0 0 0 574944 52984 0 0 1 0 0 0 0 0 0 0 0 305 34 107 0 1 99
0 0 0 565384 48896 0 0 0 0 0 0 0 0 0 0 0 311 85 129 0 1 99

(上記のsi 及び so)

ステムリソースのボトルネックを追う上での基礎知識

* ユーザーモードとシステムモードの区別

CPU使用率には、純粋なアプリケーションプログラム中のルーチンでの消費であるユーザーモードとシステムコール以下のレベルでカーネル処理やI/O等を消費するシステム(カーネル)モードがあり、それぞれ別々にCPU使用率を取得出来ます。

単純には、

ユーザーモードが高い場合:プログラムルーチンが原因の可能性 → コードやアルゴリズムを見直す

システムモードが高い場合:システムの低い部分が原因の可能性 → I/Oの高速化、リソース使用の効率化を行う

といった構図およびアクションがとれるかと思います。

* プロセス毎の使用率

システムのCPU使用率が高い場合には、どのプロセスが特にCPU資源を消費しているか割り出して、そのプロセスに絞った要因分析を行う必要があります。 UNIXの場合には、例えばtopコマンドの使用や、psコマンドのフォーマットオプションのpcpuの値を取得することで、該当のプロセスのCPU使用率が取得出来ます。

Windowsの場合にはタスクマネージャのプロセスタブを閲覧すると良いでしょう。

4. 性能管理のためのシステム運用監視 に進む