1、NUMA介紹前端
在介紹numactl以前,須要先說說NUMA是什麼,這樣才能更好的理解numactl。java
NUMA(Non Uniform Memory Access Architecture)字面直譯爲"非一致性內存訪問",對於Linux內核來講最先出如今2.6.7版本上。這種特性對於當下大內存+多CPU爲潮流的X86平臺來講確實會有很多的性能提高,但相反的,若是配置不當的話,也是一個很大的坑.node
非統一內存訪問(NUMA)是一種用於多處理器的電腦記憶體設計,內存訪問時間取決於處理器的內存位置。 在NUMA下,處理器訪問它本身的本地存儲器的速度比非本地存儲器(存儲器的地方到另外一個處理器之間共享的處理器或存儲器)快一些。NUMA架構在邏輯上遵循對稱多處理(SMP)架構。 它是在二十世紀九十年代被開發出來的,開發商包括Burruphs (優利系統), Convex Computer(惠普),意大利霍尼韋爾信息系統(HISI)的(後來的Group Bull),Silicon Graphics公司(後來的硅谷圖形),Sequent電腦系統(後來的IBM),通用數據(EMC), Digital (後來的Compaq ,HP)。 這些公司研發的技術後來在類Unix操做系統中大放異彩,並在必定程度上運用到了Windows NT中。python
首次商業化實現基於NUMA的Unix系統的是對稱多處理XPS-100系列服務器,它是由VAST公司的Dan Gielen爲HISI設計的。 這個架構的巨大成功使HISI成爲了歐洲的頂級Unix廠商。git
NUMA經過提供分離的存儲器給各個處理器,避免當多個處理器訪問同一個存儲器產生的性能損失來試圖解決這個問題。對於涉及到分散的數據的應用(在服務器和相似於服務器的應用中很常見),NUMA能夠經過一個共享的存儲器提升性能至n倍,而n大約是處理器(或者分離的存儲器)的個數。mongodb
最先Intel在Nehalem架構上實現了NUMA,取代了在此以前一直使用的FSB前端總線的架構,用以對抗AMD的HyperTransport技術。一方面這個架構的特色是內存控制器從傳統的北橋中移到了CPU中,排除了商業戰略方向的考慮以外,這樣作的方法一樣是爲了實現NUMA.bash
Intel的NUMA解決方案,Litrin始終認爲它來自本家的安藤。他的模型有點相似於MapReduce。放棄總線的訪問方式,將CPU劃分到多個Node中,每一個node有本身獨立的內存空間。各個node之間經過高速互聯通信,通信通道被成爲QuickPath Interconnect即QPI。服務器
2、numactl介紹架構
numactl - Control NUMA policy for processes or shared memory #官方介紹 翻譯:控制進程或共享內存的NUMA策略
Linux提供了一個手工調優的命令numactl(默認不安裝),首先你能夠經過它查看系統的numa狀態app
#numactl --hardware available: 2 nodes (0-1) node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 node 0 size: 16290 MB node 0 free: 11947 MB node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 node 1 size: 16384 MB node 1 free: 14282 MB node distances: node 0 1 0: 10 21 1: 21 10 此係統共有2個node,各領取16個CPU和16G內存。 這裏假設我要執行一個java param命令,此命令須要12G內存;一個python param命令,須要16G內存。 最好的優化方案時python在node0中執行,而java在node1中執行,那命令是: #numactl --cpubind=0 --membind=0 python param #numactl --cpubind=1 --membind=1 java param 固然,也能夠自找沒趣進行以下配置: #numactl --cpubind=0 --membind=0,1 java param 經過numastat命令能夠查看numa狀態 注:numastat - Show per-NUMA-node memory statistics for processes and the operating system 中文翻譯:顯示進程和操做系統的每一個NUMA節點內存統計信息 # numastat node0 node1 numa_hit 61086587932 25494360922 numa_miss 101325832 28581785059 numa_foreign 28581785059 101325832 interleave_hit 28949 28518 local_node 61086561129 25494416828 other_node 101352635 28581729153 other_node太高意味着須要從新規劃numa.
3、使用numactl啓動mongodb
#numactl --interleave=all /opt/app/mongodb/bin/mongod -f /etc/mongodb.conf 即分配全部的node供其使用,這也是官方推薦的用法。
4、使用普通用戶啓動mongodb
關閉 #su - mongodb -s /bin/bash -c "/opt/app/mongodb/bin/mongod -f /opt/app/mongodb/etc/mongodb.conf --shutdown" 啓動 #su - mongodb -s /bin/bash -c "numactl --interleave=all /opt/app/mongodb/bin/mongod -f /opt/app/mongodb/etc/mongodb.conf"