本篇文章為大家展示了NUMA技術怎么用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
在os層numa關閉時,打開bios層的numa會影響性能,QPS會下降15-30%;
在bios層面numa關閉時,無論os層面的numa是否打開,都不會影響性能。
安裝numactl:
#yum install numactl -y
#numastat 等同于 cat /sys/devices/system/node/node0/numastat ,在/sys/devices/system/node/文件夾中記錄系統(tǒng)中的所有內存節(jié)點的相關詳細信息。 #numactl --hardware 列舉系統(tǒng)上的NUMA節(jié)點
#numactl --show 查看綁定信息
Redhat或者Centos系統(tǒng)中可以通過命令判斷bios層是否開啟numa
# grep -i numa /var/log/dmesg
如果輸出結果為: No NUMA configuration found
說明numa為disable,如果不是上面內容說明numa為enable,例如顯示:NUMA: Using 30 for the hash shift.
可以通過lscpu命令查看機器的NUMA拓撲結構。
當發(fā)現numa_miss數值比較高時,說明需要對分配策略進行調整。例如將指定進程關聯綁定到指定的CPU上,從而提高內存命中率。
---------------------------------------------
現在的機器上都是有多個CPU和多個內存塊的。以前我們都是將內存塊看成是一大塊內存,所有CPU到這個共享內存的訪問消息是一樣的。這就是之前普遍使用的SMP模型。但是隨著處理器的增加,共享內存可能會導致內存訪問沖突越來越厲害,且如果內存訪問達到瓶頸的時候,性能就不能隨之增加。NUMA(Non-Uniform Memory Access)就是這樣的環(huán)境下引入的一個模型。比如一臺機器是有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的陷阱的問題。現象是當你的服務器還有內存的時候,發(fā)現它已經在開始使用swap了,甚至已經導致機器出現停滯的現象。這個就有可能是由于numa的限制,如果一個進程限制它只能使用自己的numa節(jié)點的內存,那么當自身numa node內存使用光之后,就不會去使用其他numa node的內存了,會開始使用swap,甚至更糟的情況,機器沒有設置swap的時候,可能會直接死機!所以你可以使用numactl --interleave=all來取消numa node的限制。
綜上所述得出的結論就是,根據具體業(yè)務決定NUMA的使用。
如果你的程序是會占用大規(guī)模內存的,你大多應該選擇關閉numa node的限制(或從硬件關閉numa)。因為這個時候你的程序很有幾率會碰到numa陷阱。
另外,如果你的程序并不占用大內存,而是要求更快的程序運行時間。你大多應該選擇限制只訪問本numa node的方法來進行處理。
---------------------------------------------------------------------
內核參數overcommit_memory :
它是 內存分配策略
可選值:0、1、2。
0:表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,并把錯誤返回給應用進程。
1:表示內核允許分配所有的物理內存,而不管當前的內存狀態(tài)如何。
2:表示內核允許分配超過所有物理內存和交換空間總和的內存
內核參數zone_reclaim_mode:
可選值0、1
a、當某個節(jié)點可用內存不足時:
1、如果為0的話,那么系統(tǒng)會傾向于從其他節(jié)點分配內存
2、如果為1的話,那么系統(tǒng)會傾向于從本地節(jié)點回收Cache內存多數時候
b、Cache對性能很重要,所以0是一個更好的選擇
----------------------------------------------------------------------
mongodb的NUMA問題
mongodb日志顯示如下:
WARNING: You are running on a NUMA machine.
We suggest launching mongod like this to avoid performance problems:
numactl –interleave=all mongod [other options]
解決方案,臨時修改numa內存分配策略為 interleave=all (在所有node節(jié)點進行交織分配的策略):
1.在原啟動命令前面加numactl –interleave=all
如# numactl --interleave=all ${MONGODB_HOME}/bin/mongod --config conf/mongodb.conf
2.修改內核參數
echo 0 > /proc/sys/vm/zone_reclaim_mode ; echo "vm.zone_reclaim_mode = 0" >> /etc/sysctl.conf
----------------------------------------------------------------------
一、NUMA和SMP
NUMA和SMP是兩種CPU相關的硬件架構。在SMP架構里面,所有的CPU爭用一個總線來訪問所有內存,優(yōu)點是資源共享,而缺點是總線爭用激烈。隨著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之間調用資源的開銷,為資源調度優(yōu)化算法提供數據支持。
二、NUMA相關的策略
1、每個進程(或線程)都會從父進程繼承NUMA策略,并分配有一個優(yōu)先node。如果NUMA策略允許的話,進程可以調用其他node上的資源。
2、NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind規(guī)定進程運行在某幾個node之上,而physcpubind可以更加精細地規(guī)定運行在哪些核上。
3、NUMA的內存分配策略有l(wèi)ocalalloc、preferred、membind、interleave。
localalloc規(guī)定進程從當前node上請求分配內存;
而preferred比較寬松地指定了一個推薦的node來獲取內存,如果被推薦的node上沒有足夠內存,進程可以嘗試別的node。
membind可以指定若干個node,進程只能從這些指定的node上請求分配內存。
interleave規(guī)定進程從指定的若干個node上以RR(Round Robin 輪詢調度)算法交織地請求分配內存。
因為NUMA默認的內存分配策略是優(yōu)先在進程所在CPU的本地內存中分配,會導致CPU節(jié)點之間內存分配不均衡,當某個CPU節(jié)點的內存不足時,會導致swap產生,而不是從遠程節(jié)點分配內存。這就是所謂的swap insanity 現象。
MySQL采用了線程模式,對于NUMA特性的支持并不好,如果單機只運行一個MySQL實例,我們可以選擇關閉NUMA,關閉的方法有三種:
1.硬件層,在BIOS中設置關閉
2.OS內核,啟動時設置numa=off;
3.可以用numactl命令將內存分配策略修改為interleave(交叉)。
如果單機運行多個MySQL實例,我們可以將MySQL綁定在不同的CPU節(jié)點上,并且采用綁定的內存分配策略,強制在本節(jié)點內分配內存,這樣既可以充分利用硬件的NUMA特性,又避免了單實例MySQL對多核CPU利用率不高的問題
三、NUMA和swap的關系
可能大家已經發(fā)現了,NUMA的內存分配策略對于進程(或線程)之間來說,并不是公平的。在現有的Redhat Linux 中,localalloc是默認的NUMA內存分配策略,這個配置選項導致資源獨占程序很容易將某個node的內存用盡。而當某個node的內存耗盡時,Linux又剛好將這個node分配給了某個需要消耗大量內存的進程(或線程),swap就妥妥地產生了。盡管此時還有很多page cache可以釋放,甚至還有很多的free內存。
四、解決swap問題
雖然NUMA的原理相對復雜,實際上解決swap卻很簡單:只要在啟動MySQL之前使用numactl –interleave來修改NUMA策略即可。
值得注意的是,numactl這個命令不僅僅可以調整NUMA策略,也可以用來查看當前各個node的資源使用情況,是一個很值得研究的命令。
一、CPU
首先從CPU說起。
你仔細檢查的話,有些服務器上會有的一個有趣的現象:你cat /proc/cpuinfo時,會發(fā)現CPU的頻率竟然跟它標稱的頻率不一樣:
#cat /proc/cpuinfo
processor : 5
model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz
cpu MHz : 1200.000
這個是Intel E5-2620的CPU,他是2.00G * 24的CPU,但是,我們發(fā)現第5顆CPU的頻率為1.2G。
這是什么原因呢?
這些其實都源于CPU最新的技術:節(jié)能模式。操作系統(tǒng)和CPU硬件配合,系統(tǒng)不繁忙的時候,為了節(jié)約電能和降低溫度,它會將CPU降頻。這對環(huán)保人士和抵制地球變暖來說是一個福音,但是對MySQL來說,可能是一個災難。
為了保證MySQL能夠充分利用CPU的資源,建議設置CPU為大性能模式。這個設置可以在BIOS和操作系統(tǒng)中設置,當然,在BIOS中設置該選項更好,更徹底。由于各種BIOS類型的區(qū)別,設置為CPU為大性能模式千差萬別,我們這里就不具體展示怎么設置了。
然后我們看看內存方面,我們有哪些可以優(yōu)化的。
i) 我們先看看numa
非一致存儲訪問結構 (NUMA : Non-Uniform Memory Access) 也是最新的內存管理技術。它和對稱多處理器結構 (SMP : Symmetric Multi-Processor) 是對應的。簡單的隊別如下:
如圖所示,詳細的NUMA信息我們這里不介紹了。但是我們可以直觀的看到:SMP訪問內存的都是代價都是一樣的;但是在NUMA架構下,本地內存的訪問和非 本地內存的訪問代價是不一樣的。對應的根據這個特性,操作系統(tǒng)上,我們可以設置進程的內存分配方式。目前支持的方式包括:
--interleave=nodes
--membind=nodes
--cpunodebind=nodes
--physcpubind=cpus
--localalloc
--preferred=node
簡而言之,就是說,你可以指定內存在本地分配,在某幾個CPU節(jié)點分配或者輪詢分配。除非 是設置為--interleave=nodes輪詢分配方式,即內存可以在任意NUMA節(jié)點上分配這種方式以外。其他的方式就算其他NUMA節(jié)點上還有內 存剩余,Linux也不會把剩余的內存分配給這個進程,而是采用SWAP的方式來獲得內存。有經驗的系統(tǒng)管理員或者DBA都知道SWAP導致的數據庫性能 下降有多么坑爹。
所以最簡單的方法,還是關閉掉這個特性。
關閉特性的方法,分別有:可以從BIOS,操作系統(tǒng),啟動進程時臨時關閉這個特性。
a) 由于各種BIOS類型的區(qū)別,如何關閉NUMA千差萬別,我們這里就不具體展示怎么設置了。
b) 在操作系統(tǒng)中關閉,可以直接在/etc/grub.conf的kernel行最后添加numa=off,如下所示:
kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM numa=off
另外可以設置 vm.zone_reclaim_mode=0盡量回收內存。
c) 啟動MySQL的時候,關閉NUMA特性:
numactl --interleave=all mysqld
當然,最好的方式是在BIOS中關閉。
ii) 我們再看看vm.swappiness。
vm.swappiness是操作系統(tǒng)控制物理內存交換出去的策略。它允許的值是一個百分比的值,最小為0,大運行100,該值默認為60。vm.swappiness設置為0表示盡量少swap,100表示盡量將inactive的內存頁交換出去。
具體的說:當內存基本用滿的時候,系統(tǒng)會根據這個參數來判斷是把內存中很少用到的inactive 內存交換出去,還是釋放數據的cache。cache中緩存著從磁盤讀出來的數據,根據程序的局部性原理,這些數據有可能在接下來又要被讀 取;inactive 內存顧名思義,就是那些被應用程序映射著,但是 長時間 不用的內存。
我們可以利用vmstat看到inactive的內存的數量:
#vmstat -an 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 0 27522384 326928 1704644 0 0 0 153 11 10 0 0 100 0 0
0 0 0 27523300 326936 1704164 0 0 0 74 784 590 0 0 100 0 0
0 0 0 27523656 326936 1704692 0 0 8 8 439 1686 0 0 100 0 0
0 0 0 27524300 326916 1703412 0 0 4 52 198 262 0 0 100 0 0
通過/proc/meminfo 你可以看到更詳細的信息:
#cat /proc/meminfo | grep -i inact
Inactive: 326972 kB
Inactive(anon): 248 kB
Inactive(file): 326724 kB
這里我們對不活躍inactive內存進一步深入討論。 Linux中,內存可能處于三種狀態(tài):free,active和inactive。眾所周知,Linux Kernel在內部維護了很多LRU列表用來管理內存,比如LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用來管理匿名頁,LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用來管理page caches頁緩存。系統(tǒng)內核會根據內存頁的訪問情況,不定時的將活躍active內存被移到inactive列表中,這些inactive的內存可以被 交換到swap中去。
一般來說,MySQL,特別是InnoDB管理內存緩存,它占用的內存比較多,不經常訪問的內存也會不少,這些內存如果被Linux錯誤的交換出去了,將浪費很多CPU和IO資源。 InnoDB自己管理緩存,cache的文件數據來說占用了內存,對InnoDB幾乎沒有任何好處。
所以,我們在MySQL的服務器上最好設置vm.swappiness=1或0
上述內容就是NUMA技術怎么用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創(chuàng)新互聯-成都網站建設公司行業(yè)資訊頻道。
本文題目:NUMA技術怎么用-創(chuàng)新互聯
文章分享:http://www.chinadenli.net/article12/dhdigc.html
成都網站建設公司_創(chuàng)新互聯,為您提供靜態(tài)網站、Google、網站維護、品牌網站建設、ChatGPT、企業(yè)建站
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