More Related Content
Similar to COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング
Similar to COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング (20)
More from Masayuki Ozawa (18)
COD2012 C3 : SQL Server 2012で振り返る、SQLOSのスレッド スケジューリング
- 2. はじめに
• SQL Server のスレッド スケジューリングとは
– ノンプリエンプティブなスレッドスケジューリング
– プリエンプティブ or ノンプリエンプティブ
©2012 Microsoft Corporation. All Rights
2
Reserved.
- 3. Agenda
• SQL Server スケジューリングの歴史 (5分)
• SQL Serverのスレッド スケジューリング(25分)
• SQLOS スケジューリング関連コンポーネント(15分)
• 質疑応答 (5分)
©2012 Microsoft Corporation. All Rights
3
Reserved.
- 5. SQL Server Schedulingの歴史
• SQL Server 6.x
Preemptive Thread
• SQL Server 7/2000
Non-Preemptive Thread (UMS)
• SQL Server 2005/2008/2012
Non-Preemptive Thread (SQLOS)
©2012 Microsoft Corporation. All Rights
5
Reserved.
- 8. PreemptiveとNon-Preemptive
• Preemptive (Windows)
システム (OS) が、CPUを使用するスレッドを決定する。
• Non-Preemptive (SQL Server)
ユーザープログラム(スレッド自身)が、 CPUを使用するスレッドを決定する。
©2012 Microsoft Corporation. All Rights
8
Reserved.
- 10. Windowsのスケジューリング
CPUを使用するスレッドが切り替わるタイミング
• クォンタムの終了
実行中のスレッドが割り当てられたクォンタムを使い切った(CPU時間を使い
切った)
• 自発的な待機
イベント、セマフォなどの同期オブジェクト上で待機が発生
• プリエンプション
より高い優先度のスレッドによる横取り
©2012 Microsoft Corporation. All Rights
10
Reserved.
- 12. SQL Server(SQLOS)のスレッド管理
• Running状態
CPUを使用しているスレッド
• Runnable状態
CPUの使用権を待機しているスレッド (Runnable
Queueに存在している)
• Waiting状態
同期オブジェクト上で待機しているスレッド (Wait
Queueに存在している)
©2012 Microsoft Corporation. All Rights
Reserved.
- 14. SQLOS Yield APIの処理
1. コールしたスレッド(自分)をRunnable Queueに
追加する
SOS上Runnable, Windows OS上はRunning
2. Runnable Queueで待機している先頭のスレッド
をRunning状態にする
3. 別のスレッドがRunning状態してくれるのを待機
する
Windows OS上は待機状態
©2012 Microsoft Corporation. All Rights
14
Reserved.
- 15. Preemptiveの世界 (Code Sample)
CSample::Execute()
{
Compile();
Optimize();
Execute();
}
©2012 Microsoft Corporation. All Rights
15
Reserved.
- 16. SQLOSの世界 (Code Sample)
CSample::Execute()
{
Compile();
Yield();
Optimize();
Yield();
Execute();
}
©2012 Microsoft Corporation. All Rights
16
Reserved.
- 17. Quiz
SQLOSの世界において、次のコードはどこが問題か?
VOID WaitForLockResource (HANDLE hlockEvent)
{
//
// ロックリソースが解放されるまで待機する
//
WaitForSingleObject(hlockEvent, LOCK_TIMEOUT);
}
©2012 Microsoft Corporation. All Rights
17
Reserved.
- 18. Answer
• Running状態(SQLOS上)のまま待機に入って
いる (CPUを使用しない状態)
• SQLOSの世界では、Windows APIの待機系関
数(同期オブジェクト)を直接使用することがで
きない
• SQLOSが提供する同期オブジェクトを使用しな
ければならない
©2012 Microsoft Corporation. All Rights
18
Reserved.
- 19. SQLOS待機系 APIの処理
Waitメソッド
1. コールしたスレッド(自分)をWait Queueに追加する
2. Runnable Queueで待機している先頭のスレッドをRunning状態に
する
3. 待機状態に入る(シグナル化待ち)
Signalメソッド
1. 同オブジェクトで待機しているスレッドをWait Queueからとりだす
2. 取り出したスレッドを、Runnable Queueに追加する (Runnable状
態にする)
©2012 Microsoft Corporation. All Rights
19
Reserved.
- 20. まとめ:SQLOSスレッド状態の遷移
• Yield API 呼び出し
Running ---> Runnable (Runnable Queue)
• SOS 待機系 API 呼び出し
Running ---> Waiting (Wait Queue) ---> 同期オブ
ジェクトのシグナル化 ---> Runnable (Runnable
Queue)
©2012 Microsoft Corporation. All Rights
20
Reserved.
- 22. SOS Schedulers
• スレッドのスケジューリングを管理しているクラス
インスタンスはDMV sys.dm_os_schedulersで確認できる
CPU or Coreを表現するクラス
Runnable キューを保持している
Yield APIやSOS 待機系 API は最終的に、SOS SchedulerクラスのAPIを呼
び出して、スレッドを操作している (SOS上のContextSwitch)
• SOS Schedulerには2つのタイプがある
Hidden Scheduler
システム スレッドが所属するスケジューラ
Visible Scheduler
ユーザーリクエストを実行するスレッドが所属するスケジューラ
1 CPU or Core 毎に 1インスタンス生成される
©2012 Microsoft Corporation. All Rights
22
Reserved.
- 23. SystemThread and Worker
• SystemThread
OSのスレッドを表現するクラス
DMV sys.dm_os_threadsで確認できる
スレッドのスレッドローカルストレージ(TLS)に保存されている
• Worker
ワーカースレッドを表現するクラス
SystemThreadとバインドされて初めて使用可能となる
DMV sys.dm_os_workersで確認できる
©2012 Microsoft Corporation. All Rights
23
Reserved.
- 24. Thread Mode
• Non-Preemptive Mode
– SOS Schedulerで管理されているスレッド モード
• これまでに説明してきたスレッド、自身でスレッドスケジュー
リングしなければならない
• SQL Serverのほとんどのスレッドは、Non-Preemptiveスレッ
ド
• Preemptive Mode
– SOS Schedulerの管理下にないスレッド モード
• SOS 待機系関数を呼び出さないで待機状態となる可能性が
ある場合
e.g Windows APIコール (GetGroupMember)
©2012 Microsoft Corporation. All Rights
24
Reserved.
- 25. SQL Server2012 Preemptive スレッド
• ヘルスチェック スレッド
sp_server_diagnosticsスレッド
Lease HandShake スレッド
など
• Preemptiveの必要性
ユーザーリクエストに干渉されないため
©2012 Microsoft Corporation. All Rights
25
Reserved.
- 26. Scheduler Monitor
• Preemptiveスレッド
• 5秒間隔で各スケジューラを監視
e.g Non-Yielding Scheduler監視
15 秒間 スケジューラを解放しないスレッドがいる (エラーロ
グ17833, mini-dump)
How To Diagnose and Correct Errors 17883, 17884, 17887,
and 17888
http://msdn.microsoft.com/en-us/library/cc917684.aspx
©2012 Microsoft Corporation. All Rights
26
Reserved.
- 28. 質疑応答
©2012 Microsoft Corporation. All Rights
28
Reserved.
- 29. 最後に
©2012 Microsoft Corporation. All Rights
29
Reserved.