今更ながら..... SQL Server の構造に関して触れてみる -その1- ( たぶん、何回かにわけるので、その1にしてみた )
本日は、日曜日から新幹線で大阪まで移動という非常に怠い移動です....それでも....移動中に記事を書く....
今回は、SQL Server OS スケジューラーに関して触れてみたいと思います。(今まで、あまり真剣に見たことはないです。)大まか内容は下記のサイトで確認してください。(他力...)
Dr. K's SQL Serverチューニング研修(1):SQL Serverというブラックボックスを開いてみる (1/3) - @IT
まずSQL Serverがほかの製品と大きく異なるのは、「自分自身の中にOSとしての機能を備えている」点にあります。これはUMS(User Mode Scheduler)と呼ばれるスケジューラで、SQL Server 7.0ですでに実装され、SQL Serverの自動化志向を支える原動力となってきました。
UMSは基本的にOS(Windows)から見てノンプリエンプティブです。Windowsはプリエンプティブ・スケジューラを採用しているため、実行中のスレッドはタイムスライスによって交互に実行されるのですが、この際のコンテキスト・スイッチのコストは非常に高い。これに対して、UMSで管理されるスレッドは、1つのCPUに割り当てられたらスレッドが自発的に放棄するまでCPUを独占できます(もちろん、いくつかの例外はあります)。
負荷のかかる MARS などはその例外の一つです。MARS に関しては、下記の記事を参照してください。(MARSを使用していると、基本的に ContextSwitch はお高めになります。)
ryuchan.hatenablog.com
このようにスレッド管理をSQL Server自身で行えるために、ほかのRDBMS製品ではできない自動チューニングが可能なのです。ここがSQL Serverと競合製品との大きな構造的違いであり、かつアドバンテージだといえます。
おお、そうなんですね。現在でもこのような思想で開発された DBMS はないものなのでしょうか?( 商用 DBMS で SQL Server 以外、"実質" 経験したことがないので... )
それでは、SQL Server OS スケジューラーの内部動作を確認してみましょう。まずは、ざっくりスケジューラーの動作を把握してみましょう。下記のコマンドを SQL Server Management Studio で実行してみましょう。
DBCC SQLPERF('umsstats')
スケジューラーは CPU の 1 コアに 1 つ関連づけられます。今回、実行した私の端末はコアが4つあるので、スケジューラーは4つ生成されます。上図から Scheduler ID =0,1,2,3 が確認できます。
それぞれの項目の意味は下記の通りです。
項目 | 説明 |
---|---|
Scheduler ID | スケジューラの ID。 定期的なクエリの実行に使用されるスケジューラにはすべて、1048576 未満の ID 番号が付いています。 |
online | 0の場合、スケジューラがクエリまたはバッチの処理に使用されていません。*1 |
num tasks | スケジューラに関連付けられている現在のタスクの数です。 |
num runnable | 実行可能キューにあるスケジュール待ちのワーカーで、タスクが割り当てられているワーカーの数です。この値が常に高い場合、CPUが足りないなど何かしらの対策をとる必要があります。 |
num workers | スケジューラに関連付けられているワーカーの数です。これにはタスクが割り当てられていないワーカーも含まれます。 |
active workers | アクティブなワーカーの数です。 |
work queued | 保留キュー内のタスクの数です。 保留キュー内のタスクは、ワーカーによる取得を待機(ロック待ちなどが多いかも。)しています。 |
cntxt switches | スケジューラでコンテキストが切り替えられた回数です。 |
cntxt switches(idle) | スケジューラがアイドル中にイベントを待機した回数です。 |
preemptive switches | スケジューラのワーカーがプリエンプティブモードに切り替えられた回数です。 |
DBCC SQLPERF('umsstats') コマンドだけではなく、DMV を使用することで、より詳細にスケジューラーの動作を把握することが可能です。
- sys.dm_os_schedulers
スケジューラーの動作を確認する。 - sys.dm_os_workers
スケジューラー配下で動作するワーカーの動作を確認する。 - sys.dm_os_threads
ワーカー配下で動作するスレッドの動作を確認する。
それでは、上記三つの DMV を使用して、スケジューラー、ワーカーおよびスレッドの書く動作を確認してみましょう。
SELECT * FROM sys.dm_os_schedulers
SELECT * FROM sys.dm_os_workers
SELECT * FROM sys.dm_os_threads
細かいことは...次回にします。品川から乗って、名古屋駅前あたりで記事を書くのが辛くなってしまいました....明日、続きを書こう....いや、明日は飛行機での移動だから無理でした....
C# 6.0 対応はまだ出ていないのかなぁ。
- 作者: Ian Griffiths,鈴木幸敏,風間一洋,木村英一,黒川利明,頃末和義,佐藤嘉一,出葉義治,西山博泰,稲垣達夫
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/11/29
- メディア: 大型本
- この商品を含むブログ (3件) を見る
- 作者: Jay Hilyard,Stephen Teilhet
- 出版社/メーカー: O'Reilly Media
- 発売日: 2015/09/29
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: Jay Hilyard,Stephen Teilhet,鈴木幸敏
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/08/25
- メディア: 大型本
- 購入: 8人 クリック: 111回
- この商品を含むブログ (23件) を見る
- 作者: 鳥飼玖美子
- 出版社/メーカー: 講談社
- 発売日: 2016/02/17
- メディア: 新書
- この商品を含むブログ (7件) を見る
6万人のビジネスマンを教えてわかった 時間がない人ほど上達する英語勉強法
- 作者: 中村澄子
- 出版社/メーカー: ダイヤモンド社
- 発売日: 2016/02/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
*1:0が発生するのは、プロセッサの関係などを指定した場合に発生します。
onlineが0になっているのが確認できます。