SQL ServerのCPUリソース管理の概要~リソース効率化のためのSQLOS Scheduler~
引用元
https://gyazo.com/53671da65807b29e83d83d54d3176b56
SQL Server並びにWindows ServerのCPUリソース管理方法の歴史/問題点と, SQLOS Schedulerの克服方法についてざっくり説明する. 第一章CPUリソースの最適化が該当箇所である.
公式: スレッドおよびタスクのアーキテクチャ ガイド https://docs.microsoft.com/ja-jp/sql/relational-databases/thread-and-task-architecture-guide?view=sql-server-ver15
--.icon
CPUリソースの最適化
windowsスケジューラーとSQL Serverの関係と, 問題
当初, SQL ServerはWindows OS上の稼働を前提. (現在はLinux上での稼働, container技術を使えばOSは正直選ばなくてよい. ) windows スケジューラの責務は, CPUリソースの利用状況の管理であり, 実際にはタスク/プロセスへのCPUリソースの割当から, 他タスク/プロセスへのCPU使用権の再分配などである.
問題
SQL Server6.5 以前において, windows スケジューラとSQL ServerではCPUリソースを巡る問題があった. 問題とはCPUリソースの非効率利用であり, 結果としてスループットの低下を招いていた.
原因
windowsスケジューラにはSQL Serverプロセス内のスレッドを判断できない状態だった. (SQL Serverの外からみて, 他アプリケーション同様にプロセスへのCPUリソースの割当をしてしまっていた)
大規模なデータ処理, データ管理がニーズとして高まり, CPUリソースの最適利用が求められるようになった.
CPUリソースの非効率的利用の例
例1. ロック獲得中のスレッドがCPU使用権を剥奪されて, ロック獲得前(獲得したい)のスレッドにCPUが割り当てられても, 結局はデータ・リソースを獲得できないので処理を進めることができない.
https://gyazo.com/543d5d75828e3e7f51e2c4a3cdad8be6
例2. 子スレッドの並列処理において, 最速の子スレッド完了後から, 最遅の子スレッド完了までに待ちが発生することになる. その間に親スレッドにCPUリソースが割り当てられたとしても全ての子スレッド完了を待つ必要があるため, 処理を前にすすめることができない.
https://gyazo.com/385c51e12464ccaa9a6f5d7d2ef51744
解決策
先に上げた「非効率的利用の例」を克服するためには, SQLServer側にDatabase Server特有のタスク管理をできる機構が必要だった. Databaseプロセスに特化した, windowsスケジューラがSQLServer内にも存在しているイメージ. SQLOS Schedulersと呼ばれるコンポーネントである. SQL Server 7.0から導入.
https://gyazo.com/edac97f9146842b55aa30ed5e9169500
SQLOS Schedulersの内部構成と仕組み
https://docs.google.com/presentation/d/1OyUcI0AJ7GcJh6ZMt94gOyRIHFylc-_eYRx16WRxIhA/edit#slide=id.p
https://gyazo.com/40dd238c62d1df0a6518da1341a6c78e
処理解説
①Clientからのリクエスト到達
②-a. Worker Thread Pool から使用可能なWorkerを取得, 割当. Workerは実際のタスク処理に責任を持つコンポーネント.
②-b. Worker Thread Pool から使用可能なWorkerが不足している場合は, Worker Request Queueへ待機させる. Worker Thread Poolに使用可能なWorkerが発生したら, 割り当てる.
③割当Workerは, Runnable Queue(実行中ワーカーリスト)にて管理. 実行可能なWorkerがRunnable Queueで管理される.
④Runnable Queue内のWokerを上位から順にCPUリソース割当を行う. Workerは実行中状態となり, Scheduler管理下となる.
⑤-a CPUリソース割当実施後に処理対象(排他ロック対象)のデータリソースが, 他Workerによってロックされている場合, CPUリソース割当を停止して, 該当データリソース用のWaiter Listへ追加して, Scheduler管理外とする. 他Workerによってロックされているか否かは, リソースロックを管理しているリストを確認する(緑色).
⑤-b 他Workerによるリソースロックが解除されたら, Runnable Queueへ戻されて, 実行可能な状態へ戻る.
⑥-a I/O RequestをDiskに対して実施
⑥-b I/O Requestから, Diskから完了通知到達まで, I/O Request ListでI/O待ちとして管理する.
⑥-c DiskからI/O完了通知を受け取る. 完了通知受領後にI/O Request Listから, Runnable Queue(実行可能状態)へWorkerを戻す.
⑥-d DiskへのI/O処理状況に応じて, データリソースのロック状態の管理リスト(コンポーネント)へ更新依頼を実施する.
⑦タスク完了したら, Clientへ処理結果を返却する.
⑧処理完了後, Workerはtask/threadを終了させて, Worker Thread Poolへ戻される.
SQLOS Schedulerのモニタリング方法
利用ツールとして, 動的ビュー( sys.dm_os_schedulers )を参照することが可能
実行コマンド
code:sql
SELECT * FROM sys.dm_os_schedulers;
実行結果
https://gyazo.com/a9adfaa65ab2666e1d9218414ec6a073
https://gyazo.com/d590b50ad2beb2a73b5761a40bf632aa
https://gyazo.com/9e1305c3aacc69196196ccca1036f748
解説( todo )
#Azure #Database