首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server NUMA 架構詳解:硬件/軟件 NUMA、內存訪問優化、SQL Server 感知與配置指南

     編輯:關於SqlServer

為什麼需要 NUMA

CPU 主頻提升快,但內存訪問速度跟不上。多 CPU 爭用單一系統總線訪問內存成為瓶頸。NUMA (Non-Uniform Memory Access) 將 CPU+內存劃分為「節點」,本地訪問快、遠程訪問慢。

硬件 NUMA vs 軟件 NUMA

維度硬件 NUMA軟件 NUMA
實現層級物理封裝/主板/芯片組支持作業系統/ SQL Server 配置模擬
檢測方式詢問硬件廠商 / `sys.dm_os_memory_clerks`註冊表配置 CPU 親和性掩碼
性能收益最佳 (真實本地內存控制器)次之 (邏輯劃分、仍共享物理總線)
適用場景多插槽服務器 (2P/4P/8P)單插槽多核、無硬件 NUMA 環境

SQL Server NUMA 感知機制

  • 啟動時自動檢測 NUMA 拓撲,每個節點對應一個 memory_node_id
  • 內存分配優先滿足本地節點 (LOCAL 分配)
  • 工作線程調度嘗試綁定同一 NUMA 節點 (SOS_SCHEDULER 親和性)
  • I/O 完成端口 (IOCP) 每節點一個,分散網絡 I/O 處理

查看 NUMA 拓撲

-- 方法 1: DMV 查看節點數
SELECT DISTINCT memory_node_id FROM sys.dm_os_memory_clerks;

-- 方法 2: 錯誤日誌啟動信息
-- "Server Node configuration: node 0: CPU mask: 0x000000000000000f, Active CPU mask: 0x000000000000000f"
-- "Server Node configuration: node 1: CPU mask: 0x00000000000000f0, Active CPU mask: 0x00000000000000f0"

軟件 NUMA 配置 (註冊表)

路徑:HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\NodeConfiguration

  • 創建 `CPUMask` (DWORD) 值,每個節點一個值名 `Node0`、`Node1`…
  • 值為 CPU 親和性掩碼 (十六進制):如 4 核分 2 節點 → `Node0=0x3` (核 0,1)、`Node1=0xC` (核 2,3)
  • 重啟 SQL Server 服務生效

最佳實踐建議

  1. 硬件 NUMA 服務器勿禁用,確保 BIOS 開啟 Node Interleaving = Disabled
  2. 2. `MAXDOP` 設置 ≤ 單 NUMA 節點核心數,避免跨節點並行查詢 3. `trace flag 8048` (SQL 2008 R2 SP2+/2012 SP1+) 將全局內存對象轉為分區,減少跨節點爭用 4. 監控 `sys.dm_os_memory_nodes`、`sys.dm_os_schedulers` 親和性分佈 5. 虛擬化環境確保 vNUMA 正確暴露給客體 OS

NUMA 架構示意圖 錯誤日誌 NUMA 節點信息 軟件 NUMA 註冊表配置

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved