NUMA的取舍


現在的機器上都是有多個CPU和多個內存塊的。以前我們都是將內存塊看成是一大塊內存,所有CPU到這個共享內存的訪問消息是一樣的。這就是之前普遍使用的SMP模型。但是隨着處理器的增加,共享內存可能會導致內存訪問沖突越來越厲害,且如果內存訪問達到瓶頸的時候,性能就不能隨之增加。NUMA(Non-Uniform Memory Access)就是這樣的環境下引入的一個模型。比如一台機器是有2個處理器,有4個內存塊。我們將1個處理器和兩個內存塊合起來,稱為一個NUMA node,這樣這個機器就會有兩個NUMA node。在物理分布上,NUMA node的處理器和內存塊的物理距離更小,因此訪問也更快。比如這台機器會分左右兩個處理器(cpu1, cpu2),在每個處理器兩邊放兩個內存塊(memory1.1, memory1.2, memory2.1,memory2.2),這樣NUMA node1的cpu1訪問memory1.1和memory1.2就比訪問memory2.1和memory2.2更快。所以使用NUMA的模式如果能盡量保證本node內的CPU只訪問本node內的內存塊,那這樣的效率就是最高的。

 

在運行程序的時候使用numactl -m和-physcpubind就能制定將這個程序運行在哪個cpu和哪個memory中。玩轉cpu-topology 給了一個表格,當程序只使用一個node資源和使用多個node資源的比較表(差不多是38s與28s的差距)。所以限定程序在numa node中運行是有實際意義的。

 

但是呢,話又說回來了,制定numa就一定好嗎?--numa的陷阱。SWAP的罪與罰文章就說到了一個numa的陷阱的問題。現象是當你的服務器還有內存的時候,發現它已經在開始使用swap了,甚至已經導致機器出現停滯的現象。這個就有可能是由於numa的限制,如果一個進程限制它只能使用自己的numa節點的內存,那么當自身numa node內存使用光之后,就不會去使用其他numa node的內存了,會開始使用swap,甚至更糟的情況,機器沒有設置swap的時候,可能會直接死機!所以你可以使用numactl --interleave=all來取消numa node的限制。

 

綜上所述得出的結論就是,根據具體業務決定NUMA的使用。

 

如果你的程序是會占用大規模內存的,你大多應該選擇關閉numa node的限制。因為這個時候你的程序很有幾率會碰到numa陷阱。

另外,如果你的程序並不占用大內存,而是要求更快的程序運行時間。你大多應該選擇限制只訪問本numa node的方法來進行處理。

 

參考文檔:

http://www.cnblogs.com/shanyou/archive/2009/12/26/1633052.html

http://www.enet.com.cn/article/2010/0511/A20100511651737_4.shtml

http://www.ibm.com/developerworks/cn/linux/l-numa/index.html

http://baike.baidu.com/view/380118.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM