1. 程式人生 > >NUMA和SMP 架構區別以及對SWAP的影響

NUMA和SMP 架構區別以及對SWAP的影響

必須得承認,即使看完了MySQL如何避免使用swapMySQL如何避免使用swap(二),swap仍然可能頑固地在主機上覆現。不過幸運的是,最近一年來眾多swap問題的受害者們通過不懈的努力找到了終極原因——NUMA。下面站在巨人的肩膀上,為大家簡單講解一下NUMA的原理和優化方法。

一、NUMA和SMP
NUMA和SMP是兩種CPU相關的硬體架構。在SMP架構裡面,所有的CPU爭用一個匯流排來訪問所有記憶體,優點是資源共享,而缺點是匯流排爭用激烈。隨著PC伺服器上的CPU數量變多(不僅僅是CPU核數),匯流排爭用的弊端慢慢越來越明顯,於是Intel在Nehalem CPU上推出了NUMA架構,而AMD也推出了基於相同架構的Opteron CPU。

NUMA最大的特點是引入了node和distance的概念。對於CPU和記憶體這兩種最寶貴的硬體資源,NUMA用近乎嚴格的方式劃分了所屬的資源組(node),而每個資源組內的CPU和記憶體是幾乎相等。資源組的數量取決於物理CPU的個數(現有的PC server大多數有兩個物理CPU,每個CPU有4個核);distance這個概念是用來定義各個node之間呼叫資源的開銷,為資源排程優化演算法提供資料支援。

二、NUMA相關的策略
1、每個程序(或執行緒)都會從父程序繼承NUMA策略,並分配有一個優先node。如果NUMA策略允許的話,程序可以呼叫其他node上的資源。
2、NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind規定程序執行在某幾個node之上,而physcpubind可以更加精細地規定執行在哪些核上。

3、NUMA的記憶體分配策略有localalloc、preferred、membind、interleave。localalloc規定程序從當前node上請求分配記憶體;而preferred比較寬鬆地指定了一個推薦的node來獲取記憶體,如果被推薦的node上沒有足夠記憶體,程序可以嘗試別的node。membind可以指定若干個node,程序只能從這些指定的node上請求分配記憶體。interleave規定程序從指定的若干個node上以RR演算法交織地請求分配記憶體。

三、NUMA和swap的關係
可能大家已經發現了,NUMA的記憶體分配策略對於程序(或執行緒)之間來說,並不是公平的。在現有的Redhat Linux中,localalloc是預設的NUMA記憶體分配策略,這個配置選項導致資源獨佔程式很容易將某個node的記憶體用盡。而當某個node的記憶體耗盡時,Linux又剛好將這個node分配給了某個需要消耗大量記憶體的程序(或執行緒),swap就妥妥地產生了。儘管此時還有很多page cache可以釋放,甚至還有很多的free記憶體。


四、解決swap問題
雖然NUMA的原理相對複雜,實際上解決swap卻很簡單:只要在啟動MySQL之前使用numactl –interleave來修改NUMA策略即可。
值得注意的是,numactl這個命令不僅僅可以調整NUMA策略,也可以用來檢視當前各個node的資源是用情況,是一個很值得研究的命令。

引用資料:
The MySQL “swap insanity” problem and the effects of the NUMA architecture
NUMA Status: Item Definition
Linux Administrator’s Manual(#man numactl)