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

適用於:SQL Server - Linux

此文章描述如何在 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

技術考量

  • 如先前所述,針對 XFS/EXT4 配置 2 MB 的區塊
  • 區塊配置和 mmap 未對齊會導致以無訊息方式退回為使用 4KB
  • 檔案大小應為 2MB 的倍數 (模數 2 MB)
  • 請勿停用透明大型分頁 (THP) (在大部分的發行版本上預設為啟用)

一旦裝置以 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 內部 (英文)。

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 檔案系統

  • 儲存子系統和/或支援 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 檔案系統,而且應該支援 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