天天看點

NUMA (1)

numa相關的工具

随着NUMA架構的不斷發展,現在NUMA架構已經成為了企業級資料中心的主流。

然而,NUMA架構在性能調優方面面臨了新的挑戰,例如記憶體配置設定的問題在NUMA系統之前并沒人感興趣,而numastat指令提供了一個監測NUMA架構的工具。

numastat

顯示每個per-NUMA-node的統計資料。

對于系統中的每個節點,核心維護了一些有關NUMA配置設定狀态的統計資料。numastat指令會基于節點對記憶體的申請,配置設定,轉移,失敗等等做出統計,也會報告NUMA政策的執行狀況。這些資訊對于測試NUMA政策的有效性是非常有用的。

[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numastat -a
                           node0           node1
numa_hit              1453391677      1610480305
numa_miss              154554297       161470711
numa_foreign           161470711       154554297
interleave_hit             20016           20014
local_node            1453279663      1610457366
other_node             154666311       161493650      

numactl

numactl的主要功能包括:

1. 設定程序的記憶體配置設定基本政策

2. 限定記憶體配置設定範圍,如某一特定節點或部分節點集合

3. 對程序進行節點或節點集合的綁定

4. 修改命名共享記憶體,tmpfs或hugetblfs等的記憶體政策

5. 擷取目前政策資訊及狀态

6. 擷取NUMA硬體拓撲

numactl 檢視節點的分布情況

[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 8 9 10 11
node 0 size: 24567 MB
node 0 free: 20763 MB
node 1 cpus: 4 5 6 7 12 13 14 15
node 1 size: 24576 MB
node 1 free: 20303 MB
node distances:
node   0   1 
  0:  10  20 
  1:  20  10      

numactl 設定程序NUMA政策

[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl --cpubind=0 --membind=0,1 program
在節點0上的CPU運作名為program的程式,并且隻在節點0,1上配置設定記憶體。Cpubind的參數是節點編号,而不是cpu編号。在每個節點上有多個CPU的系統上,編号的定義順序可能會不同。      

numactl 更改共享記憶體段的配置設定政策

[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl --length=1G --file=/dev/shm/interleaved --interleave=all
對命名共享記憶體interleaved進行設定,其政策為全節點交織配置設定,大小為1G。      

non-NUMA vs NUMA

從系統架構來說,目前的主流企業伺服器基本可以分為三類:

SMP (Symmetric Multi Processing,對稱多處理架構)

NUMA (Non-Uniform Memory Access,非一緻存儲通路架構)

MPP (Massive Parallel Processing,海量并行處理架構)

SMP(Symmetric Multi Processing)

SMP是非常常見的一種架構。在SMP模式下,多個處理器均對稱的連接配接在系統記憶體上,所有處理器都以平等的代價通路系統記憶體。

NUMA (1)

特點是: 對記憶體的通路是平等、一緻的;

缺點是:大家都是一緻的,在傳統的 SMP 系統中,所有處理器都共享系統總線,是以當處理器的數目增多時,系統總線的競争沖突迅速加大,系統總線成為了性能瓶頸,是以目前 SMP 系統的處理器數目一般隻有數十個,可擴充性受到很大限制。

MPP (Massive Parallel Processing)

NUMA (1)

MPP則是邏輯上将整個系統劃分為多個節點,每個節點的處理器隻可以通路本身的本地資源,是完全無共享的架構。節點之間的資料交換需要軟體實施。它的優點是可擴充性非常好;缺點是彼此資料交換困難,需要控制軟體的大量工作來實作通訊以及任務的配置設定、排程,對于一般的企業應用而言過于複雜,效率不高。

NUMA(Non-Uniform Memory Access)

NUMA (1)

NUMA架構則在某種意義上是綜合了SMP和MPP的特點:邏輯上整個系統也是分為多個節點,每個節點可以通路本地記憶體資源,也可以通路遠端記憶體資源,但通路本地記憶體資源遠遠快于遠端記憶體資源。

它的優點是兼顧了SMP和MPP的特點, 易于管理,可擴充性好;缺點是通路遠端記憶體資源的所需時間非常的大。相對于SMP,每個計算機不再隻有唯一的記憶體控制器,而是把整個系統分成多個節點。每個節點分别有自己的處理器和記憶體。系統中所有的節點都通過全互聯的方式連接配接。是以,每當在系統中增加新的節點,系統所能夠支援的記憶體和帶寬都會增加。在實際系統中使用比較廣的是SMP和NUMA架構。像傳統的英特爾IA架構就是SMP,而很多大型機采用了NUMA架構。

現在已經進入了多核時代,随着核數的越來越多,對于記憶體吞吐量和延遲有了更高的要求。正是考慮到這種需求,NUMA架構出現在了最新的英特爾下一代Xeon處理器中。

Xeon

Intel QuickPath Interconnect (Intel QPI)技術

使用QPI架構代替了原來的FSB架構,QPI是基于資料包傳輸,高帶寬低延遲的點到點傳輸技術,速度可以達到6.4GT/s,對雙向傳輸的QPI總線連接配接來說理論最大值可以達到25.6GB/s的資料傳輸,遠遠高于原來基于FSB架構的資料帶寬。具體平台的實作中QPI連接配接數目可以根據目标市場和系統複雜性而有所不同,表現出極大的靈活性和擴充性。

NUMA (1)

FSB和QPI的對比圖。

QPI可以實作不同CPU之間資料的快速傳輸。

Xeon中,同一CPU的不同core之間資料的快速傳輸,可以通過cache共享實作。

Intel QuickPath 內建記憶體控制器(IMC)

在每一個socket上內建了獨立的DDR3記憶體控制器(IMC)供接口通路記憶體,較之非IMC的平台,大大提高了帶寬(使用DDR3-1333可以達到32GB/s的峰值帶寬,較之以前的平台具有四到六倍的帶寬提升),顯著地降低了記憶體延遲,進而提升了性能,為每個CPU提供了通路本地記憶體資源的快速通道。與前一代平台不同的是,記憶體通路采用NUMA架構,對于NUMA-aware的應用來說可以得到更大的性能提升。DDR3的IMC最大支援到每個CPU接口96GB的DDR3記憶體容量,将來最大容量可以達到144GB,為高端的企業運算提供了強有力的記憶體支援。

改進的電源管理

內建在晶片上的電源管理使得能耗的控制更加高效。

同步多線程技術(SMT)

同步多線程技術使得每個核心可以同時執行2個線程,是以對于4核的CPU來說,就可以在每個處理器晶片上達到最大8個邏輯處理器。

NUMA的記憶體組織

在NUMA系統中,每個CPU可以通路兩種記憶體:本地記憶體(Local Memory)和遠端記憶體(Remote Memory)。和CPU在同一個節點的記憶體稱為本地記憶體,通路延遲非常低。和CPU在不同節點上的記憶體叫做遠端記憶體,CPU需要通過節點互聯方式通路,是以通路延遲要比通路本地記憶體長。

NUMA (1)

對于正常的記憶體操作,如清空(Memset),塊複制(Memcpy),流讀寫(Stream),指針追溯(Pointer Chase)等操作來說,本地記憶體的通路速度要遠遠優于遠端記憶體。

通路遠端記憶體的開銷與通路本地記憶體的開銷比率稱為 NUMA 比率。如果 NUMA 比率為 1,則它是對稱多處理 (SMP)。比率越高,通路其他節點記憶體的開銷就越大。不支援 NUMA 的 應用程式有時在 NUMA 硬體上的執行效果非常差。

NUMA的記憶體政策

NUMA政策(NUMA Policy)即是指在多個節點上合理的進行記憶體配置設定的機制。對于不同軟體設計要求,政策的目标可能會不同:有一些設計可能強調低延遲通路,另一些則可能更加看重記憶體的通路帶寬。

低延遲通路(low latency)的設計

對于強調低延遲通路的設計,基本的配置設定方式就是盡量線上程的本地記憶體上為其進行配置設定, 并盡量讓線程保持在該節點上。這被稱為線程的節點親和性(Node affinity)。這樣既充分利用了本地記憶體的低延遲, 同時也能有效降低節點間的通信負擔。

NUMA架構的一個優勢是,即便是在擁有大量CPU的大規模系統中,我們也可以保證局部記憶體通路的低延遲。通常來講,CPU的處理速度是遠大于記憶體的存取速度的。在讀寫記憶體時,CPU常常需要花大量的時鐘周期來等待。降低記憶體通路的延遲因而能夠有效的提升軟體性能。

節點親和性 VS 緩存親和性

為SMP設計的作業系統通常會有緩存親和性(Cache Affinity) 的優化措施。緩存親和性機制可以讓資料盡量長時間的保留在某一個CPU的緩存中,而不是來回在多個CPU的緩存裡換來換去。作業系統通常是通過優化進行線程/程序排程來保證這一點:線上程被重新調入時,排程器會盡量讓線程在之前運作的同一個CPU上運作,進而保證緩存使用率。這一機制顯然是和NUMA系統盡量利用本地記憶體的政策是一緻的,有利于面向SMP系統的程式向NUMA架構移植。

但緩存親和性機制同NUMA系統的節點親和性又是有差別的:首先,同一個節點間多個CPU或者核的線程遷移并不影響該線程的節點親和性;其次,當線程被迫遷移到其他節點時,他所擁有的記憶體是不會跟着遷移的, 仍然保留在原來位置。這個時候,本地記憶體就變成了遠端記憶體,對它的通路既慢又占用節點通信帶寬。相對的,線程在遷移之後能夠以較小的代價迅速建立起新的緩存,并繼續在新CPU上展現緩存的親和優勢。 是以,NUMA系統對于節點親和性的依賴更大。

代價:本地記憶體通路 < 遠端記憶體通路 < CPU空閑

作業系統的排程器同時也不能僅僅為保證節點親和性做優化。因為通常相對于頻繁通路遠端記憶體來說,讓CPU空閑帶來的性能損失更大。如果特定應用系統的性能受記憶體通路的影響遠大于CPU的使用率,這個時候程式員或者管理者則可采用特别的NUMA政策來強調節點的親和性,進而提升性能。

記憶體的通路帶寬(high bandwidth)的設計

NUMA (1)

另外, 盡管大部分應用會因為優化響應時間而收益,還有一部分應用則對記憶體帶寬比較敏感。為了提升記憶體帶寬,NUMA架構下的多個記憶體控制器可以并行使用。這類似于RAID陣列通過并行處理磁盤IO來提升讀寫性能。通過适當的軟體或者硬體機制,NUMA架構可以使記憶體控制單元在各個記憶體控制器上交替的配置設定記憶體。這意味着配置設定得到的連續記憶體頁面會水準地分布到各個節點上。當應用程式對記憶體進行流式讀寫時,各個記憶體控制器的帶寬就相當于累加了。此機制獲得性能提升決定于NUMA架構的實作。對于遠端記憶體通路延遲嚴重的架構,該提升往往會比較明顯。在一些NUMA系統中,系統硬體本身提供了節點交織配置設定機制;而在沒有硬體提供節點交織的系統中,可由作業系統來實作該機制。

參考資料:

http://www.360doc.com/content/11/1219/18/2245786_173438994.shtml

繼續閱讀