溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

NUMA技術(shù)怎么用

發(fā)布時(shí)間:2021-11-09 10:16:30 來(lái)源:億速云 閱讀:330 作者:柒染 欄目:建站服務(wù)器

本篇文章為大家展示了NUMA技術(shù)怎么用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

 在os層numa關(guān)閉時(shí),打開(kāi)bios層的numa會(huì)影響性能,QPS會(huì)下降15-30%;

  在bios層面numa關(guān)閉時(shí),無(wú)論os層面的numa是否打開(kāi),都不會(huì)影響性能。 

      安裝numactl:  
      #yum install numactl -y
      #numastat      等同于 cat /sys/devices/system/node/node0/numastat ,在/sys/devices/system/node/文件夾中記錄系統(tǒng)中的所有內(nèi)存節(jié)點(diǎn)的相關(guān)詳細(xì)信息。        #numactl --hardware  列舉系統(tǒng)上的NUMA節(jié)點(diǎn)

      #numactl  --show   查看綁定信息

 NUMA技術(shù)怎么用

NUMA技術(shù)怎么用 

      Redhat或者Centos系統(tǒng)中可以通過(guò)命令判斷bios層是否開(kāi)啟numa
      # grep -i numa /var/log/dmesg
      如果輸出結(jié)果為: No NUMA configuration found 
      說(shuō)明numa為disable,如果不是上面內(nèi)容說(shuō)明numa為enable,例如顯示:NUMA: Using 30 for the hash shift.
      可以通過(guò)lscpu命令查看機(jī)器的NUMA拓?fù)浣Y(jié)構(gòu)。

NUMA技術(shù)怎么用

當(dāng)發(fā)現(xiàn)numa_miss數(shù)值比較高時(shí),說(shuō)明需要對(duì)分配策略進(jìn)行調(diào)整。例如將指定進(jìn)程關(guān)聯(lián)綁定到指定的CPU上,從而提高內(nèi)存命中率。


---------------------------------------------

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

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

但是呢,話(huà)又說(shuō)回來(lái)了,制定numa就一定好嗎?--numa的陷阱。 SWAP的罪與罰 文章就說(shuō)到了一個(gè)numa的陷阱的問(wèn)題?,F(xiàn)象是當(dāng)你的服務(wù)器還有內(nèi)存的時(shí)候,發(fā)現(xiàn)它已經(jīng)在開(kāi)始使用swap了,甚至已經(jīng)導(dǎo)致機(jī)器出現(xiàn)停滯的現(xiàn)象。這個(gè)就有可能是由于numa的限制,如果一個(gè)進(jìn)程限制它只能使用自己的numa節(jié)點(diǎn)的內(nèi)存,那么當(dāng)自身numa node內(nèi)存使用光之后,就不會(huì)去使用其他numa node的內(nèi)存了,會(huì)開(kāi)始使用swap,甚至更糟的情況,機(jī)器沒(méi)有設(shè)置swap的時(shí)候,可能會(huì)直接死機(jī)!所以你可以使用numactl --interleave=all來(lái)取消numa node的限制。

綜上所述得出的結(jié)論就是,根據(jù)具體業(yè)務(wù)決定NUMA的使用。

如果你的程序是會(huì)占用大規(guī)模內(nèi)存的,你大多應(yīng)該選擇關(guān)閉numa node的限制(或從硬件關(guān)閉numa)。因?yàn)檫@個(gè)時(shí)候你的程序很有幾率會(huì)碰到numa陷阱。

另外,如果你的程序并不占用大內(nèi)存,而是要求更快的程序運(yùn)行時(shí)間。你大多應(yīng)該選擇限制只訪問(wèn)本numa node的方法來(lái)進(jìn)行處理。

---------------------------------------------------------------------

內(nèi)核參數(shù)overcommit_memory :

它是 內(nèi)存分配策略

可選值:0、1、2。

0:表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請(qǐng)?jiān)试S;否則,內(nèi)存申請(qǐng)失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。

1:表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。

2:表示內(nèi)核允許分配超過(guò)所有物理內(nèi)存和交換空間總和的內(nèi)存

內(nèi)核參數(shù)zone_reclaim_mode:

可選值0、1

a、當(dāng)某個(gè)節(jié)點(diǎn)可用內(nèi)存不足時(shí):

1、如果為0的話(huà),那么系統(tǒng)會(huì)傾向于從其他節(jié)點(diǎn)分配內(nèi)存

2、如果為1的話(huà),那么系統(tǒng)會(huì)傾向于從本地節(jié)點(diǎn)回收Cache內(nèi)存多數(shù)時(shí)候

