傳統 SMP 架構下 CPU 增多受限於共享匯流排,NUMA (Non-Uniform Memory Access) 透過**每核心專屬本地記憶體**緩解擴展瓶頸。本文結合 Oracle Open World 實戰分享,解析 NUMA 對 Intel Nehalem CPU 上 Oracle 效能的影響、啟用條件、參數控制與 Amdahl 定律啟示。
| 架構 | 記憶體存取 | 擴展瓶頸 | 適用場景 |
|---|---|---|---|
| SMP (Symmetric Multi-Processing) | 所有 CPU 共享單一記憶體控制器,均勻延遲 | 共享匯流排/記憶體控制器飽和 | 小核心數 (≤8~16) |
| NUMA | 每 CPU Socket/Node 擁有本地記憶體,跨 Node 存取延遲較高 (1.5~3x) | 跨 Node 記憶體流量 (Interconnect) | 大核心數、多 Socket 伺服器 |
numactl --hardware 可見拓撲。_enable_NUMA_support=TRUE (隱性) 或 _enable_NUMA_optimization=TRUE。-- 檢查是否啟用 (需 SYS)
SELECT name, value FROM v$parameter WHERE name LIKE '%numa%';
-- 強制關閉 (實例層級)
ALTER SYSTEM SET "_enable_NUMA_support"=FALSE SCOPE=SPFILE; -- 需重啟
-- OS 層級關閉 (Grub 參數)
numa=off
「並行加速比受限於串行部分」。多核不等於線性加速,**記憶體存取非一致性** 正是串行瓶頸來源之一。NUMA 意義在於**將資料盡量放在本地 Node**,減少跨 Node 存取 (Remote Memory Access)。
lscpu / numactl --hardware 看 Socket/Node 數、CPU 分配。numactl --cpunodebind=0 --membind=0 oracle (測試用),生產靠 OS Scheduler 自動最佳化。_numa_pool_size 控制。numastat -p 觀察 numa_miss (跨 Node 存取) 比率。深入理解 NUMA 拓撲、OS 排程與 Oracle 參數三方互動,才能在 Intel Nehalem 至最新 Xeon Scalable 平台上榨乾硬體效能,避免「買了 64 核心跑得像 32 核」的尷尬。