この記事は、2016 年 10 月 28 日 に Data Platform Tech Sales Team Blog にて公開された内容です。
Microsoft Japan Data Platform Tech Sales Team 佐藤秀和
本稿では、SQL Server 2016 環境構築時に、処理性能を最大限に発揮し、不用意な性能問題を起こさないためのベストプラクティスをお伝えいたします。 システムの規模や要件に応じて検討内容は変わり、シビアな要件になるほど検討事項は増えますが、今回は SQL Server 2016 の環境構築時に、考慮すべき必要最低限の内容をまとめます。
- OS 関連の設定 -
SQL Server サービスアカウントの設定
- メモリ内のページのロック
SQL Server インスタンスの起動アカウントに「メモリ内のページのロック」権限を付与することで、連続的なメモリ領域を確保し、ディスク上の仮想メモリへのページングを防止することで、不用意な性能劣化を防ぐことが出来ます。
ローカル グループ ポリシー エディター
[コンピュータの構成] → [Windows の設定] → [セキュリティの設定] → [ローカルポリシー] → [ユーザー権限の割り当て] → [メモリ内のページロック] 権限を SQL Server 起動アカウントに付与
- データファイルの瞬間初期化
SQL Serverインスタンスの起動アカウントに「ボリュームの保守タスクを実行」権限を付与することで、データベースファイルの初期化を高速化することが出来ます。データベースの作成時やデータファイルの拡張時に必要な領域を 0 で満たす初期化操作を行わず、領域の確保のみを行うため、ディスクの領域確保が高速化されます。データは新たなデータがファイルに書き込まれる時に、ディスクの内容が上書きされます。
ローカル グループ ポリシー エディター
[コンピュータの構成] → [Windows の設定] → [セキュリティの設定] → [ローカルポリシー] → [ユーザー権限の割り当て] → [ボリュームの保守タスクを実行] 権限を SQL Server 起動アカウントに付与
サービスアカウントの設定(SQL Server 2016 新機能)
SQL Server 2016 では、セットアップ時にデータファイルの瞬間初期化の有効化が可能です。
SQL Server 2016 セットアップ - サーバーの構成 サービスアカウント
ストレージ構成
ストレージ構成は、導入するシステムのデータ容量や性能要件によって構成は大きく異なりますが、処理性能が求められる環境では以下の点を考慮してください。
- ユーザデータベースのデータベースファイルとログファイルは、異なるディスク上に配置します
- tempdb をユーザーデータベースとは別のディスク上に配置し、更に tempdb のデータファイルとログファイルは別のディスクに配置する
- データファイル、ログファイルを配置するディスクは、以下の設定にてフォーマットする
項目名 | 既定値 | 設定値 |
フォーマット形式 | NTFS | NTFS |
アロケーションユニットサイズ | ディスクサイズにより既定値が異なる | 64KB |
アロケーションユニットサイズの設定
電源設定
Windows Server 2008 以降では、電源プランの設定によりシステムの電力消費量を調整することが出来ます。既定の設定は「バランス」となっていますが、高い処理性能が求められる環境では「高パフォーマンス」に設定することを推奨しています。ちなみに Azure での Windows Server 仮想マシン (IaaS) の電源プランの既定値は「高パフォーマンス」となっています。
- SQL Server の設定 -
tempdb の設定
tempdb データベースは、クエリ実行時の一時作業領域として利用されるだけではなく、最近の SQL Server のバージョンでは、スナップショット分離レベルのバージョンストアや、インデックスメンテナンス時の作業領域など、多く機能で利用されるために、性能面を考慮した最適な物理設計を行う必要があります。 SQL Server 2014 以前では、SQL Server のインストール後に、 tempdb のベストプラクティスに則した構成変更を個別に行う必要がありましたが、SQL Server 2016 においては、インストール時にハードウェア構成を自動的に判断して、最適な構成で tempdb を構成することが出来るようになっています。
tempdb 複数ファイルグループの設定(SQL Server 2016 新機能)
SQL Server 2016 では、セットアップ実行時に tempdb のデータファイル数を実行環境に合わせて自動的に設定します。
(8または搭載 CPU コア数の小さい値を既定値とする)
SQL Server 2016 セットアップ - tempdb ファイルグループ設定
tempdb はインスタンス起動時に初期サイズで設定されたサイズで再作成されます。 頻繁な自動拡張は性能面で悪影響を与えますので、適切な初期サイズの設定が重要です。 SQL Server セットアップ時のデータベース サイズは暫定的なサイズで設定し、本番相当のデータを使用してテストを実施し tempdb の使用状態をモニタリングしながら、最終的な tempdb の初期サイズを決定します。
tempdb の性能に関するもう一つのベストプラクティスとして、SQL Server 2014 以前のバージョンでは、トレースフラグ 1117 と 1118 の設定が有効でした。
トレースフラグ | 効果 |
1117 | データベースを構成する全てのデータベースファイルが、 拡張時に同時に拡張されます |
1118 | ユーザーデータベースの既定の割り当てが、混合ページ エクステントではなく単一エクステントが使用されます |
SQL Server 2016 では、トレースフラグ 1117 と 1118 を有効にしたときと同様の動作が tempdb の既定動作となりますので、別途トレースフラグを設定する必要がありません。なお、トレースフラグ 1117 と 1118 は SQL Server 2016 では効力が無効となっていますので、個別のユーザーデータベースへの適用には、以下の様な設定が必要です。
-T1117 : ALTER DATABASE <dbname> MODIFY FILEGROUP <filegroup> AUTOGROW_ALL_FILES
-T1118 : ALTER DATABASE <dbname> SET MIXED_PAGE_ALLOCATION ON
次に各種パラメタの設定について、ご説明いたします。
メモリ設定 (min server memory / max server memory)
SQL Server のメモリ設定は、基本的に「最小サーバー メモリ: min server memory 」と「最大サーバーメモリ: max server memory 」の2つを設定するのみなので、とてもシンプルですが、各項目の意味を正しく理解しないと、不用意な問題が発生する可能性がありますので、ご注意ください。
最小サーバーメモリ( min server memory ): SQL Server がメモリ確保を行う際に、この値を下回ってメモリ解放しないことを指定します。他のアプリケーションの利用による、OS からのメモリ開放要求があっても、この値を下回って開放することはありません。しかしながら SQL Server の起動時にすべてのメモリ領域を確保するわけではありませんので、min server memory よりも小さいメモリサイズで稼働していることがあります。
最大サーバーメモリ( max server memory ):SQL Server が確保する最大メモリサイズの指定となりますが、既定値(2,147,483,647MB)の設定では、稼働しているサーバーの物理的な空きメモリが残り4MBから10MBの間になるまで、SQL Serverは必要に応じてメモリを確保しようとしますので、他のアプリケーションとの混在環境では、SQL Server に割り当てるメモリサイズを明示的に指定する必要があります。一般的な例として 2GB~4GBを OS や SQL Server 以外のプロセス用とし、残りのメモリを SQL Server 用として max server memory に指定します。
MAXDOP ( max degree of parallelism )
MAXDOP はクエリーの並列処理度数設定となりますが、既定値 0 は並列処理が有効なクエリにおいて、搭載されている全ての論理 CPU コアを用いてクエリを並列実行が可能なことを意味しています。この設定はバッチ処理には適していますが、OLTP 処理のようにトランザクション処理の同時実行性を重視する環境には適しません。処理特性によって必要となる並列処理の度数が異なるため、パフォーマンステストによるチューニングを検討ください。MAXDOP の設定変更は SQL Server の再起動は不要なため、オンライン処理の時間帯とバッチ処理の時間帯で設定を変更することが可能です。
また、昨今では CPU のマルチコア環境による NUMA 構成も増えているかと思います。その場合は各 NUMA ノードを構成している物理プロセッサ数以下の値で MAXDOP を設定することを推奨いたします。
項目名 | 既定値 | 設定値 |
並列処理の最大限度
( max degree of parallelism ) |
0 | クエリの処理要件に応じて設定
NUMA 構成の場合は、NUMA ノードの物理プロセッサ数以下を設定 |
NUMA ノード数は、ERRORLOG ファイルまたは、動的管理ビュー( sys.dm_os_sys_info, sys.dm_os_nodes ) にて確認が可能です。
以上、今回は SQL Server 2016 のセットアップ時における、パフォーマンス面の勘所という内容でした。
環境構築時の参考情報として頂ければと思います。
関連記事