標籤:
??
問題:在mongodb登入時日誌顯示如下:
[[email protected]_180 ~]$ mongo -u root -p xxxxx --authenticationDatabase admin
MongoDB shell version: 2.6.4
connecting to: test
Server has startup warnings:
2015-07-16T04:35:34.694+0800 [initandlisten]
2015-07-16T04:35:34.694+0800 [initandlisten] ** WARNING: You are running on a NUMA machine.
2015-07-16T04:35:34.694+0800 [initandlisten] ** We suggest launching mongod like this to avoid performance problems:
2015-07-16T04:35:34.694+0800 [initandlisten] ** numactl --interleave=all mongod [other options]
2015-07-16T04:35:34.694+0800 [initandlisten]
解決方案:
1.在原啟動命令前面加numactl –interleave=all
如# numactl –interleave=all ${MONGODB_HOME}/bin/mongod –config conf/mongodb.conf
2.修改核心參數
echo 0 > /proc/sys/vm/zone_reclaim_mode
http://www.mongodb.org/display/DOCS/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的資源是用情況,是一個很值得研究的命令。
mongodb的NUMA問題