b、Cache對(duì)性能很重要,所以0是一個(gè)更好的選擇

----------------------------------------------------------------------

mongodb的NUMA問(wèn)題

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]

解決方案,臨時(shí)修改numa內(nèi)存分配策略為 interleave=all (在所有node節(jié)點(diǎn)進(jìn)行交織分配的策略):

1.在原啟動(dòng)命令前面加numactl –interleave=all

如# numactl --interleave=all ${MONGODB_HOME}/bin/mongod --config conf/mongodb.conf

2.修改內(nèi)核參數(shù)

echo 0 > /proc/sys/vm/zone_reclaim_mode ; echo "vm.zone_reclaim_mode = 0" >> /etc/sysctl.conf

----------------------------------------------------------------------

一、NUMA和SMP

NUMA和SMP是兩種CPU相關(guān)的硬件架構(gòu)。在SMP架構(gòu)里面,所有的CPU爭(zhēng)用一個(gè)總線來(lái)訪問(wèn)所有內(nèi)存,優(yōu)點(diǎn)是資源共享,而缺點(diǎn)是總線爭(zhēng)用激烈。隨著PC服務(wù)器上的CPU數(shù)量變多(不僅僅是CPU核數(shù)),總線爭(zhēng)用的弊端慢慢越來(lái)越明顯,于是Intel在Nehalem CPU上推出了NUMA架構(gòu),而AMD也推出了基于相同架構(gòu)的Opteron CPU。

NUMA最大的特點(diǎn)是引入了node和distance的概念。對(duì)于CPU和內(nèi)存這兩種最寶貴的硬件資源,NUMA用近乎嚴(yán)格的方式劃分了所屬的資源組(node),而每個(gè)資源組內(nèi)的CPU和內(nèi)存是幾乎相等。資源組的數(shù)量取決于物理CPU的個(gè)數(shù)(現(xiàn)有的PC server大多數(shù)有兩個(gè)物理CPU,每個(gè)CPU有4個(gè)核);distance這個(gè)概念是用來(lái)定義各個(gè)node之間調(diào)用資源的開(kāi)銷(xiāo),為資源調(diào)度優(yōu)化算法提供數(shù)據(jù)支持。

二、NUMA相關(guān)的策略

1、每個(gè)進(jìn)程(或線程)都會(huì)從父進(jìn)程繼承NUMA策略,并分配有一個(gè)優(yōu)先node。如果NUMA策略允許的話(huà),進(jìn)程可以調(diào)用其他node上的資源。

2、NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind規(guī)定進(jìn)程運(yùn)行在某幾個(gè)node之上,而physcpubind可以更加精細(xì)地規(guī)定運(yùn)行在哪些核上。

3、NUMA的內(nèi)存分配策略有l(wèi)ocalalloc、preferred、membind、interleave。

localalloc規(guī)定進(jìn)程從當(dāng)前node上請(qǐng)求分配內(nèi)存;

而preferred比較寬松地指定了一個(gè)推薦的node來(lái)獲取內(nèi)存,如果被推薦的node上沒(méi)有足夠內(nèi)存,進(jìn)程可以嘗試別的node。

membind可以指定若干個(gè)node,進(jìn)程只能從這些指定的node上請(qǐng)求分配內(nèi)存。

interleave規(guī)定進(jìn)程從指定的若干個(gè)node上以RR(Round Robin 輪詢(xún)調(diào)度)算法交織地請(qǐng)求分配內(nèi)存。

因?yàn)镹UMA默認(rèn)的內(nèi)存分配策略是優(yōu)先在進(jìn)程所在CPU的本地內(nèi)存中分配,會(huì)導(dǎo)致CPU節(jié)點(diǎn)之間內(nèi)存分配不均衡,當(dāng)某個(gè)CPU節(jié)點(diǎn)的內(nèi)存不足時(shí),會(huì)導(dǎo)致swap產(chǎn)生,而不是從遠(yuǎn)程節(jié)點(diǎn)分配內(nèi)存。這就是所謂的swap insanity 現(xiàn)象。

MySQL采用了線程模式,對(duì)于NUMA特性的支持并不好,如果單機(jī)只運(yùn)行一個(gè)MySQL實(shí)例,我們可以選擇關(guān)閉NUMA,關(guān)閉的方法有三種:

1.硬件層,在BIOS中設(shè)置關(guān)閉

2.OS內(nèi)核,啟動(dòng)時(shí)設(shè)置numa=off;

3.可以用numactl命令將內(nèi)存分配策略修改為interleave(交叉)。

