Windows Server のパフォーマンス解析入門(その1)

最近、Windows Server を使ったシステムのパフォーマンス問題の調査についての質問を続けていただきましたので、私が普段調べている内容を数回に分けて書いてみようと思います。しかし、そもそもパフォーマンスの問題といっても事象や原因は様々ですので、ご紹介する内容は一例として読んでいただければ幸いです。

最初の一歩はタスクマネージャー

もし性能が出ないアプリケーションが動作している状態で調査をする場合、私は最初にタスクマネージャーを確認しています。Windows Server 2012からはタスクマネージャーが新しくなっていて表示される情報が増えて便利になっています。こちらのスクリーンショットをご覧ください。

taskmanager1

 

タスクマネージャーを開いて最初に見るのはCPUの使用率でしょうか。CPUの使用率は9%程度で安定して推移しています。9%ですのでパフォーマンスボトルネックにはなっていないように見えますが、もう少し詳しく見る必要があります。タスクマネージャーのグラフを右クリックして [グラフの変更] – [論理プロセッサ] をクリックします。

taskmanager2

するとグラフの表示が変更されて論理プロセッサ毎のCPU使用率が表示されます。このサーバーは12の論理コアが搭載されているのでグラフは12個表示されます。

taskmanager3

このグラフを表示してもCPUがボトルネックになっているようには見えないかもしれません。しかしこのグラフ、各論理コアで瞬間的にCPU使用率が100%近くに跳ね上がっているように見えると思います。このパターンは注意が必要です。実はこのスクリーンショットはシングルスレッドアプリケーションを動かしていてCPUがボトルネックになっています。シングルスレッドアプリケーションがCPUを最大限使用すると1つの論理コアが占有されてしまいます。このサーバーは12論理コアですので1つの論理コアを占有するとサーバー全体として8.3% 程度のCPU使用率になるはずです(100 / 12 ≒ 8.33)。最初のスクリーンショットを見るとCPUの使用率が8-10%程度で推移していることから、シングルスレッドアプリケーションが動き続けていることも推測できます。その場合はタスクマネージャーの [詳細] タブを開いてプロセス毎のCPU使用率を確認します。

taskmanager4

すると、CPUの使用率が8%程度で推移しているプロセスを見つけることができるかもしれません。もし、このプロセスが調査対象のアプリケーションに関連しているのであれば、CPUボトルネックを疑いましょう。(個人的にはバッチ処理などでこのケースが多い気がします)

 

カーネルでのCPU使用率も確認

このように、サーバー全体のCPU使用率が低く見えてもCPUがボトルネックになっているケースはほかにもあります。先とは違うPCですが、こちらのスクリーンショットをご覧ください。

taskmanager5

このスクリーンショットもCPUの使用率がほぼ一定で推移していますが、このケースもCPUボトルネックを疑いたいところです。個人的な経験に基づく感覚ですが、もしサーバーに搭載されているCPUがIntel社のCPUで Hyper-Threading が有効で、アプリケーションがHyper-Threadingをうまく使えない場合はCPU使用率が40%-60%あたりで推移することが多いです。ですので、このケースもCPUボトルネックを疑います。

さらにタスクマネージャーでCPU使用率を確認したときに合わせて確認しておきたいのはカーネルのCPU使用率です。タスクマネージャーのCPU使用率のグラフを右クリックして [カーネル時間を表示する]をクリックします。

taskmanager6

するとCPU使用率のグラフ表示がすこし変更されてWindowsのカーネルで使用した率が表示されます。

taskmanager7

もし事前の予想よりもCPU使用率が高く、カーネルの使用比率が高い場合はデバイスドライバの問題なども想定しながら調査を進めていくことになります。ちなみにこれらのスクリーンショットはウィルス対策ソフトでフルスキャンを実施した際のものです。ウィルス対策ソフトもカーネル部分で動くモジュールが多いことからこのような状態になります。

今回ご紹介した例はごく一部ですが、タスクマネージャーには重要な情報が表示されていることを理解していただけると幸いです。タスクマネージャーでCPUボトルネックの可能性が出てきたら、ほかのツールも使って詳細を調べていくことになります。次回はそれらのツールについてもご紹介していきます。