Linux中NUMA技術(shù)_第1頁
Linux中NUMA技術(shù)_第2頁
Linux中NUMA技術(shù)_第3頁
Linux中NUMA技術(shù)_第4頁
Linux中NUMA技術(shù)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、一、引言隨著科學計算、事務處理對計算機性能要求的不斷提高,SMP(對稱多處理器)系統(tǒng)的應用越來越廣泛,規(guī)模也越來越大,但由于傳統(tǒng)的SMP系統(tǒng)中,所有處理器都共享系統(tǒng)總線,因此當處理器的數(shù)目增大時,系統(tǒng)總線的競爭沖突加大,系統(tǒng)總線將成為瓶頸,所以目前SMP系統(tǒng)的CPU數(shù)目一般只有數(shù)十個,可擴展能力受到極大限制。NUMA(Non-Uniform Memory Access Architecture)技術(shù)有效結(jié)合了SMP系統(tǒng)易編程性和MPP(大規(guī)模并行)系統(tǒng)易擴展性的特點,較好解決了SMP系統(tǒng)的可擴展性問題,已成為當今高性能服務器的主流體系結(jié)構(gòu)之一。目前國外著名的服務器廠商都先后推出了基于NUMA架

2、構(gòu)的高性能服務器,如HP的Superdome、SGI的Altix 3000、IBM的 x440、NEC的TX7、AMD的Opteron等。隨著Linux在服務器平臺上的表現(xiàn)越來越成熟,Linux內(nèi)核對NUMA架構(gòu)的支持也越來越完善,特別是從2.5開始,Linux在調(diào)度器、存儲管理、用戶級API等方面進行了大量的NUMA優(yōu)化工作,目前這部分工作還在不斷地改進,如新近推出的2.6.7-RC1內(nèi)核中增加了NUMA調(diào)度器。本文主要從存儲管理、調(diào)度器和CpuMemSets三個方面展開討論。NUMA:Non-Uniform Memory Access (NUMA) is a computer memory

3、 design used in multiprocessing, where the memory access time depends on the memory location relative to a processor. Under NUMA, a processor can access its own local memory faster than non-local memory, that is, memory local to another processor or memory shared between processors.NUMA architecture

4、s logically follow in scaling from symmetric multiprocessing (SMP) architectures.SMP:Symmetric multiprocessing (SMP) involves a multiprocessor computer hardware architecture where two or more identical processors are connected to a single shared main memory and are controlled by a single OS instance

5、.NUMA Node:A fairly technically correct and also fairly ugly definition of a node is: a region of memory in which every byte has the same distance from each CPU.A more common definition is: a block of memory and the CPUs, I/O, etc. physically on the same bus as the memory.白話說明:現(xiàn)在的機器上都是有多個CPU和多個內(nèi)存塊的。

6、以前我們都是將內(nèi)存塊看成是一大塊內(nèi)存,所有CPU到這個共享內(nèi)存的訪問消息是一樣的。這就是之前普遍使用的SMP模型。但是隨著處理器的增加,共享內(nèi)存可能會導致內(nèi)存訪問沖突越來越厲害,且如果內(nèi)存訪問達到瓶頸的時候,性能就不能隨之增加。NUMA(Non-Uniform Memory Access)就是這樣的環(huán)境下引入的一個模型。比如一臺機器是有2個處理器,有4個內(nèi)存塊。我們將1個處理器和兩個內(nèi)存塊合起來,稱為一個NUMA node,這樣這個機器就會有兩個NUMA node。在物理分布上,NUMA node的處理器和內(nèi)存塊的物理距離更小,因此訪問也更快。比如這臺機器會分左右兩個處理器(cpu1, cpu

7、2),在每個處理器兩邊放兩個內(nèi)存塊(memory1.1, memory1.2, memory2.1,memory2.2),這樣NUMA node1的cpu1訪問memory1.1和memory1.2就比訪問memory2.1和memory2.2更快。所以使用NUMA的模式如果能盡量保證本node內(nèi)的CPU只訪問本node內(nèi)的內(nèi)存塊,那這樣的效率就是最高的。一個NUMA node包括一個或者多個Socket,以及與之相連的local memory。一個多核的Socket有多個Core。如果CPU支持HT超線程,OS還會把這個Core看成 2個Logical Processor。一、 查看系統(tǒng)中的

8、NUMA節(jié)點$ yum install numactl y $ numactl -hardwareavailable: 2 nodes (0-1) /當前機器有2個NUMA node,編號0&1node 0 size: 12091 MB /node 0 物理內(nèi)存大小node 0 free: 988 MB /node 0 當前free內(nèi)存大小node 1 size: 12120 MBnode 1 free: 1206 MBnode distances: /node 距離,可以簡單認為是CPU本node內(nèi)存訪問和跨node內(nèi)存訪問的成本。從下表可知跨node的內(nèi)存訪問成本(20)是

9、本地node內(nèi)存(10)的2倍。node 0 1 0: 10 20 1: 20 10第二種方法:是通過sysfs查看,這種方式可以查看到更多的信息ls /sys/devices/system/node/node0 node1 /兩個目標表示本機有2個node,每個目錄內(nèi)部有多個文件和子目錄描述node內(nèi)cpu,內(nèi)存等信息。比如說node0/meminfo描述了node0內(nèi)存相關(guān)信息。查看系統(tǒng)物理CPU$ cat /proc/cpuinfo | grep “physical id”physical id : 0physical id : 0physical id : 0physical id :

10、 0physical id : 1physical id : 1physical id : 1physical id : 1physical id : 0physical id : 0physical id : 0physical id : 0physical id : 1physical id : 1physical id : 1physical id : 1可以的知,本機安裝了兩個CPU,顯示為0、1查看每個CPU有幾核$ cat /proc/cpuinfo | grep “cpu cores” | uniq 4 每個物理CPU有4核,查看每個內(nèi)核id$ cat /proc/cpuinfo

11、 | grep “core id”| sort u core id : 0core id : 1core id : 10core id : 9一個物理cpu中有4核,每個核的id是0,1,9,10 這里是不連續(xù)的,在CentOS7中連續(xù)。判斷是否開啟HT(邏輯處理器又叫超線程)cat /proc/cpuinfo |grep processor|wc l16由于有兩個CPU,每個有四核,但是查詢到有16個,所以每個CPU開啟了HT查看一個Processor完整的cpuinfo就比較清楚了,我剔除了不相關(guān)的行:processor : 0processor : 5physical id : 0sib

12、lings : 8core id : 0cpu cores : 4physical id : 1siblings : 8core id : 1cpu cores : 4Processor 0:在numa 0的core 0 里。Processor 5:在numa 1的core 1 里。Cache仍然可以通過/proc/cpuinfo查看,123processor       : 0cache size      : 12288 KB /cpu cache 大小cache_alignmen

13、t : 64  問題又來了,我們知道CPU cache分為L1,L2,L3, L1一般還分為獨立的指令cache和數(shù)據(jù)cache。Cpuinfo里這個cache size指的是?好吧,cpuinfo也不是萬能的。詳細的cache信息可以通過sysfs查看ls /sys/devices/system/cpu/cpu0/cache/1index0  index1  index2  index34個目錄index0:1級數(shù)據(jù)cacheindex1:1級指令cacheindex2:2級cacheindex3:3級cache ,對應cpuinfo里的cache目錄

14、里的文件是cache信息描述,以本機的cpu0/index0為例簡單解釋一下:文件內(nèi)容說明typeData數(shù)據(jù)cache,如果查看index1就是InstructionLevel1L1Size32K大小為32Kcoherency_line_size6464*4*128=32Kphysical_line_partition1ways_of_associativity4number_of_sets128shared_cpu_map00000101表示這個cache被CPU0和CPU8 share解釋一下shared_cpu_map內(nèi)容的格式:表面上看是2進制,其實是16進制表示,每個bit表示一個

15、cpu,1個數(shù)字可以表示4個cpu截取00000101的后4位,轉(zhuǎn)換為2進制表示CPU id15141312111098765432100×0101的2進制表示00000001000000010101表示cpu8和cpu0,即cpu0的L1 data cache是和cpu8共享的。驗證一下?cat /sys/devices/system/cpu/cpu8/cache/index0/shared_cpu_map00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000101再看一下index3 shared_

16、cpu_map的例子cat /sys/devices/system/cpu/cpu0/cache/index3/shared_cpu_map00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000f0fCPU id15141312111098765432100x0f0f的2進制表示0000111100001111cpu0,1,2,3和cpu8,9,10,11共享L3 cache使用CPU Topology現(xiàn)在我們知道了如何查看CPU topology。那么這與各位攻城獅的工作有什么關(guān)系呢?以淘寶搜索常見的服務模型為

17、例,服務端把離線處理的數(shù)據(jù)load到內(nèi)存中,開始監(jiān)聽某個服務端口,接收到客戶端請求后從線程池中分配一個工作線程,該線程解析請求,讀取內(nèi)存中對應的數(shù)據(jù),進行一些計算,然后把結(jié)果返回給客戶端。把這個過程簡化簡化再簡化,抽象抽象再抽象,可以得到一個簡單的測試程序,程序流程為:1. 主線程申請2塊256M的內(nèi)存,使用memset初始化這兩塊內(nèi)存的每個byte2. 啟動2個子線程,每個線程內(nèi)循環(huán)16M次,在每次循環(huán)中隨機讀取2塊內(nèi)存中的各1K數(shù)據(jù),對每個byte進行簡單加和,返回。3. 主線程等待子線程結(jié)束,打印每個線程的結(jié)果,結(jié)束。使用-O2編譯出可執(zhí)行文件test,分別使用下面2個命令運行該程序。運

18、行時間和機器配置以及當前l(fā)oad有關(guān),絕對值沒有意義,這里僅比較相對值。命令time ./testtime numactl -m 0 physcpubind=2,3 ./test用時real 0m38.678suser 1m6.270ssys 0m5.569sreal 0m28.410suser 0m54.997ssys 0m0.961s發(fā)生了什么?為什么有這么大的差異?第一個命令直觀,那么我們看一下第二個命令具體做了什么:numactl -m 0 physcpubind=2,3 ./test-m 0:在node 0上分配內(nèi)存physcpubind=2,3:在cpu 2和3上運行程序,即一個線

19、程運行在cpu2上,另一個運行在cpu3上。參考上面的CPUtopology圖就很容易理解了,由于線程綁定cpu2和3執(zhí)行,共享了L3 cache,且全部內(nèi)存都是本node訪問,運行效率自然比隨機選擇cpu運行,運行中還有可能切換cpu,內(nèi)存訪問有可能跨node的第一種方式要快了。接下來,讓我們看看完整的表格, 情況命令用時解釋完全由OS控制time ./testreal 0m38.678suser 1m6.270ssys 0m5.569s樂觀主義者,甩手掌柜型綁定跨node的Cpu執(zhí)行time numactl physcpubind=2,6 ./testreal 0m38.657suser

20、1m7.126ssys 0m5.045sCpu 2和6不在同一個node,不能share L3 cache綁定單node的Cpu執(zhí)行time numactl physcpubind=2,3 ./testreal 0m28.605suser 0m55.161ssys 0m0.856sCpu 2和3在同一個node,share L3 cache。內(nèi)存使用由OS控制,一般來說node 0和1內(nèi)存都會使用??鏽ode內(nèi)存訪問+綁定單node CPU執(zhí)行time numactl -m 1 physcpubind=2,3 ./testreal 0m33.218suser 1m4.494ssys 0m0.9

21、11s內(nèi)存全使用node1,2個cpu在node0,內(nèi)存訪問比較吃虧單node內(nèi)存訪問+綁定本node CPU執(zhí)行time numactl -m 0 physcpubind=2,3 ./testreal 0m28.367suser 0m55.062ssys 0m0.825s內(nèi)存&cpu都使用node0單node內(nèi)存訪問+綁定本node 單core執(zhí)行time numactl -m 0 physcpubind=2,10 ./testreal 0m58.062suser 1m55.520ssys 0m0.270sCPU2和10不但在同一個node,且在同一個core,本意是希望共享L1,L

22、2cache,提升性能。但是不要忘了,CPU2和10是HT出來的logical Processor,在本例cpu密集型的線程中硬件爭用嚴重,效率急劇下降。有沒有發(fā)現(xiàn)和上一個case的時間比率很有意思?Tips補充幾個小tips,方便有興趣的同學分析上面表格的各個case1.查看進程的內(nèi)存numa node分布簡單的說可以查看進程的numa_maps文件cat /proc/numa_maps文件格式可以直接:man numa_maps為了避免輸入數(shù)字pid,我使用如下命令查看:cat /proc/$(pidof test|cut d” ” -f1)/numa_maps2.查看線程run在哪個processor可以使用top命令查看一個進程的各個線程分別run在哪個processor上同樣,為了避免輸入數(shù)字pid,我使用如下命令啟動top:top -p$(pidof test |sed -e s/ /,/g)在默認配置下不顯示線程信息,需要進入Top后按“shif

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論