如果單機(jī)運(yùn)行多個(gè)MySQL實(shí)例,我們可以將MySQL綁定在不同的CPU節(jié)點(diǎn)上,并且采用綁定的內(nèi)存分配策略,強(qiáng)制在本節(jié)點(diǎn)內(nèi)分配內(nèi)存,這樣既可以充分利用硬件的NUMA特性,又避免了單實(shí)例MySQL對(duì)多核CPU利用率不高的問(wèn)題

三、NUMA和swap的關(guān)系

可能大家已經(jīng)發(fā)現(xiàn)了,NUMA的內(nèi)存分配策略對(duì)于進(jìn)程(或線程)之間來(lái)說(shuō),并不是公平的。在現(xiàn)有的Redhat  Linux 中,localalloc是默認(rèn)的NUMA內(nèi)存分配策略,這個(gè)配置選項(xiàng)導(dǎo)致資源獨(dú)占程序很容易將某個(gè)node的內(nèi)存用盡。而當(dāng)某個(gè)node的內(nèi)存耗盡時(shí),Linux又剛好將這個(gè)node分配給了某個(gè)需要消耗大量?jī)?nèi)存的進(jìn)程(或線程),swap就妥妥地產(chǎn)生了。盡管此時(shí)還有很多page cache可以釋放,甚至還有很多的free內(nèi)存。

四、解決swap問(wèn)題

雖然NUMA的原理相對(duì)復(fù)雜,實(shí)際上解決swap卻很簡(jiǎn)單:只要在啟動(dòng)MySQL之前使用numactl –interleave來(lái)修改NUMA策略即可。

值得注意的是,numactl這個(gè)命令不僅僅可以調(diào)整NUMA策略,也可以用來(lái)查看當(dāng)前各個(gè)node的資源使用情況,是一個(gè)很值得研究的命令。

