設定 Linux 上的 SQL Server 持續性記憶體 (PMEM)

適用於:Linux 上的 SQL Server

本文說明如何在 Linux 上為 SQL Server 2019(15.x)及更新版本配置持久記憶體(PMEM)。

Overview

SQL Server 2019(15.x)新增了持久記憶體支援,以加速多項儲存密集型操作。

透過具備 PMEM 感知的檔案系統,記憶體映射mmap()()讓使用者空間應用程式能直接存取檔案資料。 當檔案建立記憶體映射時,應用程式可以發出繞過儲存層的載入/儲存指令。

Note

從主機擴充應用程式的角度來看,這種直接存取稱為開明檔案存取方法,這也是 SQL Server 與主機作業系統互動的方式,透過 SQL 平台抽象層(SQLPAL)。

本文將教你如何在 Linux 上的 SQL Server 上設定持久記憶體。

建立 PMEM 裝置的命名空間

設定裝置

在 Linux 中,使用 ndctl 公用程式。

  • 安裝 ndctl 後可設定 PMEM 裝置,從 安裝 NDCTL 開始。
  • 使用 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

技術考量

  • 如先前所述,禁止分配 2 MB 給 XFS 或 ext4。
  • 區塊配置和 mmap 未對齊會默默退回至 4KB
  • 檔案大小應為 2MB 的倍數 (模數 2 MB)
  • 請勿停用透明大頁 (THP)(在大部分的 Linux 發行版本中預設為啟用)

在你設定 ndctl 、建立並掛載裝置後,你可以將資料庫檔案放入其中或建立新的資料庫。

你可以用以下指令將 SQL Server 資料檔(.mdf、).ndftempdb檔案存放在 fsdax PMEM 裝置的模式中。 不要使用此模式來儲存 SQL Server 日誌.ldf()檔案,因為交易日誌需要提供區塊原子保證的儲存:

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

在上述命令中設定 map 選項之前,請記住下列幾點:

  • 為了在存取和更新這些 NVDIMM 頁面時達到最佳效能,請使用 -map=mem
  • 若 NVDIMM 容量過大(超過 512 GB),則設定 -map=dev,這會影響 I/O 吞吐量並降低效能

對於 PMEM 裝置上的 SQL Server 日誌檔案,請設定 PMEM 裝置使用扇區/區塊轉換表(BTT)。 此配置提供 SQL Server 日誌檔案所需的扇區原子性,以滿足此儲存技術的需求。 執行工作負載效能驗證。 比較你工作負載下的 SQL Server 日誌效能,與同級 NVMe SSD 比較,然後選擇最適合你需求的那一款。

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

停用強制排清行為

因為 PMEM 裝置為 O_DIRECT (直接 I/O) 安全,所以您可以停用強制排清行為

Note

儲存系統可以確保任何快取或分階段寫入安全且持久,方法是確保寫入裝置的寫入存在於系統崩潰、介面重置及斷電時仍持續存在的媒介上,且該媒介本身具備硬體冗餘性。

  • 在 SQL Server 2017 (14.x) CU 6 與更新版本中,資料庫 (.mdf.ndf) 與交易記錄 (.ldf) 檔案預設不會使用 writethroughalternatewritethrough,因為其使用強制排清行為。 Trace flag 3979 會停用資料庫與交易日誌檔案的強制沖洗行為,並使用 writethroughalternatewritethrough 邏輯。

  • SQL Server 開啟FILE_FLAG_WRITE_THROUGH的其他檔案,例如資料庫快照、用於資料庫一致性檢查的內部快照()、DBCC CHECKDB剖析器追蹤檔案,以及擴展事件追蹤檔案,則使用與writethroughalternatewritethrough優化。

如需 SQL Server 2017 (14.x) CU 6 中引進之變更的詳細資訊,請參閱 KB 4131496。 如需有關強制單位存取 (FUA) 的內部資訊,請參閱 FUA internals

SQL Server 和強制單元存取 (FUA) 的 I/O 子系統功能

部分支援的 Linux 發行版會在 I/O 子系統層級實作強制單元存取(FUA),以確保資料的穩定性。 SQL Server 利用此能力為 Linux 工作負載提供高效且可靠的 I/O 效能。 欲了解更多關於 Linux 發行版中 FUA 支援及其對 SQL Server 的影響,請參閱 Linux 上的 SQL Server:強制單元存取(FUA)內部結構

對 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)不再支援。

  • 對於 SQL Server 儲存的 XFS 文件系統,適用於 Linux 核心 4.18 或更新版本。

  • Linux 核心 5.6 或更新版本上 SQL Server 記憶體的 ext4 文件系統。

    Note

    當 Linux 核心版本低於 5.6 時,請使用 XFS 檔案系統來架設 SQL Server 資料和交易日誌檔案。 從核心 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. 儲存必須使用 XFSext4 檔案系統,且應支援 FUA(ext4 在 Linux 核心 5.6 版本之前不支援 FUA)。 啟用此設定前,請與你的 Linux 發行版及儲存供應商合作,確保作業系統與儲存子系統支援 FUA 選項。 在 Kubernetes 上,您可以使用下列命令來查詢檔案系統類型,其中 <pvc-name> 是您的 PersistentVolumeClaim

    kubectl describe pv <pvc-name>
    

    在輸出結果中,查找被設定為 XFS 的 fstype

  3. 承載 SQL Server Pods 的工作節點應使用支援 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