CPU構成
SQL Serverのパフォーマンスは、CPUとコアの構成にさまざまな依存関係があります。
ハイパースレッディング
ハイパースレッディングとは、x86プロセッサで実行される計算の並列化を改善する同時マルチスレッド(SMT)の実装のことです。SMTはIntelプロセッサとAMDプロセッサの両方で使用できます。
ハイパースレッディングにより、論理CPUが物理CPUとしてオペレーティングシステムに認識されます。SQL Serverは、これらの追加CPUを認識し、物理的に存在するよりも多くのコアがあるかのように使用します。これにより、並列化を増やすことでパフォーマンスを大幅に向上させることができます。
ここで注意すべき点は、SQL Serverの各バージョンには、使用できるコンピューティング能力に独自の制限があることです。詳細については、「SQL Serverのエディション別のコンピューティング容量制限」を参照してください。
コアとライセンス
SQL Serverのライセンスには2つのオプションがあります。1つ目はサーバ+クライアントアクセスライセンス(CAL)モデルと呼ばれ、2つ目はプロセッサごとのコアモデルです。SQL Serverで利用可能なすべての製品機能には、サーバ+ CAL戦略でアクセスできますが、ソケットあたりのCPUコア数はハードウェアで20に制限されています。ソケットあたり20個以上のCPUコアを搭載したサーバ用のSQL Server Enterprise Edition+CALがある場合でも、アプリケーションはそのインスタンスですべてのコアを一度に使用することはできません。
次の図は、起動後のSQL Serverログメッセージを示しています。これは、コア制限の適用を示しています。
したがって、すべてのCPUを使用するには、プロセッサ単位のコアライセンスを使用する必要があります。SQL Serverのライセンスの詳細については、を参照してください。 "SQL Server 2022:最新データプラットフォームを実現"。
CPUアフィニティ
パフォーマンスの問題が発生しない限り、プロセッサアフィニティのデフォルトを変更する必要はありませんが、その内容と動作を理解する価値はあります。
SQL Serverは、次の2つのオプションでプロセッサアフィニティをサポートします。
-
CPUアフィニティマスク
-
アフィニティI/Oマスク
SQL Serverは、オペレーティングシステムで使用可能なすべてのCPUを使用します(プロセッサ単位のコアライセンスが選択されている場合)。また、各CPUに対してスケジューラf0rを作成し、特定のワークロードでリソースを最大限に活用します。マルチタスクを実行する場合、オペレーティングシステムやサーバー上のその他のアプリケーションは、プロセススレッドをプロセッサ間で切り替えることができます。SQL Serverはリソースを大量に消費するアプリケーションであるため、この状況が発生するとパフォーマンスに影響する可能性があります。影響を最小限に抑えるには、SQL Serverのすべての負荷が事前に選択されたプロセッサグループに送られるようにプロセッサを構成します。これは、CPUアフィニティマスクを使用することによって実現されます。
アフィニティI/Oマスクオプションは、SQL ServerディスクI/OをCPUのサブセットにバインドします。SQL Server OLTP環境では、この拡張により、I/O処理を実行するSQL Serverスレッドのパフォーマンスが大幅に向上します。
並列処理の最大次数(MAXDOP)
デフォルトでは、プロセッサ単位のコアライセンスが選択されている場合、SQL Serverはクエリの実行中に使用可能なすべてのCPUを使用します。
これは大規模なクエリには役立ちますが、原因のパフォーマンスが低下し、同時実行数が制限される可能性があります。1つのCPUソケット内の物理コアの数に並列処理を制限する方法が適しています。たとえば、ソケットあたり12コアの物理CPUソケットが2つあるサーバでは、ハイパースレッディングに関係なく、 `MAXDOP`12に設定する必要があります。 `MAXDOP`使用するCPUを制限したり、指定したりすることはできません。代わりに、単一のバッチクエリで使用できるCPUの数を制限します。
* NetAppでは、データウェアハウスなどのDSSの場合、50から始めて、必要に応じてチューニングアップまたはチューニングダウンを検討することを推奨してい `MAXDOP`ます。変更を加えるときは、必ずアプリケーション内の重要なクエリを測定してください。 |
ワーカースレッドの最大数
最大ワーカースレッド数オプションは、多数のクライアントがSQL Serverに接続されている場合にパフォーマンスを最適化するのに役立ちます。
通常、クエリごとに個別のオペレーティングシステムスレッドが作成されます。SQL Serverへの同時接続数が数百に達すると、クエリごとに1つのスレッド構成で大量のシステムリソースが消費される可能性があります。このオプションを使用する `max worker threads`と、多数のクエリ要求をまとめて処理できるワーカースレッドのプールをSQL Serverで作成できるようになるため、パフォーマンスが向上します。
デフォルト値は0で、SQL Serverは起動時にワーカースレッド数を自動的に設定できます。これはほとんどのシステムで機能します。ワーカースレッドの最大数は高度なオプションであり、経験豊富なデータベース管理者(DBA)の支援なしに変更しないでください。
より多くのワーカースレッドを使用するようにSQL Serverを設定する必要があるのはいつですか?各スケジューラの平均ワークキューの長さが1を超える場合は、負荷がCPUに制限されていないか、その他の重い待機時間が発生している場合にのみ、システムにスレッドを追加することでメリットが得られます。これらのいずれかが発生している場合、スレッドを追加しても、他のシステムボトルネックを待つことになるため、効果はありません。最大ワーカースレッド数の詳細については、を参照してください。 "max worker threadsサーバ設定オプションの設定"。
SQL Server Management Studioを使用した最大ワーカースレッド数の設定。
次に、T-SQLを使用してmax work threadsオプションを設定する例を示します。
EXEC sp_configure 'show advanced options', 1; GO RECONFIGURE ; GO EXEC sp_configure 'max worker threads', 900 ; GO RECONFIGURE; GO