この特集のトップページへ

9.10.1 プロセッサのチューニング

 プロセッサの処理能力は,この数年飛躍的に向上するとともに,複数のプロセッサから構成されるSMPシステムも多数提供されるようになっている。一般的に,PCサーバーとして販売されているハードウェアにはIntel社のプロセッサが使用されている。Windows NT 4.0は4個のプロセッサ(OEMベンダによっては8個または16個のプロセッサ)をサポートしている。しかし,性能をチューニングする観点から見ると,ほかのハードウェアリソースと比較してプロセッサの拡張性は乏しい。
 プロセッサはシステムリソースであり,Windows NTはプロセッサの利用時間をスレッド単位で割り当てている。プロセスはプログラムの実行コードとデータから構成されるオブジェクトであり,スレッドはその実行をスケジュールされるプロセス内部の単位である。もし利用できるプロセッサの数以上のスレッドがプロセッサを必要とするならば,スレッドの待ち行列が発生する。しかし,プロセッサのボトルネックはほかのリソースのボトルネックを隠蔽しているときがある。たとえば,物理メモリが不足して仮想メモリを要求している場合,あるいはアプリケーションがディスクI/Oを過度に要求している場合には,プロセッサの負荷が増していることがある。プロセッサにボトルネックがあると思われる場合には,そのほかのハードウェアリソース,特にメモリとディスクについても調査し,判断する必要がある。
 利用率が95%以上であり,同時にトランザクションの応答時間が目標値以下であるならば,プロセッサはボトルネックではなく,最大限に活用されていることになる。もし95%以上の利用率でトランザクションの応答時間が大きければ,利用可能なプロセッサリソースに対して作業負荷が多すぎることを示している。その場合は,チューニングが必要になる。具体的には,プロセッサを増やしたり,高速なプロセッサを使用したりするのが一般的であろう。次がスケジューリング,さらにアプリケーションを修正することになる。

プロセッサの監視オブジェクトとカウンタ

 プロセッサの性能を観察する場合は,タスクマネージャやリソースキットで提供される各種のツールを利用することができる。しかし,本書ではSQL Serverで提供されるパフォーマンスモニタを利用する方法について説明する。プロセッサの性能を観察および評価する場合にはパフォーマンスモニタのProcessorオブジェクトおよびSystemオブジェクトに着目する。これらのオブジェクトのなかにはいくつかの測定カウンタが用意されているが,そのなかでも以下に示すカウンタの値を観察する。

Fig.9-69 パフォーマンスモニタ(プロセッサ)

○Processor:% Processor Time
 このカウンタはプロセッサの使用率を示しており,この使用率が一貫して高い値を示す場合はプロセッサのボトルネックになっている可能性がある。プロセッサのボトルネックによる性能問題を発生させないためにはこのプロセッサの使用率が一貫して80%以下であることが好ましい。マルチプロセッサの場合は,System:% Total Processor Timeカウンタの値も調べる必要がある。Processor:% Processor Timeカウンタ値が一貫して80%を超えるようであれば,ProcessオブジェクトおよびThreadオブジェクトの関連インスタンス*1で% User Timeカウンタの値を監視し,特定のインスタンスが過度にプロセッサを使用していないか調べる。まず,Processor:% Privileged Timeカウンタ値とProcessor:% User Timeカウンタ値を調べる。 Processor:% Privileged Timeカウンタはプロセスがカーネルモードでプロセッサを使用している比率を示している。Processor:% User Timeカウンタはプロセスがユーザーモードでプロセッサを使用している比率を示している。Processor:% User Timeカウンタ値の比率が高ければ,アプリケーションプロセスおよびスレッドを,Processor:% Privileged Timeカウンタ値の比率が高ければシステムサービスプロセスとスレッドを,それぞれ調べ,最もプロセッサを使用しているプロセスあるいはスレッドを探す。このプロセスあるいはスレッドがSQL Serverのサーバープロセスあるいはスレッドであれば,プロセッサのボトルネックの原因の第一はSQL Serverのサーバープロセスまたはスレッドであると判断できる。
 SQL Serverのサーバープロセスが使用しているプロセッサリソースを調べるには,すでに説明したSQL Serverプロファイラを利用して[CPU]データ列を観察する以外に次の2つの方法がある。

【方法1】
 sysprocessesテーブルには,SQL Serverで起動されているサーバープロセスにかかわる情報が格納されている。このシステムテーブルに以下のSQLステートメントを実行することで,最もプロセッサを使用しているプロセスが得られる。

  SELECT spid, kpid, status, program_name, cpu, physical_io, memusage
      FROM sysprocesses

 このSQLステートメントの実行結果はFig.9-70に示すとおりである。この出力結果から,cpu,physical_io,memusageという各データ列の利用状況を調べる。これらのリソースを最も使用しているspid(プロセスID)およびprogram_name(プログラム名)を探索する。

