More Related Content
Similar to C21 SQL Server のスレッド管理 by 古賀啓一郎
Similar to C21 SQL Server のスレッド管理 by 古賀啓一郎 (20)
More from Insight Technology, Inc.
More from Insight Technology, Inc. (20)
C21 SQL Server のスレッド管理 by 古賀啓一郎
- 2. Agenda
SQL Server スレッド スケジューリングの歴史 (5分)
SQL Serverのスレッド スケジューリング(30分)
SQL Serverのスレッド モード (5分)
質疑応答 (5分)
©2012 Microsoft Corporation. All Rights Reserved. 2
- 4. SQL Server Schedulingの歴史
SQL Server 6.x
Preemptive Thread
SQL Server 7/2000
Non-Preemptive Thread (UMS)
SQL Server 2005/2008/2008R2/2012
Non-Preemptive Thread (SQLOS)
©2012 Microsoft Corporation. All Rights Reserved. 4
- 5. Why non-preemptive scheduling
“RDBMSエンジンに関する調査研究によると、パフォーマンスと
スケーラビリティの要件をみたすためには、non-preemptiveス
ケジューリングの効用が必要だということがわかった。”
“As adequate research shows for RDBMS engine to meet
performance and scalability requirements it needs to leverage
non-preemptive scheduling.”
From
http://blogs.msdn.com/b/slavao/archive/2005/02/05/367816.
aspx
©2012 Microsoft Corporation. All Rights Reserved. 5
- 7. PreemptiveとNon-Preemptive
• Preemptive (Windows)
システム (OS) が、CPUを使用するスレッドを決定する。CPU使用
権の横取り。
• Non-Preemptive (SQL Server)
ユーザープログラム(スレッド自身)が、 CPUを使用するスレッド
を決定する。
©2012 Microsoft Corporation. All Rights Reserved. 7
- 8. Non-Preemptive実現性
システムの観点から見て、完全なNon-Preemptiveス
ケジューリングを実装することはできない
ただし、プロセスという閉じた観点であれば、Non-
Preemptiveスケジューリングは実装可能
©2012 Microsoft Corporation. All Rights Reserved. 8
- 9. Windowsのスケジューリング
CPUを使用するスレッドが切り替わるタイミング(コンテキストスイッチ)
• クォンタムの終了
実行中のスレッドが割り当てられたクォンタムを使い切った(CPU
時間を使い切った)
• 自発的な待機
イベント、セマフォなどの同期オブジェクト上で待機が発生
• プリエンプション
より高い優先度のスレッドによる横取り
©2012 Microsoft Corporation. All Rights Reserved. 9
- 10. SQL Serverのスケジューリング
CPUを使用するスレッドが切り替わるタイミング(コンテキストスイッチ)
• SQLOS Yield APIの呼び出し
スレッドが任意のタイミングで自らCPUの使用権を放棄する
• 自発的な待機
同期オブジェクト上での待機が発生 (ロック、ラッチ待ちなど)
©2012 Microsoft Corporation. All Rights Reserved. 10
- 11. スレッドを管理しているコンポーネント
• SOS Scheduler
– Yield APIや、同期オブジェクトで待機する場合は最終的に、SOS
SchedulerクラスのAPIを呼び出して、スレッドを操作している
• スケジューラーごとにワーカープールを持っている
• DMV sys.dm_os_shceduler
©2012 Microsoft Corporation. All Rights Reserved.
- 12. スレッドの状態
• Running状態
SQLOS上でCPUを使用しているスレッド
• Runnable状態
SQLOS上でCPUの使用権を待機しているスレッド
• Suspended (Waiting) 状態
同期オブジェクト上で待機しているスレッド
©2012 Microsoft Corporation. All Rights Reserved. 12
- 13. スレッドの状態遷移
同期オブジェクト
CPU使用権放棄 Running 取得
同期オブジェクト
待機
Suspended
Runnable
CPU使用権譲受 (Waiting)
同期オブジェクト
取得
©2012 Microsoft Corporation. All Rights Reserved.
- 14. スレッド状態確認
• DMV sys.dm_os_workers
– state カラム
©2012 Microsoft Corporation. All Rights Reserved.
- 15. スレッド状態確認
• DMV sys.dm_os_workers
– state カラム
©2012 Microsoft Corporation. All Rights Reserved.
- 16. SQLスレッドのスケジューリング
• SQLのスレッドは、他のスレッドからCPU使用権を譲りうける
ことで初めて動作できる
– Cooperative Scheduling
コンテキストスイッチ
T1
T1 がT2にCPU T 2がT1にCPU
使用権を譲渡 使用権を譲渡
T2
コンテキストスイッチ コンテキストスイッチ
Running State
Runnable State
©2012 Microsoft Corporation. All Rights Reserved.
- 17. CPUの使用権譲渡とは
イベントオブジェクト(信号)をシグナル状態(青)に変えてあげること
T1
T1 は誰かが自分のイベントオブジェク
T1 は、T2が待機しているイベン
トをシグナル化してくれるのを待機する
トオブジェクトをシグナル化する
T2
Signaled State Event
Not Signaled State Event
Running State
Runnable State
©2012 Microsoft Corporation. All Rights Reserved.
- 18. コンテキストスイッチ時の重要な処理
• I/Oキューのチェック
– 完了しているI/Oのチェックと、I/O完了ルーチンの呼び出し
T1 Call Stack
… Yield API コール ntdll!ZwSignalAndWaitForSingleObject+0xa
kernel32!SignalObjectAndWait+0x110
sqldk!SystemThread::SignalAndWait+0x2a
sqldk!SOS_Scheduler::Switch+0xb5
sqldk!SOS_Scheduler::SuspendNonPreemptive+0xd2
コンテ … I/O キューのチェック ….
キスト
スイッ … I/O 要求ごとの完了ルーチンを呼び出す
チ処理
… Tnのイベントオブジェクトシグナル化
©2012 Microsoft Corporation. All Rights Reserved.
- 19. I/O完了ルーチン:具体例 I/Oラッチ
I/Oラッチ:物理I/O中のメモリバッファにかける排他のしくみ
T1 ① I/Oラッチをバッファにかける
② I/O完了ルーチンを設定 (ラッチ解放処理) I/O要求発行
③ ReadFile/WriteFile API 非同期コール
④ I/O キューに発行したI/O要求を追加
I/O完了
⑤ Yield API コール
コンテ
キスト
スイッ ⑥ I/O キューのチェック
チ処理
⑦ I/O完了ルーチンの呼び出し (I/Oラッチの解放)
⑧ Tnのイベントオブジェクトシグナル化
©2012 Microsoft Corporation. All Rights Reserved.
- 20. I/O完了ルーチン:コールスタック例
0:073> k
Child-SP RetAddr Call Site
00000000`0a8fcc00 000007fe`d7f21e10 sqlmin!FCB::PostRead+0x14
00000000`0a8fcc50 000007fe`d7f2163c sqlmin!BPool::ReadPageCompletion+0xe7
00000000`0a8fccc0 000007fe`db8709a8 sqlmin!FCB::IoCompletion+0x97
(Inline Function) --------`-------- sqldk!SOS_IOCompRequest::ExecuteCompRoutine+0x6
00000000`0a8fcd10 000007fe`db83222f sqldk!IOQueue::CheckForIOCompletion+0x18e
00000000`0a8fce10 000007fe`db83c169 sqldk!SOS_Scheduler::SwitchContext+0x67
00000000`0a8fd0b0 000007fe`db845ebc sqldk!SOS_Scheduler::SuspendNonPreemptive+0xd2
(Inline Function) --------`-------- sqldk!SOS_Scheduler::Suspend+0x20
00000000`0a8fd0f0 000007fe`db850ddf sqldk!SOS_Task::Sleep+0x1a8
00000000`0a8fd150 000007fe`d7f2258b sqldk!Worker::OSYieldNoAbort+0x2f
(Inline Function) --------`-------- sqlmin!SOS_Task::OSYieldNoAbort+0x263
00000000`0a8fd180 000007fe`d7f07925 sqlmin!BPool::GetFromDisk+0x81b
...
©2012 Microsoft Corporation. All Rights Reserved.
- 21. その他のIO完了ルーチン
[代表例]
• ページ整合性検証
– チェックサム (既定)
• Set the PAGE_VERIFY Database Option to CHECKSUM
http://msdn.microsoft.com/en-us/library/bb402873.aspx
– Stale Read Detection (Trace Flag 818)
• Additional SQL Server diagnostics added to detect unreported I/O problems
http://support.microsoft.com/kb/826433
©2012 Microsoft Corporation. All Rights Reserved.
- 22. I/Oキュー
• I/Oキューの数
– sys.dm_os_schedulers の pending_disk_io_count
• I/O要求の詳細
– sys.dm_io_pending_io_requests
©2012 Microsoft Corporation. All Rights Reserved.
- 23. IO完了ルーチン処理中の確認
• DMV sys.dm_os_workers
– is_in_polling_io_completion_routine カラム
©2012 Microsoft Corporation. All Rights Reserved.
- 25. ノンプリエンプティブスレッドの問題点
問題例
• 処理時間の長い Windows API 呼び出し
• ユーザーが作成した拡張ストアドプロシージャの呼び出し
CreateFile では内部でイ
ベントオブジェクトを使
用し、自発的に待機状
T1 態となることがある
I/O要求発行
… CreateFile API 呼び出し/ 完了待ち
©2012 Microsoft Corporation. All Rights Reserved.
- 26. 解決策:プリエンプティブスレッド
スレッドを管理できなくなるタイミングで、プリエンプティブ
モードにスイッチする
T1 CPU使用権をT2に譲渡した後、
SOSで管理されないスレッドモー
ドにスイッチ
T2
I/O要求発行
… CreateFile API 呼び出し/ 完了待ち
©2012 Microsoft Corporation. All Rights Reserved.
- 27. スレッドモードの確認
• DMV sys.dm_os_workers
– Is_preemptive カラム
©2012 Microsoft Corporation. All Rights Reserved.
- 28. プリエンプティブモードで動くスレッド
• ヘルスチェック スレッド
– sp_server_diagnosticsスレッド
– Lease HandShake スレッド (Availability Group)
– Scheduler Monitorスレッド
など
©2012 Microsoft Corporation. All Rights Reserved.
- 29. まとめ
• SQL Server はNon-Preemptiveなスレッドスケジューリング
を実装している
• Non-Preemptiveなスレッドは、自身でCPU時間を管理す
る
• SOSのコンテキストスイッチ時にはI/Oの完了がチェックさ
れる
• I/O完了時には、I/O完了ルーチンが実行される
• SQL Serverのスレッドは必要に応じてプリエンプティブ
モードにスイッチする
©2012 Microsoft Corporation. All Rights Reserved.
- 30. 参考
SQL Serverのスレッドスケジューリング (DB Online)
http://enterprisezine.jp/dbonline/detail/4157
http://enterprisezine.jp/dbonline/detail/4168
SQLOS - unleashed
http://blogs.msdn.com/b/slavao/archive/2005/02/05/367816.aspx
SQL Server 2008 SQLOS
http://blogs.technet.com/b/josebda/archive/2009/03/30/sql-server-2008-
sqlos.aspx
Q&A on Latches in the SQL Server Engine….
http://blogs.msdn.com/b/psssql/archive/2009/07/08/q-a-on-latches-in-the-sql-
server-engine.aspx
©2012 Microsoft Corporation. All Rights Reserved.
- 32. © 2011 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market
conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.
©2012 Microsoft Corporation. All Rights
MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.
32
Reserved.