共用方式為


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

適用於: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 建立命名空間。 命名空間會在各 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) 檔案預設不會使用 writethroughalternatewritethrough,因為其使用強制排清行為。 追蹤旗號 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 發行版本,可支援 FUA I/O 子系統功能,以提供資料持久性。 SQL Server 使用 FUA 功能為 SQL Server 工作負載提供高效率且可靠的 I/O。 如需 Linux 發行版本對 FUA 的支援,以及其對 SQL Server 影響的詳細資訊,請參閱 Linux 上的 SQL Server:強制單位存取 (FUA) 內部

從 SUSE Linux Enterprise Server 12 SP5、Red Hat Enterprise Linux 8.0 與 Ubuntu 18.04 開始支援 I/O 子系統中的 FUA 功能。 如果正在使用 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 儲存的 XFS 文件系統,適用於 Linux 核心 4.18 或更新版本。

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

    注意

    當 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 不支援 5.6 版之前的 Linux 核心 FUA)。 啟用此設定之前,您應該與 Linux 散發和儲存體廠商合作,以確保 OS 和儲存子系統支援 FUA 選項。 在 Kubernetes 上,您可以使用下列命令來查詢檔案系統類型,其中 <pvc-name> 是您的 PersistentVolumeClaim

    kubectl describe pv <pvc-name>
    

    在輸出中,尋找已設定為 XFS 的 fstype

  3. 裝載 SQL Server Pod 的背景工作角色節點,應使用支援 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