一、NUMA介紹
在介紹numactl之前,需要先說說NUMA是什么,這樣才能更好的理解numactl。
NUMA(Non Uniform Memory Access Architecture)字面直譯為"非一致性內存訪問",對于Linux內核來說最早出現在2.6.7版本上。這種特性對于當下大內存+多CPU為潮流的X86平臺來說確實會有不少的性能提升,但相反的,如果配置不當的話,也是一個很大的坑.
非統一內存訪問(NUMA)是一種用于多處理器的電腦記憶體設計,內存訪問時間取決于處理器的內存位置。 在NUMA下,處理器訪問它自己的本地存儲器的速度比非本地存儲器(存儲器的地方到另一個處理器之間共享的處理器或存儲器)快一些。NUMA架構在邏輯上遵循對稱多處理(SMP)架構。 它是在二十世紀九十年代被開發出來的,開發商包括Burruphs (優利系統), Convex Computer(惠普),意大利霍尼韋爾信息系統(HISI)的(后來的Group Bull),Silicon Graphics公司(后來的硅谷圖形),Sequent電腦系統(后來的IBM),通用數據(EMC), Digital (后來的Compaq ,HP)。 這些公司研發的技術后來在類Unix操作系統中大放異彩,并在一定程度上運用到了Windows NT中。
首次商業化實現基于NUMA的Unix系統的是對稱多處理XPS-100系列服務器,它是由VAST公司的Dan Gielen為HISI設計的。 這個架構的巨大成功使HISI成為了歐洲的頂級Unix廠商。
NUMA通過提供分離的存儲器給各個處理器,避免當多個處理器訪問同一個存儲器產生的性能損失來試圖解決這個問題。對于涉及到分散的數據的應用(在服務器和類似于服務器的應用中很常見),NUMA可以通過一個共享的存儲器提高性能至n倍,而n大約是處理器(或者分離的存儲器)的個數。
最早Intel在Nehalem架構上實現了NUMA,取代了在此之前一直使用的FSB前端總線的架構,用以對抗AMD的HyperTransport技術。一方面這個架構的特點是內存控制器從傳統的北橋中移到了CPU中,排除了商業戰略方向的考慮之外,這樣做的方法同樣是為了實現NUMA.
Intel的NUMA解決方案,Litrin始終認為它來自本家的安藤。他的模型有點類似于MapReduce。放棄總線的訪問方式,將CPU劃分到多個Node中,每個node有自己獨立的內存空間。各個node之間通過高速互聯通訊,通訊通道被成為QuickPath Interconnect即QPI。
二、numactl介紹
numactl - Control NUMA policy for processes or shared memory #官方介紹 翻譯:控制進程或共享內存的NUMA策略
Linux提供了一個手工調優的命令numactl(默認不安裝),首先你可以通過它查看系統的numa狀態
#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.
三、使用numactl啟動mongodb
#numactl --interleave=all /opt/app/mongodb/bin/mongod -f /etc/mongodb.conf 即分配所有的node供其使用,這也是官方推薦的用法。
四、使用普通用戶啟動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"
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。