このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ

目次

SQLOSスケジューラ

  • SQL Server 7.0、SQL Server 2000ではUMS(User Mode Scheduler)と呼ばれていた。
  • SQL Server 2005からSQLOSスケジューラと改称された。
  • SQL ServerはWindowsアプリケーションなので、Windowsスケジューラにより管理されている。ただし、Windowsスケジューラだけで管理されていると効率的にCPUリソースを使用できない。これを解決するのがSQLOSスケジューラである。
  • SQL Serverの起動時にCPU数あるいはコア数と等しい数のSQLOSスケジューラが作成される。
    • ただし、SQL ServerのエディションやAffinity Mask*1の設定によって、CPU数あるいはコア数よりも少ない場合がある。
  • SQLOSスケジューラはスレッドをワーカーとして、ノンプリエンプティブ方式で取り扱う。
    • 一度SQLOSスケジューラ上で実行状態になったスレッドは、自らが譲り渡すまでスケジューラの使用権を取り上げられることがない。1つのスレッドが使用権を保持し続けると、SQL Server全体のスループットが低下するため、長くても各スレッドは数ミリ秒の期間を占有した後には、他のスレッドに使用権を譲るように作られている。
    • SQL Server自体はWindows上で動作するアプリケーションであるため、Windowsスケジューラの観点から見れば、SQLOSスケジューラ配下のすべてのスレッドはプリエンプティブで動作している。

SQLOSスケジューラを構成する要素

  • スケジューラ
  • ワーカー
    • ワーカーはSQL Server内のオブジェクトであるが、Windowsの管理オブジェクトであるスレッドと関連付けられる。
      • 1つのワーカーに対して、必ずWindowsスレッドが1つ存在する。
  • ワーカースレッドプール
    • 各スケジューラで使用可能なワーカーの数を管理うする。
    • 各スケジューラの最大ワーカー数は「(max worker threads)/CPU数」である。
    • ワーカースレッドプールに使用可能なワーカーが存在しないが、ワーカーの使用要求があると、最大数に達していない場合は新たにワーカーが作成される。一方、すでに最大数に達している場合は、使用要求をしたクライアントはワーカーリクエストキューに追加され待機状態になる。
  • ランナブルキュー(Runnable Queue)
    • 各スケジューラは1つのランナブルキューを持つ。
    • スケジューラは1つのワーカーだけをアクティブにする。もし2個以上のワーカーが実行可能である場合は、ランナブルキューに追加され、スケジューラが使用可能になるのを待つ。
  • ワークリクエストキュー(Work Request Queue)
    • 各スケジューラは、ワーカースレッドプールに作業を実行するためのワーカーを保持する。
    • ワーカーの数が不足*2したために処理が実行できないタスクは、ワークリクエストキューに追加され、ワーカーが使用可能になるのを待つ。
  • I/Oリクエストリスト(I/O Request List)
    • I/Oリクエストを発行したワーカーは、要求したI/Oが完了するまでの期間、I/Oリクエストリストに追加される。
    • WindowsのI/Oが完了し、SQL ServerがI/Oの後処理(内部リソースの解放など)を終了した時点で、I/Oリクエストが完了したとみなされる。
  • ウェイターリスト(Waiter List)
    • ワーカーの処理実行時に必要となるSQL Server内のリソース(ロックやラッチなど)を獲得できない場合に、ワーカーはウェイターリストに追加される。
    • ウェイターリストはSQL Server内のオブジェクトごとに存在する。
    • ウェイターリストに登録されているワーカーはWaitForSingleObjectEx関数を使って待ち状態になる。
      • WaitForSingleObjectEx関数にタイムアウト時間としてINFINITEを指定すると、スレッドは無限の待ち状態になる。INFINITEから別の値に変更されるまで、WindowsスケジューラはそのスレッドにCPUリソースを割り当てない(待ち状態だから)。そのため、スレッドは実行状態にならない。

SQLOSスケジューラのモニタリング

dbccコマンド

 SQL Serverのインスタンスにログインして、次のコマンドを実行するとSQLOSスケジューラの基本的な情報を確認できる。

dbcc splperf('umsstats')

 出力される情報は次の通りである。

  • Scheduler ID
    • CPU(もしくはコア)と同じ数だけ作成されたスケジューラを管理するための番号。
  • num runnable
    • ランナブルキューにリストされているワーカーの数。
    • この値が常に高い場合は、CPUリソースを待っているワーカーが常に存在することになる。そのため、要求されている作業量(実行されているクエリの数など)に対して、CPUの処理能力が追いついていないと推測できる。
  • num workers
    • コマンドを実行した時点でスケジューラが保持しているワーカーの数。
  • idle workers
    • ワーカースレッドプールに追加されているワーカーの数。
    • ここで表示されている数だけのワーカーが待機状態である。
  • work queued
    • ワークリクエストキューに追加されている処理の数。
    • ここで表示されている数だけの処理がワーカーの空きを待っている。
    • この値が常に高い場合は、次に示す可能性がある。
      • ワーカーの数が不足している。
      • 多くのワーカーが長時間ロック獲得待ちになっている。
      • 過剰な数の並列処理が行われている。

動的管理ビュー

参考文献

  • 『絵で見てわかるSQL Serverの内部構造』


*1 SQL Serverインスタンスが使用するCPU数を制御するための設定。
*2 ブロッキングや過度な並列処理によってワーカーの数が不足することがある。