一、CPU
  首先從CPU說(shuō)起。
  你仔細(xì)檢查的話(huà),有些服務(wù)器上會(huì)有的一個(gè)有趣的現(xiàn)象:你cat /proc/cpuinfo時(shí),會(huì)發(fā)現(xiàn)CPU的頻率竟然跟它標(biāo)稱(chēng)的頻率不一樣:
  #cat /proc/cpuinfo
  processor : 5
  model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz
  cpu MHz : 1200.000
  這個(gè)是Intel E5-2620的CPU,他是2.00G * 24的CPU,但是,我們發(fā)現(xiàn)第5顆CPU的頻率為1.2G。
  這是什么原因呢?
  這些其實(shí)都源于CPU最新的技術(shù):節(jié)能模式。操作系統(tǒng)和CPU硬件配合,系統(tǒng)不繁忙的時(shí)候,為了節(jié)約電能和降低溫度,它會(huì)將CPU降頻。這對(duì)環(huán)保人士和抵制地球變暖來(lái)說(shuō)是一個(gè)福音,但是對(duì)MySQL來(lái)說(shuō),可能是一個(gè)災(zāi)難。
  為了保證MySQL能夠充分利用CPU的資源,建議設(shè)置CPU為最大性能模式。這個(gè)設(shè)置可以在BIOS和操作系統(tǒng)中設(shè)置,當(dāng)然,在BIOS中設(shè)置該選項(xiàng)更好,更徹底。由于各種BIOS類(lèi)型的區(qū)別,設(shè)置為CPU為最大性能模式千差萬(wàn)別,我們這里就不具體展示怎么設(shè)置了。
  然后我們看看內(nèi)存方面,我們有哪些可以?xún)?yōu)化的。
  i) 我們先看看numa
  非一致存儲(chǔ)訪問(wèn)結(jié)構(gòu) (NUMA : Non-Uniform Memory Access) 也是最新的內(nèi)存管理技術(shù)。它和對(duì)稱(chēng)多處理器結(jié)構(gòu) (SMP : Symmetric Multi-Processor) 是對(duì)應(yīng)的。簡(jiǎn)單的隊(duì)別如下:
  如圖所示,詳細(xì)的NUMA信息我們這里不介紹了。但是我們可以直觀的看到:SMP訪問(wèn)內(nèi)存的都是代價(jià)都是一樣的;但是在NUMA架構(gòu)下,本地內(nèi)存的訪問(wèn)和非 本地內(nèi)存的訪問(wèn)代價(jià)是不一樣的。對(duì)應(yīng)的根據(jù)這個(gè)特性,操作系統(tǒng)上,我們可以設(shè)置進(jìn)程的內(nèi)存分配方式。目前支持的方式包括:
  --interleave=nodes
  --membind=nodes
  --cpunodebind=nodes
  --physcpubind=cpus
  --localalloc
  --preferred=node
  簡(jiǎn)而言之,就是說(shuō),你可以指定內(nèi)存在本地分配,在某幾個(gè)CPU節(jié)點(diǎn)分配或者輪詢(xún)分配。除非 是設(shè)置為--interleave=nodes輪詢(xún)分配方式,即內(nèi)存可以在任意NUMA節(jié)點(diǎn)上分配這種方式以外。其他的方式就算其他NUMA節(jié)點(diǎn)上還有內(nèi) 存剩余,Linux也不會(huì)把剩余的內(nèi)存分配給這個(gè)進(jìn)程,而是采用SWAP的方式來(lái)獲得內(nèi)存。有經(jīng)驗(yàn)的系統(tǒng)管理員或者DBA都知道SWAP導(dǎo)致的數(shù)據(jù)庫(kù)性能 下降有多么坑爹。
  所以最簡(jiǎn)單的方法,還是關(guān)閉掉這個(gè)特性。
  關(guān)閉特性的方法,分別有:可以從BIOS,操作系統(tǒng),啟動(dòng)進(jìn)程時(shí)臨時(shí)關(guān)閉這個(gè)特性。
  a) 由于各種BIOS類(lèi)型的區(qū)別,如何關(guān)閉NUMA千差萬(wàn)別,我們這里就不具體展示怎么設(shè)置了。
  b) 在操作系統(tǒng)中關(guān)閉,可以直接在/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
  另外可以設(shè)置 vm.zone_reclaim_mode=0盡量回收內(nèi)存。
  c) 啟動(dòng)MySQL的時(shí)候,關(guān)閉NUMA特性:
  numactl --interleave=all mysqld
  當(dāng)然,最好的方式是在BIOS中關(guān)閉。
  ii) 我們?cè)倏纯磛m.swappiness。
  vm.swappiness是操作系統(tǒng)控制物理內(nèi)存交換出去的策略。它允許的值是一個(gè)百分比的值,最小為0,最大運(yùn)行100,該值默認(rèn)為60。vm.swappiness設(shè)置為0表示盡量少swap,100表示盡量將inactive的內(nèi)存頁(yè)交換出去。
  具體的說(shuō):當(dāng)內(nèi)存基本用滿(mǎn)的時(shí)候,系統(tǒng)會(huì)根據(jù)這個(gè)參數(shù)來(lái)判斷是把內(nèi)存中很少用到的inactive 內(nèi)存交換出去,還是釋放數(shù)據(jù)的cache。cache中緩存著從磁盤(pán)讀出來(lái)的數(shù)據(jù),根據(jù)程序的局部性原理,這些數(shù)據(jù)有可能在接下來(lái)又要被讀 取;inactive 內(nèi)存顧名思義,就是那些被應(yīng)用程序映射著,但是 長(zhǎng)時(shí)間 不用的內(nèi)存。
  我們可以利用vmstat看到inactive的內(nèi)存的數(shù)量:
  #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
  通過(guò)/proc/meminfo 你可以看到更詳細(xì)的信息:
  #cat /proc/meminfo | grep -i inact
  Inactive: 326972 kB
  Inactive(anon): 248 kB
  Inactive(file): 326724 kB
  這里我們對(duì)不活躍inactive內(nèi)存進(jìn)一步深入討論。 Linux中,內(nèi)存可能處于三種狀態(tài):free,active和inactive。眾所周知,Linux Kernel在內(nèi)部維護(hù)了很多LRU列表用來(lái)管理內(nèi)存,比如LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用來(lái)管理匿名頁(yè),LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用來(lái)管理page caches頁(yè)緩存。系統(tǒng)內(nèi)核會(huì)根據(jù)內(nèi)存頁(yè)的訪問(wèn)情況,不定時(shí)的將活躍active內(nèi)存被移到inactive列表中,這些inactive的內(nèi)存可以被 交換到swap中去。
  一般來(lái)說(shuō),MySQL,特別是InnoDB管理內(nèi)存緩存,它占用的內(nèi)存比較多,不經(jīng)常訪問(wèn)的內(nèi)存也會(huì)不少,這些內(nèi)存如果被Linux錯(cuò)誤的交換出去了,將浪費(fèi)很多CPU和IO資源。 InnoDB自己管理緩存,cache的文件數(shù)據(jù)來(lái)說(shuō)占用了內(nèi)存,對(duì)InnoDB幾乎沒(méi)有任何好處。
  所以,我們?cè)贛ySQL的服務(wù)器上最好設(shè)置vm.swappiness=1或0

上述內(nèi)容就是NUMA技術(shù)怎么用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI