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

プロセッサのボトルネックの解決法

 System:Processor Queue Lengthカウンタの値が2あるいはそれを超える場合には,プロセッサのボトルネックを疑ってよい。そして,次に何が原因かを判断する。メモリやディスクがボトルネックになっている場合もあり得る。プロセッサを特別使用している特定のプロセスがなければ,プロセッサ自体の処理能力が低いということなので,高速なプロセッサに変更するか,プロセッサを追加する。プロセッサを専有しているアプリケーションがあれば,そのアプリケーションの稼働時間を変更するか,アプリケーション設計を見直す。もしSQL Serverがプロセッサを専有しているのであれば,SQL Serverのプロセスおよびスレッドを上に説明した方法で調べ,プロセッサを専有している特定のプロセスあるいはスレッドがなければ,プロセッサの処理能力が低いことになるので,高速のプロセッサに変更するか,プロセッサを追加する。
 一般的に,プロセッサがボトルネックとなっている場合,その解決は,(1)ハードウェアレベル(2)システムレベル(3)アプリケーションレベル,という3つの観点から検討する必要がある。ハードウェアレベルで解決策を考えるのであれば,サーバーにプロセッサを追加するか,より高速なプロセッサに変更する。システムレベルで解決策を考えるのであれば,SQL Serverのサーバープロセスの優先度を変更する。また,アプリケーションレベルの解決策を考えるのであれば,クエリをチューニングしたりインデックスを改善したりしてI/Oを減少させ,システムの作業負荷を減らす。
 実際には,次のような点について対策を検討する。

  • プロセッサリソースを消費しているプロセスインスタンスを探し,テーブルの正規化および非正規化が適切であるか,適切なインデックスが選択されているか,プロセッサリソースを消費するような過度のI/Oが発生していないかなど,論理データベース設計,インデックス設計,アプリケーション設計を見直す
  • Processor:% Privileged Timeカウンタの値が20%を超えており,かつProcessor:% User Timeカウンタの値が80%に満たない場合,あるいはProcessor:Interrupts/secカウンタの値が3000を超えている場合は,ディスクコントローラやネットワークコントローラを調べる。ネットワークカードもプロセッサを消費する要素の1つであるから,もし,古いネットワークカードを使用しているのであれば,なるべく高速なネットワークカードに変更したほうがよいかもしれない
  • SQL Serverの稼働しているコンピュータがSMPシステムであれば,クエリの並列実行に使用するプロセッサ数を変更する。SQL Server Enterprise Managerを使用して[SQL Serverのプロパティ]ダイアログボックスを表示し,[プロセッサ]パネルを開いて[使用可能なプロセッサをすべて使用]を選択する ○SQL Serverの優先度を上げる。SQL Server Enterprise Managerで[SQL Serverのプロパティ]ダイアログボックスを表示し,[プロセッサ]パネルを開いて[Windows NTでのSQL Serverの優先度を上げる]をチェックする。あるいは,sp_configureシステムストアドプロシージャでpriority boostオプションに1を設定する
  • System:Context Switches/secカウンタの値が大きく,System:Processor Queue Lengthカウンタの値が2以上であれば,SQL Serverにおけるチューニングの常道に従ってコンテキストの切り替えスケジュールをWindows NTファイバーに変更する。SQL Server Enterprise Managerで[SQL Serverのプロパティ]ダイアログボックスを表示し,[プロセッサ]パネルを開いて[Windows NTファイバーを使用]をチェックする。この変更は,8個を超えるような大規模なマルチプロセッサ構成である場合に特に効果を発揮する。コンテキストの切り替えスケジュールをWindows NTファイバーとするには,sp_configureシステムストアドプロシージャを使用してlightweight poolingオプションに1を設定する。そのうえでSystem:Context Switches/secカウンタの値とSystem: Processor Queue Lengthカウンタの値を監視し,その効果を調査する*1
  • SQL Server上で稼働している不必要なプロセスを停止する
  • Windows NT上の不要なサービスを停止する。多くのメモリを消費するサービスとしては,RAS,TCP/IP,RAIDなどがある。サーバーにプリンタが接続されていなければSpoolerサービスは必要ないし,IDEインターフェイスを使用していなければATDISKドライバも不要である
  • プロセッサリソースを消費するクエリはピーク時間帯外に動作させる
  • プロセッサを追加するか,より高速なプロセッサにする
  • 物理メモリが不足気味であれば物理メモリを追加する。物理メモリを追加すれば,仮想メモリの利用頻度が減る分だけプロセッサの負担が軽減され,プロセッサの使用率も減少する可能性がある

  1. 効果の調査にあたっては,Processor:% Processor Timeカウンタについての説明で述べたSELECTステートメントやDBCC SQLPERFステートメントを利用するとよい。
前へ Chapter 9 37/46 次へ