Non-Uniform Memory Access (NUMA)

先從假設說起

在之前學習 frame allocation 的過程中,我們都有一個隱含的假設:所有記憶體的存取速度都一樣,CPU 存取任何一塊記憶體花費的時間相同。這個假設在單顆 CPU 的系統中大致成立,但在現代的多處理器系統中,這個假設就不再正確了。


什麼是 NUMA?

現代伺服器或高效能電腦通常有多個 CPU,每個 CPU 旁邊都有一塊「就近」的記憶體,CPU 之間再透過 interconnect(系統匯流排)互相連接。CPU₀ 旁邊有 memory₀,CPU₁ 旁邊有 memory₁,以此類推。

關鍵點在於:CPU₀ 存取 memory₀ 的速度,遠快於它去存取 memory₁ 或 memory₂,因為後者需要跨過 interconnect 才能到達,延遲更高。這種「存取速度因距離而不同」的架構就叫做 NUMA。


對 OS 的挑戰

這對 frame allocation 造成了新的問題。如果 OS 隨意把 frame 分配給 process,可能讓一個跑在 CPU₀ 上的 thread 去存取 memory₃ 的 frame,造成不必要的延遲。

因此最佳策略是:把 thread 的記憶體分配在它正在執行的 CPU 旁邊的記憶體,同時也要盡量讓 scheduler 把同一個 thread 排在同一顆 CPU 上執行,避免 thread 搬到另一顆 CPU 後,原本分配的記憶體又變成「遠端記憶體」。