適用於:Linux 上的 SQL Server
此文章描述如何在 Linux 上為 SQL Server 2019 (15.x) 與更新版本設定持續性記憶體 (PMEM)。
概觀
SQL Server 2019 (15.x) 引進許多使用持續性記憶體的記憶體內部功能。 此文章涵蓋針對 Linux 上的 SQL Server 設定持續性記憶體的必要步驟。
注意
「啟示」一詞被引入是為了傳達使用持續性記憶體感知檔案系統的概念。 使用記憶體對應 (mmap()) 方便從使用者空間應用程式直接存取檔案系統。 建立檔案的記憶體對應後,應用程式即可完全略過 I/O 堆疊,發出載入/儲存指示。 就主機延伸模組應用程式的觀點而言,這可視為「先進」檔案存取方法 (這是允許 SQLPAL 與 Windows 或 Linux 作業系統互動的程式碼)。
建立 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 設定,並建立及掛接之後,您就可以將資料庫檔案放在其中或建立新的資料庫。
當以模式 tempdb 設定時,您可以使用下列命令將 SQL Server 資料檔案 (MDFS、NDFS) 與 fsdax 檔案儲存在 PMEM 裝置上。 請勿使用此方法來儲存 SQL Server 記錄 (LDFS) 檔案,因為交易記錄必須位於提供磁區不可部分完成性保證的儲存體上:
ndctl create-namespace -f -e namespace0.0 --mode=fsdax --map=dev
在上述命令中設定 map 選項之前,請記住下列幾點:
- 為了在針對此裝置存取及更新這些 NVDIMM 分頁項目時獲得最佳效能,最好使用
-map=mem - 如果 NVDIMM 的容量太大 (大於 512 GB),請設定
–map=dev,這會影響 IO 輸送量並妨礙效能
針對 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) 安全,所以您可以停用強制排清行為。
注意
儲存體系統可以確保任何已快取或已分段的寫入都會被視為安全且持久,方法是確保發行至裝置的寫入會保留在媒體上,讓那些寫入在發生系統當機、介面重設與電源故障時仍可用,而且媒體本身為硬體備援。
在 SQL Server 2017 (14.x) CU 6 與更新版本中,資料庫 (
.mdf與.ndf) 與交易記錄 (.ldf) 檔案預設不會使用writethrough與alternatewritethrough,因為其使用強制排清行為。 追蹤旗號 3979 會停用資料庫和交易記錄檔的強制排清行為,並使用writethrough和alternatewritethrough的邏輯。針對在 SQL Server 中使用
FILE_FLAG_WRITE_THROUGH開啟的其他檔案 (例如資料庫快照集、資料庫一致性檢查的內部快照集 (DBCC CHECKDB)、分析工具追蹤檔案與延伸事件追蹤檔案),請使用writethrough和alternatewritethrough最佳化。
如需 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 的影響,請參閱 SQL Server on Linux:強制單元存取(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 開始)
注意
從 SQL Server 2025(17.x)開始,SUSE Linux Enterprise Server(SLES)不再支援。
對於 SQL Server 儲存的 XFS 文件系統,適用於 Linux 核心 4.18 或更新版本。
Linux 核心 5.6 或更新版本上 SQL Server 記憶體的 ext4 文件系統。
注意
當 Linux 核心版本低於 5.6 時,請使用 XFS 檔案系統來架設 SQL Server 資料和交易日誌檔案。 從核心 5.6 版開始,您可以根據您的特定需求在 XFS 和 ext4 之間選擇。
支援並配置為 FUA 功能的儲存子系統與硬體
建議的設定:
啟用追蹤旗標 3979 作為啟動參數。
使用 mssql-conf 來設定
control.writethrough = 1和control.alternatewritethrough = 0。
對於幾乎所有不符合上述條件的配置,請使用以下推薦配置:
啟用追蹤旗標 3982 作為啟動參數 (這是 Linux 生態系統中 SQL Server 的預設值),並確定追蹤旗標 3979 未啟用為啟動參數。
使用 mssql-conf 來設定
control.writethrough = 1和control.alternatewritethrough = 1。
在 Kubernetes 中部署之 SQL Server 容器的 FUA 支援
SQL Server 必須使用永續性掛接儲存體,而不是
overlayfs。儲存必須使用 XFS 或 ext4 檔案系統,且應支援 FUA(ext4 在 Linux 核心 5.6 版本之前不支援 FUA)。 啟用此設定前,請與你的 Linux 發行版及儲存供應商合作,確保作業系統與儲存子系統支援 FUA 選項。 在 Kubernetes 上,您可以使用下列命令來查詢檔案系統類型,其中
<pvc-name>是您的PersistentVolumeClaim:kubectl describe pv <pvc-name>在輸出中,尋找已設定為 XFS 的
fstype。承載 SQL Server Pods 的工作節點應使用支援 FUA 功能的 Linux 發行版及版本(從 Red Hat Enterprise Linux 8.0、SUSE Linux Enterprise Server 12 SP5 或 Ubuntu 18.04 開始)。
若符合上述條件,請使用以下建議的 FUA 設定:
啟用追蹤旗標 3979 作為啟動參數。
使用 mssql-conf 來設定
control.writethrough = 1和control.alternatewritethrough = 0。