都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

今更ながら..... SQL Server の構造に関して触れてみる -その1- ( たぶん、何回かにわけるので、その1にしてみた )

 本日は、日曜日から新幹線で大阪まで移動という非常に怠い移動です....それでも....移動中に記事を書く....
f:id:koogucc11:20160424210734j:plain

 今回は、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の自動化志向を支える原動力となってきました。

f:id:koogucc11:20160418110733g:plain

 UMSは基本的にOS(Windows)から見てノンプリエンプティブです。Windowsはプリエンプティブ・スケジューラを採用しているため、実行中のスレッドはタイムスライスによって交互に実行されるのですが、この際のコンテキスト・スイッチのコストは非常に高い。これに対して、UMSで管理されるスレッドは、1つのCPUに割り当てられたらスレッドが自発的に放棄するまでCPUを独占できます(もちろん、いくつかの例外はあります)。

 負荷のかかる MARS などはその例外の一つです。MARS に関しては、下記の記事を参照してください。(MARSを使用していると、基本的に ContextSwitch はお高めになります。)
ryuchan.hatenablog.com

 このようにスレッド管理をSQL Server自身で行えるために、ほかのRDBMS製品ではできない自動チューニングが可能なのです。ここがSQL Serverと競合製品との大きな構造的違いであり、かつアドバンテージだといえます。

 おお、そうなんですね。現在でもこのような思想で開発された DBMS はないものなのでしょうか?( 商用 DBMSSQL Server 以外、"実質" 経験したことがないので... )

 それでは、SQL Server OS スケジューラーの内部動作を確認してみましょう。まずは、ざっくりスケジューラーの動作を把握してみましょう。下記のコマンドを SQL Server Management Studio で実行してみましょう。

DBCC SQLPERF('umsstats')

f:id:koogucc11:20160424202648p:plain

f:id:koogucc11:20160424202735p:plain

 スケジューラーは CPU の 1 コアに 1 つ関連づけられます。今回、実行した私の端末はコアが4つあるので、スケジューラーは4つ生成されます。上図から Scheduler ID =0,1,2,3 が確認できます。
f:id:koogucc11:20160424202924p:plain

 それぞれの項目の意味は下記の通りです。

項目 説明
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

f:id:koogucc11:20160424210234p:plain

SELECT
    *
FROM
    sys.dm_os_workers

f:id:koogucc11:20160424210242p:plain

SELECT
    *
FROM
    sys.dm_os_threads

f:id:koogucc11:20160424210251p:plain

細かいことは...次回にします。品川から乗って、名古屋駅前あたりで記事を書くのが辛くなってしまいました....明日、続きを書こう....いや、明日は飛行機での移動だから無理でした....

C# 6.0 対応はまだ出ていないのかなぁ。

プログラミングC# 第7版

プログラミングC# 第7版

あ、あった。クックブックのほうか。
C# 6.0 Cookbook

C# 6.0 Cookbook

日本語版はなさそう。
C#クックブック 第3版

C#クックブック 第3版

やっぱり、英語必要....
本物の英語力 (講談社現代新書)

本物の英語力 (講談社現代新書)

ほ、ほんとか。信じてみよう、かな...
6万人のビジネスマンを教えてわかった 時間がない人ほど上達する英語勉強法

6万人のビジネスマンを教えてわかった 時間がない人ほど上達する英語勉強法

*1:0が発生するのは、プロセッサの関係などを指定した場合に発生します。f:id:koogucc11:20160424205402p:plain
onlineが0になっているのが確認できます。f:id:koogucc11:20160424205602p:plain