SQL Serverのスレッド管理                    1
Agenda       SQL Server スレッド スケジューリングの歴史 (5分)       SQL Serverのスレッド スケジューリング(30分)       SQL Serverのスレッド モード (5分)       質疑応...
SQL Server スケジューリングの歴史                         3
SQL Server Schedulingの歴史       SQL Server 6.x         Preemptive Thread       SQL Server 7/2000         Non-Preemptive Thr...
Why non-preemptive scheduling       “RDBMSエンジンに関する調査研究によると、パフォーマンスと       スケーラビリティの要件をみたすためには、non-preemptiveス       ケジューリン...
SQL Serverのスレッド スケジューリング                           6
PreemptiveとNon-Preemptive       • Preemptive (Windows)       システム (OS) が、CPUを使用するスレッドを決定する。CPU使用       権の横取り。       • Non-...
Non-Preemptive実現性       システムの観点から見て、完全なNon-Preemptiveス       ケジューリングを実装することはできない       ただし、プロセスという閉じた観点であれば、Non-       Pre...
Windowsのスケジューリング       CPUを使用するスレッドが切り替わるタイミング(コンテキストスイッチ)       • クォンタムの終了          実行中のスレッドが割り当てられたクォンタムを使い切った(CPU      ...
SQL Serverのスケジューリング       CPUを使用するスレッドが切り替わるタイミング(コンテキストスイッチ)       • SQLOS Yield APIの呼び出し                スレッドが任意のタイミングで自ら...
スレッドを管理しているコンポーネント       • SOS Scheduler                 – Yield APIや、同期オブジェクトで待機する場合は最終的に、SOS                   Scheduler...
スレッドの状態       • Running状態          SQLOS上でCPUを使用しているスレッド       • Runnable状態         SQLOS上でCPUの使用権を待機しているスレッド       • Susp...
スレッドの状態遷移                                                                           同期オブジェクト           CPU使用権放棄           ...
スレッド状態確認       • DMV sys.dm_os_workers                 – state カラム©2012 Microsoft Corporation. All Rights Reserved.
スレッド状態確認       • DMV sys.dm_os_workers                 – state カラム©2012 Microsoft Corporation. All Rights Reserved.
SQLスレッドのスケジューリング       • SQLのスレッドは、他のスレッドからCPU使用権を譲りうける         ことで初めて動作できる                 – Cooperative Scheduling      ...
CPUの使用権譲渡とは イベントオブジェクト(信号)をシグナル状態(青)に変えてあげること            T1                                                    T1 は誰かが自分のイ...
コンテキストスイッチ時の重要な処理   • I/Oキューのチェック            – 完了しているI/Oのチェックと、I/O完了ルーチンの呼び出し            T1                               ...
I/O完了ルーチン:具体例 I/Oラッチ       I/Oラッチ:物理I/O中のメモリバッファにかける排他のしくみ                    T1                 ① I/Oラッチをバッファにかける        ...
I/O完了ルーチン:コールスタック例         0:073> k         Child-SP       RetAddr           Call Site         00000000`0a8fcc00 000007fe`...
その他のIO完了ルーチン   [代表例]   • ページ整合性検証            – チェックサム (既定)                      • Set the PAGE_VERIFY Database Option to C...
I/Oキュー   • I/Oキューの数            – sys.dm_os_schedulers の pending_disk_io_count   • I/O要求の詳細            – sys.dm_io_pending_...
IO完了ルーチン処理中の確認   • DMV sys.dm_os_workers            – is_in_polling_io_completion_routine カラム©2012 Microsoft Corporation. ...
SQL Serverのスレッド モード                      24
ノンプリエンプティブスレッドの問題点   問題例   • 処理時間の長い Windows API 呼び出し   • ユーザーが作成した拡張ストアドプロシージャの呼び出し                                      ...
解決策:プリエンプティブスレッド   スレッドを管理できなくなるタイミングで、プリエンプティブ   モードにスイッチする                          T1                        CPU使用権をT2に...
スレッドモードの確認   • DMV sys.dm_os_workers            – Is_preemptive カラム©2012 Microsoft Corporation. All Rights Reserved.
プリエンプティブモードで動くスレッド   • ヘルスチェック スレッド            – sp_server_diagnosticsスレッド            – Lease HandShake スレッド (Availability...
まとめ       •         SQL Server はNon-Preemptiveなスレッドスケジューリング                 を実装している       •         Non-Preemptiveなスレッドは、自...
参考       SQL Serverのスレッドスケジューリング (DB Online)       http://enterprisezine.jp/dbonline/detail/4157       http://enterprisezi...
質疑応答©2012 Microsoft Corporation. All Rights                                          31             Reserved.
© 2011 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be...
Upcoming SlideShare
Loading in …5
×

C21 SQL Server のスレッド管理 by 古賀啓一郎

1,501 views

Published on

Published in: Technology
  • Be the first to comment

C21 SQL Server のスレッド管理 by 古賀啓一郎

  1. 1. SQL Serverのスレッド管理 1
  2. 2. Agenda SQL Server スレッド スケジューリングの歴史 (5分) SQL Serverのスレッド スケジューリング(30分) SQL Serverのスレッド モード (5分) 質疑応答 (5分)©2012 Microsoft Corporation. All Rights Reserved. 2
  3. 3. SQL Server スケジューリングの歴史 3
  4. 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. 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
  6. 6. SQL Serverのスレッド スケジューリング 6
  7. 7. PreemptiveとNon-Preemptive • Preemptive (Windows) システム (OS) が、CPUを使用するスレッドを決定する。CPU使用 権の横取り。 • Non-Preemptive (SQL Server) ユーザープログラム(スレッド自身)が、 CPUを使用するスレッド を決定する。©2012 Microsoft Corporation. All Rights Reserved. 7
  8. 8. Non-Preemptive実現性 システムの観点から見て、完全なNon-Preemptiveス ケジューリングを実装することはできない ただし、プロセスという閉じた観点であれば、Non- Preemptiveスケジューリングは実装可能©2012 Microsoft Corporation. All Rights Reserved. 8
  9. 9. Windowsのスケジューリング CPUを使用するスレッドが切り替わるタイミング(コンテキストスイッチ) • クォンタムの終了 実行中のスレッドが割り当てられたクォンタムを使い切った(CPU 時間を使い切った) • 自発的な待機 イベント、セマフォなどの同期オブジェクト上で待機が発生 • プリエンプション より高い優先度のスレッドによる横取り©2012 Microsoft Corporation. All Rights Reserved. 9
  10. 10. SQL Serverのスケジューリング CPUを使用するスレッドが切り替わるタイミング(コンテキストスイッチ) • SQLOS Yield APIの呼び出し スレッドが任意のタイミングで自らCPUの使用権を放棄する • 自発的な待機 同期オブジェクト上での待機が発生 (ロック、ラッチ待ちなど)©2012 Microsoft Corporation. All Rights Reserved. 10
  11. 11. スレッドを管理しているコンポーネント • SOS Scheduler – Yield APIや、同期オブジェクトで待機する場合は最終的に、SOS SchedulerクラスのAPIを呼び出して、スレッドを操作している • スケジューラーごとにワーカープールを持っている • DMV sys.dm_os_shceduler©2012 Microsoft Corporation. All Rights Reserved.
  12. 12. スレッドの状態 • Running状態 SQLOS上でCPUを使用しているスレッド • Runnable状態 SQLOS上でCPUの使用権を待機しているスレッド • Suspended (Waiting) 状態 同期オブジェクト上で待機しているスレッド©2012 Microsoft Corporation. All Rights Reserved. 12
  13. 13. スレッドの状態遷移 同期オブジェクト CPU使用権放棄 Running 取得 同期オブジェクト 待機 Suspended Runnable CPU使用権譲受 (Waiting) 同期オブジェクト 取得©2012 Microsoft Corporation. All Rights Reserved.
  14. 14. スレッド状態確認 • DMV sys.dm_os_workers – state カラム©2012 Microsoft Corporation. All Rights Reserved.
  15. 15. スレッド状態確認 • DMV sys.dm_os_workers – state カラム©2012 Microsoft Corporation. All Rights Reserved.
  16. 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. 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. 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. 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. 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. 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. 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. 23. IO完了ルーチン処理中の確認 • DMV sys.dm_os_workers – is_in_polling_io_completion_routine カラム©2012 Microsoft Corporation. All Rights Reserved.
  24. 24. SQL Serverのスレッド モード 24
  25. 25. ノンプリエンプティブスレッドの問題点 問題例 • 処理時間の長い Windows API 呼び出し • ユーザーが作成した拡張ストアドプロシージャの呼び出し CreateFile では内部でイ ベントオブジェクトを使 用し、自発的に待機状 T1 態となることがある I/O要求発行 … CreateFile API 呼び出し/ 完了待ち©2012 Microsoft Corporation. All Rights Reserved.
  26. 26. 解決策:プリエンプティブスレッド スレッドを管理できなくなるタイミングで、プリエンプティブ モードにスイッチする T1 CPU使用権をT2に譲渡した後、 SOSで管理されないスレッドモー ドにスイッチ T2 I/O要求発行 … CreateFile API 呼び出し/ 完了待ち©2012 Microsoft Corporation. All Rights Reserved.
  27. 27. スレッドモードの確認 • DMV sys.dm_os_workers – Is_preemptive カラム©2012 Microsoft Corporation. All Rights Reserved.
  28. 28. プリエンプティブモードで動くスレッド • ヘルスチェック スレッド – sp_server_diagnosticsスレッド – Lease HandShake スレッド (Availability Group) – Scheduler Monitorスレッド など©2012 Microsoft Corporation. All Rights Reserved.
  29. 29. まとめ • SQL Server はNon-Preemptiveなスレッドスケジューリング を実装している • Non-Preemptiveなスレッドは、自身でCPU時間を管理す る • SOSのコンテキストスイッチ時にはI/Oの完了がチェックさ れる • I/O完了時には、I/O完了ルーチンが実行される • SQL Serverのスレッドは必要に応じてプリエンプティブ モードにスイッチする©2012 Microsoft Corporation. All Rights Reserved.
  30. 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.
  31. 31. 質疑応答©2012 Microsoft Corporation. All Rights 31 Reserved.
  32. 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.

×