SQL Server on Linux 用に永続メモリ (PMEM) を構成する

適用対象:Linux 上の SQL Server

この記事では、Linux上でSQL Server 2019(15.x)以降のバージョン向けに永続メモリ(PMEM)を設定する方法について説明します。

Overview

SQL Server 2019(15.x)は、いくつかのストレージ集約的な操作を加速するために永続メモリのサポートを追加します。

PMEM対応ファイルシステムでは、メモリマッピング(mmap())によりユーザースペースアプリケーションがファイルデータに直接アクセスできます。 ファイルのメモリマップが作成されると、アプリケーションはストレージ層を迂回するロード/ストア命令を発行できます。

Note

この直接アクセスは、ホスト拡張アプリケーションの視点から啓発されたファイルアクセスメソッドと呼ばれ、SQL ServerがホストOSとSQLプラットフォーム抽象層(SQLPAL)を用いて相互作用する方法です。

この記事では、Linux上のSQL Server on Linuxで永続メモリの設定方法を紹介します。

PMEM デバイスの名前空間を作成する

デバイスを構成する

Linux では ndctl ユーティリティを使用します。

  • インストール ndctlして、NDCTL のインストールから PMEM デバイスを構成します。
  • ndctl を使用して名前空間を作成します。 名前空間は、PMEM NVDIMM 間でインターリーブされ、デバイス上のメモリ領域へのさまざまな種類のユーザースペース アクセスを提供できます。 fsdax は、SQL Server の既定のモードであり、望ましいモードです。
ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev

fsdaxモードは、システムメモリにページごとのメタデータを保存します。 --map=devオプションはメタデータを直接名前空間に保存するため推奨されます。 --map=memでメタデータをメモリに保存するのは実験的な段階です。

ndctl を使用して名前空間を確認します。

サンプル出力を次に示します。

# ndctl list -N
{
  "dev":"namespace0.0",
  "mode":"fsdax",
  "map":"dev",
  "size":4294967296,
  "sector_size":512,
  "blockdev":"pmem0",
  "numa_node":0
}

PMEM デバイスの作成とマウント

たとえば、 XFS の場合:

mkfs.xfs -f /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax
xfs_io -c "extsize 2m" /mnt/dax

たとえば、 ext4 の場合:

mkfs.ext4 -b 4096 -E stride=512 -F /dev/pmem0
mount -o dax,noatime /dev/pmem0 /mnt/dax

技術的な考慮事項

  • 前に説明したように、XFS または ext4 に 2 MB の割り当てをブロックする
  • ブロックの割り当てと mmap の不整合により、4 KB へのサイレント フォールバックが発生する
  • ファイル サイズを 2 MB の倍数 (剰余 2 MB) にする必要がある
  • Transparent Huge Pages (THP) を無効にしない (ほとんどのディストリビューションでは既定で有効化)

ndctlを使ってデバイスの設定、作成、マウントを行った後、データベースファイルをそこに配置したり、新しいデータベースを作成したりできます。

以下のコマンドで、SQL Serverデータファイル(.mdf.ndf)およびPMEMfsdaxデバイスにtempdbファイルを保存できます。 このモードでSQL Serverログ(.ldf)ファイルを保存しないでください。なぜならトランザクションログはセクターアトミック保証を提供するストレージを必要とするからです。

ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev

前のコマンドで map オプションを設定する前に、次の点に注意してください。

  • このデバイスでNVDIMMページエントリにアクセスして更新する際の最高のパフォーマンスを得るために、以下の方法を選びます。 -map=mem
  • NVDIMMの容量が512GBを超えると -map=devに設定され、I/Oスループットに影響が出て性能が低下します

PMEMデバイス上のSQL Serverログファイルについては、PMEMデバイスをセクター/ブロック変換テーブル(BTT)を使用するように設定してください。 この構成により、SQL Serverログファイルがこのストレージ技術に必要なセクターの原子性を提供します。 ワークロードのパフォーマンス検証を行います。 このソリューションとクラス最高のNVMe SSDのSQL Serverログパフォーマンスを比較し、ニーズに最も合うものを選びましょう。

ndctl create-namespace -f -e namespace0.0 --mode= sector

強制フラッシュ動作を無効にする

PMEM デバイスは O_DIRECT (ダイレクト I/O) セーフであるため、強制フラッシュ動作を無効にすることができます。

Note

ストレージシステムは、デバイスへの書き込みがシステムクラッシュ、インターフェースリセット、電源障害に耐え忍びる媒体上に存在し、そのメディア自体がハードウェア冗長であることを保証することで、キャッシュされた書き込みやステージ化された書き込みが安全かつ耐久性を持つことを保証できます。

  • データベース (.mdf.ndf) およびトランザクション ログ (.ldf) ファイルは、SQL Server 2017 (14.x) CU 6 以降のバージョンでは、既定で writethroughalternatewritethrough を使用しません。強制フラッシュ動作を使用するためです。 トレースフラグ3979は、データベースおよびトランザクションログファイルの強制フラッシュ動作を無効にし、 writethroughalternatewritethrough ロジックを使用します。

  • SQL ServerFILE_FLAG_WRITE_THROUGHで開く他のファイル、例えばデータベーススナップショット、データベース整合性チェック用の内部スナップショット(DBCC CHECKDB)、プロファイラトレースファイル、拡張イベントトレースファイルなどは、writethroughおよびalternatewritethrough最適化を使用します。

SQL Server 2017 (14.x) CU 6 で導入された変更について詳しくは、KB 4131496 を参照してください。 強制ユニット アクセス (FUA) の内部構造について詳しくは、FUA の内部構造に関する記事を参照してください。

SQL Server と強制ユニット アクセス (FUA) I/O サブシステム機能

サポートされている一部の Linux ディストリビューションでは、データの持続性を確保するために、I/O サブシステム レベルで強制ユニット アクセス (FUA) が実装されています。 SQL Server では、この機能を利用して、Linux ワークロードに効率的で信頼性の高い I/O パフォーマンスを提供します。 Linux ディストリビューション全体での FUA サポートとその SQL Server への影響の詳細については、「 SQL Server on Linux: Forced Unit Access (FUA) Internals」を参照してください。

I/O サブシステムでの FUA のサポートは、SUSE Linux Enterprise Server 12 SP5、Red Hat Enterprise Linux 8.0、Ubuntu 18.04 で導入されました。 SQL Server 2017 (14.x) CU 6 以降のバージョンでは、次の構成を使用して、SQL Server の FUA で高パフォーマンスで効率的な I/O を有効にします。

次の条件が満たされている場合は、この推奨される構成を使用します。

  • SQL Server 2017 (14.x) CU 6 以降のバージョン

  • FUA 機能をサポートする Linux ディストリビューションとバージョン (Red Hat Enterprise Linux 8.0、SUSE Linux Enterprise Server 12 SP5、または Ubuntu 18.04 以降)

    Note

    SQL Server 2025 (17.x) 以降、SUSE Linux Enterprise Server (SLES) はサポートされていません。

  • Linux カーネル 4.18 以降のバージョンの SQL Server ストレージ用の XFS ファイル システム。

  • linux カーネル 5.6 以降のバージョンの SQL Server ストレージ用 ext4 ファイル システム。

    Note

    Linux カーネルのバージョンが 5.6 より小さい場合は、SQL Server のデータ ファイルとトランザクション ログ ファイルをホストするために XFS ファイル システムを使用します。 カーネル バージョン 5.6 以降では、特定の要件に基づいて XFSext4 を選択できます。

  • FUA 機能をサポートし、構成されているストレージ サブシステムとハードウェア

推奨構成:

  1. トレース フラグ 3979 をスタートアップ パラメーターとして有効にします。

  2. mssql-confを使用して、control.writethrough = 1control.alternatewritethrough = 0を構成します。

前の条件を満たしていない他のほぼすべての構成では、次の推奨構成を使用します。

  1. トレース フラグ 3982 をスタートアップ パラメーター (Linux エコシステムの SQL Server の既定) として有効にし、トレース フラグ 3979 がスタートアップ パラメーターとして有効になっていないことを確認します。

  2. mssql-confを使用して、control.writethrough = 1control.alternatewritethrough = 1を構成します。

Kubernetes にデプロイされた SQL Server コンテナーに対する FUA のサポート

  1. SQL Server では、overlayfs ではなく、マウントされた永続化ストレージを使用する必要があります。

  2. ストレージは XFS または ext4 ファイルシステムを使用する必要があり、FUA をサポートする必要があります (ext4 はバージョン 5.6 より前の Linux カーネルでは FUA をサポートしていません)。 この設定を有効にする前に、Linux ディストリビューションおよびストレージ ベンダーと協力して、OS とストレージ サブシステムが FUA オプションをサポートしていることを確認してください。 Kubernetes では、次のコマンドを使用してファイルシステムの種類に対するクエリを実行できます。ここで <pvc-name>PersistentVolumeClaim です。

    kubectl describe pv <pvc-name>
    

    出力内で、XFS に設定されている fstype を探します。

  3. SQL Server ポッドをホストするワーカー ノードでは、FUA 機能をサポートする Linux ディストリビューションとバージョンを使用する必要があります (Red Hat Enterprise Linux 8.0、SUSE Linux Enterprise Server 12 SP5、または Ubuntu 18.04 以降)。

上記の条件が満たされている場合は、次の推奨 FUA 設定を使用します。

  1. トレース フラグ 3979 をスタートアップ パラメーターとして有効にします。

  2. mssql-confを使用して、control.writethrough = 1control.alternatewritethrough = 0を構成します。