Fig.9-70 上記のステートメントを実行したsysprocessesテーブルの出力結果

【方法2】
 もう1つの方法は,DBCC SQLPERFステートメントを使用する方法である。DBCC SQLPERFステートメントを次のように指定して実行する。

   DBCC SQLPERF(THREADS)

 このステートメントの実行結果は,Fig.9-71に示すとおりである。ここで,IO,CPU,MemUsageという各データ列を調べる。この出力結果から,CPU,IO,MemUsageの各データ列の利用状況を調べる。これらのリソースを最も使用しているSpid(プロセスID)を探索する。

Fig.9-71 DBCC SQLPERF(THREDS)ステートメントの実行例

○System:Processor Queue Length
 このカウンタは,プロセッサの割り当てを待っているスレッドの数を示す(SMPシステムでは,全プロセッサの割り当て待ちスレッド数の和が表示される。したがって,その場合は,このカウンタ値をプロセッサ数で除算した結果がプロセッサあたりの平均待ち行列を示している)。プロセッサの割り当てを待っているスレッドがなく,プロセッサの使用率が低いのであれば,システムのどこか別のところ(最も考えられるのはディスクサブシステム)が性能のボトルネックとなっている。
 大雑把にいって,このカウンタの値が各プロセッサあたり2をはるかに超える場合は,サーバーのプロセッサが処理できる範囲を超えて作業要求を受信していることになるので,詳細な調査が必要となる。たとえば,このカウンタの値がプロセッサあたり2以上で,各スレッドのプロセッサ使用率がほとんど同程度であれば,プロセッサのボトルネックといえる。特定のプロセスやスレッドがプロセッサを占有し,ほかのスレッドが待ち行列で待機させられていないか,Processor:% Processor TimeカウンタおよびThread:% Processor Timeカウンタの値を観察し,50%を超えているプロセスまたはスレッドを調べる。SQL Serverのプロセスおよびスレッドだけを調べたい場合には,Processor:% Processor Timeカウンタの解説で示したSELECTステートメントまたはDBCC SQLPERFステートメントで調査する。

○System:Context Switches/sec
 このカウンタは,Windows NTおよびSQL Serverが1秒間にコンテキストを切り替えた回数を示す。コンテキストの切り替えはプロセッサリソースを消費するうえ,切り替えが過度に及ぶとシステムを動作不能にしてしまうこともある。  Processor:% Processor Timeカウンタの値が常に80%を超え,かつ,このカウンタの値が1000〜1500を超えるようであれば,複数の共有リソース(ネットワークカード,ビデオディスプレイ,デバイスドライバなど)に問題があると考えられる。この場合,System:% Total Privileged TimeカウンタとSystem:% Total User Timeカウンタが双方とも50%程度,System:% Total Processor Timeカウンタが100%程度であれば,複数のコンテキストが共有リソースで競合を引き起こしている。

○Processor:% Privileged Time とProcessor:% User Time
 Processor:% Privileged Timeカウンタは,プロセッサが特権モードで動作している(Windows NTのサービスが動作している)割合を示す。また,Processor:% User Timeカウンタは,プロセッサがユーザーモードで動作している(アプリケーションおよびサブシステムが動作している)割合を示す。  Processor:% Privileged Timeカウンタの値が20%を超えており,かつProcessor:% User Timeカウンタの値が80%に満たない場合は,SQL Serverがシステムに過度のI/O要求を発行している可能性がある。また,Processor:% Privileged Timeカウンタの値が50%を超えており,かつProcessor:% User Timeカウンタの値が50%に満たない場合には,Windows NTサービスやデバイスドライバなどに問題があると考えられる。

○Processor:Interrupts/sec
 このカウンタは,I/Oデバイスからサービス要求が発行された頻度を示している。使用されているプロセッサタイプとクロックによって異なるが,このカウンタの値が1000以上であれば,プロセッサのボトルネックになっている可能性がある。また,その原因としてディスクコントローラやネットワークコントローラなどのI/Oコントローラに問題がある可能性がある。  このカウンタの値は,一般にSystem:System Call/secカウンタの値とよく似た軌跡を描く。System:System Call/secカウンタの値が異常に大きなときは,Processor:Interrupts/secカウンタの値と同様にI/Oコントローラに問題があると思われる。
 通常,Processor:Interrupts/secカウンタは500程度の値を示す。


  1. Processオブジェクトであればパフォーマンスモニタの[インスタンス]にプロセス一覧が表示されるので,調べたいプロセスを選択する。最初はすべてのインスタンスを選択するか,ユーザープロセスあるいはユーザースレッドをすべて選択する。
前へ Chapter 9 36/46 次へ