SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

擬似スケジューラー環境で MAXDOP=0 の場合の並列度の上限を試してみました

leave a comment

今日、少しテストをしていて気になったので調べてみました。

■MAXDOP=0 の場合の最大値


SQL Server ではクエリ実行時の並列度の上限を max degree of parallelism オプション または MAXDOP クエリヒントで制御することができます。

MAXDOP が 0 の状態で大量のデータが入っているテーブルの集計処理を実行して、並列処理のプランになった際のクエリの並列度を確認していたところ、スレッドの数が 64 で頭打ちになっていました。
image

私が検証で使用している環境は 4 コアで HT を有効にして 8 コアの 1 ソケットの環境なので、通常はクエリの並列の上限は以下のようになります。
imageimage

SQL Server 2005 以降はスタートアップオプションを変更することで、スケジューラーの数を変更することができ、物理コア数以上のスレッドを立てることができるようになります。

今回の環境には実際には1 ソケット、8 論理 CPU しかないので 1 Numa Node / 8 CPU の構成となるのですが、オプションを設定することで SQL Server 上は以下のように認識させることができます。
imageimage

4 Numa Node / 256 CPU 環境として認識していますね。
# CPU は 0 から始まります。

先ほど、64 スレッドで実行されていいた環境は 256 のスケジューラーを持っているので、最大で 256 スレッドで実行できるのではと思っていたのですが、64 で頭打ちとなっていました。

さて、なんでだろうと思って実行プランを確認したところ、以下のようになっていました。
image

2 つの NumaNode でスレッドを生成しているのですが、64 で頭打ちです。

何か制限があるのかなと思って max degree of parallelism オプション のヘルプを見たところ、以下の記載が。

並列処理の最大限度を 0 に設定すると、使用可能なすべてのプロセッサ (最大 64 プロセッサ) を使用できます。

 

0 の場合の上限は 64 なのですね。

最初は、Denali CTP3 Enterprise Evaluation を使用しているため上限がかかっているかと思ったのですが、SQL Server 2008 R2 Datacenter Edition でも同一の動作となっていました。

OPTION (MAXDOP 256) を設定して実行したところ 256 スレッドで実行させることができました。
# sp_configure ‘max degree of parallelism’, 256;RECONFIGURE でも可能です。
image

image

256 スレッド使われていますね。

64コア以上を搭載している場合、バッチ処理等で全力で CPU を使いたい場合 MAXDOP の設定なしで想定しているスレッド数となるかを確認してみるといいのかもしれないですね。
# 64 スレッドの並列クエリでも十分凄いと思いますが。

今回は擬似的にスケジューラーを増加させているので、64 コア以上の環境を触る機会があったら同じ動作になるのか実機確認してみたいです。
# 使う機会が来るといいな。

Share

Written by Masayuki.Ozawa

10月 18th, 2011 at 10:57 pm

Posted in SQL Server,未分類

Tagged with

Leave a Reply