0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

NUMA存儲管理介紹

科技綠洲 ? 來源:Linux開發(fā)架構之路 ? 作者:Linux開發(fā)架構之路 ? 2023-11-13 15:45 ? 次閱讀

一.背景

所謂物理內(nèi)存,就是安裝在機器上的,實打實的內(nèi)存設備(不包括硬件cache),被CPU通過總線訪問。在多核系統(tǒng)中,如果物理內(nèi)存對所有CPU來說沒有區(qū)別,每個CPU訪問內(nèi)存的方式也一樣,則這種體系結構被稱為Uniform Memory Access(UMA)。

如果物理內(nèi)存是分布式的,由多個cell組成(比如每個核有自己的本地內(nèi)存),那么CPU在訪問靠近它的本地內(nèi)存的時候就比較快,訪問其他CPU的內(nèi)存或者全局內(nèi)存的時候就比較慢,這種體系結構被稱為Non-Uniform Memory Access(NUMA)。

以上是硬件層面上的NUMA,而作為軟件層面的Linux,則對NUMA的概念進行了抽象。即便硬件上是一整塊連續(xù)內(nèi)存的UMA,Linux也可將其劃分為若干的node。同樣,即便硬件上是物理內(nèi)存不連續(xù)的NUMA,Linux也可將其視作UMA。

所以,在Linux系統(tǒng)中,你可以基于一個UMA的平臺測試NUMA上的應用特性。從另一個角度,UMA就是只有一個node的特殊NUMA,所以兩者可以統(tǒng)一用NUMA模型表示。

圖片

傳統(tǒng)的SMP(對稱多處理器)中,所有處理器都共享系統(tǒng)總線,因此當處理器的數(shù)目增大時,系統(tǒng)總線的競爭沖突加大,系統(tǒng)總線將成為瓶頸,所以目前SMP系統(tǒng)的CPU數(shù)目一般只有數(shù)十個,可擴展能力受到極大限制。NUMA技術有效結合了SMP系統(tǒng)易編程性和MPP(大規(guī)模并行)系統(tǒng)易擴展性的特點,較好解決了SMP系統(tǒng)的可擴展性問題,已成為當今高性能服務器的主流體系結構之一。

在NUMA系統(tǒng)中,當Linux內(nèi)核收到內(nèi)存分配的請求時,它會優(yōu)先從發(fā)出請求的CPU本地或鄰近的內(nèi)存node中尋找空閑內(nèi)存,這種方式被稱作local allocation,local allocation能讓接下來的內(nèi)存訪問相對底層的物理資源是local的。

每個node由一個或多個zone組成(我們可能經(jīng)常在各種對虛擬內(nèi)存和物理內(nèi)存的描述中迷失,但以后你見到zone,就知道指的是物理內(nèi)存),每個zone又由若干page frames組成(一般page frame都是指物理頁面)。

圖片

基于NUMA架構的高性能服務器有HP的Superdome、SGI的Altix 3000、IBM的 x440、NEC的TX7、AMD的Opteron等。

概念

NUMA具有多個節(jié)點(Node),每個節(jié)點可以擁有多個CPU(每個CPU可以具有多個核或線程),節(jié)點內(nèi)使用共有的內(nèi)存控制器,因此節(jié)點的所有內(nèi)存對于本節(jié)點的所有CPU都是等同的,而對于其它節(jié)點中的所有CPU都是不同的。節(jié)點可分為本地節(jié)點(Local Node)、鄰居節(jié)點(Neighbour Node)和遠端節(jié)點(Remote Node)三種類型。

本地節(jié)點:對于某個節(jié)點中的所有CPU,此節(jié)點稱為本地節(jié)點;

鄰居節(jié)點:與本地節(jié)點相鄰的節(jié)點稱為鄰居節(jié)點;

遠端節(jié)點:非本地節(jié)點或鄰居節(jié)點的節(jié)點,稱為遠端節(jié)點。

鄰居節(jié)點和遠端節(jié)點,稱作非本地節(jié)點(Off Node)。

CPU訪問不同類型節(jié)點內(nèi)存的速度是不相同的:本地節(jié)點>鄰居節(jié)點>遠端節(jié)點。訪問本地節(jié)點的速度最快,訪問遠端節(jié)點的速度最慢,即訪問速度與節(jié)點的距離有關,距離越遠訪問速度越慢,此距離稱作Node Distance。

常用的NUMA系統(tǒng)中:硬件設計已保證系統(tǒng)中所有的Cache是一致的(Cache Coherent, ccNUMA);不同類型節(jié)點間的Cache同步時間不一樣,會導致資源競爭不公平,對于某些特殊的應用,可以考慮使用FIFO Spinlock保證公平性。

二.NUMA存儲管理

NUMA系統(tǒng)是由多個結點通過高速互連網(wǎng)絡連接而成的,如圖1是SGI Altix 3000 ccNUMA系統(tǒng)中的兩個結點。

圖片

NUMA系統(tǒng)的結點通常是由一組CPU(如,SGI Altix 3000是2個Itanium2 CPU)和本地內(nèi)存組成,有的結點可能還有I/O子系統(tǒng)。由于每個結點都有自己的本地內(nèi)存,因此全系統(tǒng)的內(nèi)存在物理上是分布的,每個結點訪問本地內(nèi)存和訪問其它結點的遠地內(nèi)存的延遲是不同的,為了減少非一致性訪存對系統(tǒng)的影響,在硬件設計時應盡量降低遠地內(nèi)存訪存延遲(如通過Cache一致性設計等),而操作系統(tǒng)也必須能感知硬件的拓撲結構,優(yōu)化系統(tǒng)的訪存。

目前IA64 Linux所支持的NUMA架構服務器的物理拓撲描述是通過ACPIAdvanced Configuration and Power Interface)實現(xiàn)的。ACPI是由Compaq、Intel、Microsoft、Phoenix和Toshiba聯(lián)合制定的BIOS規(guī)范,它定義了一個非常廣泛的配置和電源管理,目前該規(guī)范的版本已發(fā)展到2.0,3.0o版本正在制定中,具體信息可以從 http://www.acpi.info網(wǎng)站上獲得。ACPI規(guī)范也已廣泛應用于IA-32架構的至強服務器系統(tǒng)中。

Linux對NUMA系統(tǒng)的物理內(nèi)存分布信息是從系統(tǒng)firmware的ACPI表中獲得的,最重要的是SRAT(System Resource Affinity Table)和SLIT(System Locality Information Table)表,其中SRAT包含兩個結構:

  • Processor Local APIC/SAPIC Affinity Structure:記錄某個CPU的信息;
  • Memory Affinity Structure:記錄內(nèi)存的信息;

SLIT表則記錄了各個結點之間的距離,在系統(tǒng)中由數(shù)組node_distance[ ]記錄。

Linux采用Node、Zone和頁三級結構來描述物理內(nèi)存的,如圖2所示,

圖2 Linux中Node、Zone和頁的關系

圖片

2.1 結點

Linux用一個struct pg_data_t結構來描述系統(tǒng)的內(nèi)存,系統(tǒng)中每個結點都掛接在一個pgdat_list列表中,對UMA體系結構,則只有一個靜態(tài)的pg_data_t結構contig_page_data。對NUMA系統(tǒng)來說則非常容易擴充,NUMA系統(tǒng)中一個結點可以對應Linux存儲描述中的一個結點,具體描述見linux/mmzone.h。

typedef struct pglist_data {
    zone_t node_zones[MAX_NR_ZONES];
    zonelist_t node_zonelists[GFP_ZONEMASK+1];
    int nr_zones;
    struct page *node_mem_map;
    unsigned long *valid_addr_bitmap;
    struct bootmem_data *bdata;
    unsigned long node_start_paddr;
    unsigned long node_start_mapnr;
    unsigned long node_size;
    int node_id;
    struct pglist_data *node_next;
} pg_data_t;

下面就該結構中的主要域進行說明,

說明
Node_zones該結點的zone類型,一般包括ZONE_HIGHMEM、ZONE_NORMAL和ZONE_DMA三類
Node_zonelists分配時內(nèi)存時zone的排序。它是由free_area_init_core()通過page_alloc.c中的build_zonelists()設置zone的順序
nr_zones該結點的 zone 個數(shù),可以從 1 到 3,但并不是所有的結點都需要有 3 個 zone
node_mem_map它是 struct page 數(shù)組的第一頁,該數(shù)組表示結點中的每個物理頁框。根據(jù)該結點在系統(tǒng)中的順序,它可在全局 mem_map 數(shù)組中的某個位置
Valid_addr_bitmap用于描述結點內(nèi)存空洞的位圖
node_start_paddr該結點的起始物理地址
node_start_mapnr給出在全局 mem_map 中的頁偏移,在free_area_init_core() 計算在 mem_map 和 lmem_map 之間的該結點的頁框數(shù)目
node_size該 zone 內(nèi)的頁框總數(shù)
node_id該結點的 ID,全系統(tǒng)結點 ID 從 0 開始

系統(tǒng)中所有結點都維護在 pgdat_list 列表中,在 init_bootmem_core 函數(shù)中完成該列表初始化工作。

影響zonelist方式

采用Node方式組織的zonelist為:

圖片

即各節(jié)點按照與本節(jié)點的Node Distance距離大小來排序,以達到更優(yōu)的內(nèi)存分配。

zonelist[2]

配置NUMA后,每個節(jié)點將關聯(lián)2個zonelist:

  1. zonelist[0]中存放以Node方式或Zone方式組織的zonelist,包括所有節(jié)點的zone;
  2. zonelist[1]中只存放本節(jié)點的zone即Legacy方式;

zonelist[1]用來實現(xiàn)僅從節(jié)點自身zone中的內(nèi)存分配(參考__GFP_THISNODE標志)。

Page Frame

雖然內(nèi)存訪問的最小單位是byte或者word,但MMU是以page為單位來查找頁表的,page也就成了Linux中內(nèi)存管理的重要單位。包括換出(swap out)、回收(relcaim)、映射等操作,都是以page為粒度的。

因此,描述page frame的struct page自然成為了內(nèi)核中一個使用頻率極高,非常重要的結構體,來看下它是怎樣構成的(為了講解需要并非最新內(nèi)核代碼):

struct page {
    unsigned long flags;
    atomic_t count;  
    atomic_t _mapcount; 
    struct list_head lru;
    struct address_space *mapping;
    unsigned long index;         
    ...  
}
  • flags表示page frame的狀態(tài)或者屬性,包括和內(nèi)存回收相關的PG_active, PG_dirty, PG_writeback, PG_reserved, PG_locked, PG_highmem等。其實flags是身兼多職的,它還有其他用途,這將在下文中介紹到。
  • count表示引用計數(shù)。當count值為0時,該page frame可被free掉;如果不為0,說明該page正在被某個進程或者內(nèi)核使用,調用page_count()可獲得count值。
  • _mapcount表示該page frame被映射的個數(shù),也就是多少個page table entry中含有這個page frame的PFN。
  • lru是"least recently used"的縮寫,根據(jù)page frame的活躍程度(使用頻率),一個可回收的page frame要么掛在active_list雙向鏈表上,要么掛在inactive_list雙向鏈表上,以作為頁面回收的選擇依據(jù),lru中包含的就是指向所在鏈表中前后節(jié)點的指針(參考這篇文章)。
  • 如果一個page是屬于某個文件的(也就是在page cache中),則mapping指向文件inode對應的address_space(這個結構體雖然叫address_space,但并不是進程地址空間里的那個address space),index表示該page在文件內(nèi)的offset(以page size為單位)。

有了文件的inode和index,當這個page的內(nèi)容需要和外部disk/flash上對應的部分同步時,才可以找到具體的文件位置。如果一個page是anonymous的,則mapping指向表示swap cache的swapper_space,此時index就是swapper_space內(nèi)的offset。

事實上,現(xiàn)在最新Linux版本的struct page實現(xiàn)中大量用到了union,也就是同一個元素在不同的場景下有不同的意義。這是因為每個page frame都需要一個struct page來描述,一個page frame占4KB,一個struct page占32字節(jié),那所有的struct page需要消耗的內(nèi)存占了整個系統(tǒng)內(nèi)存的32/4096,不到1%的樣子,說小也小,但一個擁有4GB物理內(nèi)存的系統(tǒng),光這一項的開銷最大就可達30多MB。

如果能在struct page里省下4個字節(jié),那就能省下4多MB的內(nèi)存空間,所以這個結構體的設計必須非常考究,不能因為多一種場景的需要就在struct page中增加一個元素,而是應該盡量采取復用的方式。

需要注意的是,struct page描述和管理的是這4KB的物理內(nèi)存,它并不關注這段內(nèi)存中的數(shù)據(jù)變化。

2.2 Zone

每個結點的內(nèi)存被分為多個塊,稱為zones,它表示內(nèi)存中一段區(qū)域。一個zone用struct_zone_t結構描述,zone的類型主要有ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。ZONE_DMA位于低端的內(nèi)存空間,用于某些舊的ISA設備。

ZONE_NORMAL的內(nèi)存直接映射到Linux內(nèi)核線性地址空間的高端部分,許多內(nèi)核操作只能在ZONE_NORMAL中進行。

因為硬件的限制,內(nèi)核不能對所有的page frames采用同樣的處理方法,因此它將屬性相同的page frames歸到一個zone中。對zone的劃分與硬件相關,對不同的處理器架構是可能不一樣的。

圖片

比如在i386中,一些使用DMA的設備只能訪問016MB的物理空間,因此將016MB劃分為了ZONE_DMA。ZONE_HIGHMEM則是適用于要訪問的物理地址空間大于虛擬地址空間,不能建立直接映射的場景。除開這兩個特殊的zone,物理內(nèi)存中剩余的部分就是ZONE_NORMAL了。

例如,在X86中,zone的物理地址如下:

類型地址范圍
ZONE_DMA前16MB內(nèi)存
ZONE_NORMAL16MB - 896MB
ZONE_HIGHMEM896 MB以上

Zone是用struct zone_t描述的,它跟蹤頁框使用、空閑區(qū)域和鎖等信息,具體描述如下:

typedef struct zone_struct {
    spinlock_t lock;
    unsigned long free_pages;
    unsigned long pages_min, pages_low, pages_high;
    int need_balance;
    free_area_t free_area[MAX_ORDER];
    wait_queue_head_t * wait_table;
    unsigned long wait_table_size;
    unsigned long wait_table_shift;
    struct pglist_data *zone_pgdat;
    struct page *zone_mem_map;
    unsigned long zone_start_paddr;
    unsigned long zone_start_mapnr;char *name;unsigned long size;
} zone_t;

在其他一些處理器架構中,ZONE_DMA可能是不需要的,ZONE_HIGHMEM也可能沒有。比如在64位的x64中,因為內(nèi)核虛擬地址空間足夠大,不再需要ZONE_HIGH映射,但為了區(qū)分使用32位地址的DMA應用和使用64位地址的DMA應用,64位系統(tǒng)中設置了ZONE_DMA32和ZONE_DMA。

所以,同樣的ZONE_DMA,對于32位系統(tǒng)和64位系統(tǒng)表達的意義是不同的,ZONE_DMA32則只對64位系統(tǒng)有意義,對32位系統(tǒng)就等同于ZONE_DMA,沒有單獨存在的意義。

此外,還有防止內(nèi)存碎片化的ZONE_MOVABLE和支持設備熱插拔的ZONE_DEVICE。可通過“cat /proc/zoneinfo |grep Node”命令查看系統(tǒng)中包含的zones的種類。

[rongtao@toa ~]$ cat /proc/zoneinfo |grep Node
Node 0, zone      DMA
Node 0, zone    DMA32
[rongtao@toa ~]$

下面就該結構中的主要域進行說明,

圖片

當系統(tǒng)中可用的內(nèi)存比較少時,kswapd將被喚醒,并進行頁交換。如果需要內(nèi)存的壓力非常大,進程將同步釋放內(nèi)存。如前面所述,每個zone有三個閾值,稱為pages_low,pages_min和pages_high,用于跟蹤該zone的內(nèi)存壓力。pages_min的頁框數(shù)是由內(nèi)存初始化free_area_init_core函數(shù),根據(jù)該zone內(nèi)頁框的比例計算的,最小值為20頁,最大值一般為255頁。當?shù)竭_pages_min時,分配器將采用同步方式進行kswapd的工作;當空閑頁的數(shù)目達到pages_low時,kswapd被buddy分配器喚醒,開始釋放頁;當達到pages_high時,kswapd將被喚醒,此時kswapd不會考慮如何平衡該zone,直到有pages_high空閑頁為止。一般情況下,pages_high缺省值是pages_min的3倍。

Linux存儲管理的這種層次式結構可以將ACPI的SRAT和SLIT信息與Node、Zone實現(xiàn)有效的映射,從而克服了傳統(tǒng)Linux中平坦式結構無法反映NUMA架構的缺點。當一個任務請求分配內(nèi)存時,Linux采用局部結點分配策略,首先在自己的結點內(nèi)尋找空閑頁;如果沒有,則到相鄰的結點中尋找空閑頁;如果還沒有,則到遠程結點中尋找空閑頁,從而在操作系統(tǒng)級優(yōu)化了訪存性能。

Zone雖然是用于管理物理內(nèi)存的,但zone與zone之間并沒有任何的物理分割,它只是Linux為了便于管理進行的一種邏輯意義上的劃分。Zone在Linux中用struct zone表示(以下為了講解需要,調整了結構體中元素的順序):

struct zone {
     spinlock_t         lock;

     unsigned long      spanned_pages;
     unsigned long      present_pages; 
     unsigned long      nr_reserved_highatomic;    
     atomic_long_t      managed_pages;

     struct free_area   free_area[MAX_ORDER];
     unsigned long      _watermark[NR_WMARK];
     long               lowmem_reserve[MAX_NR_ZONES];
     atomic_long_t      vm_stat[NR_VM_ZONE_STAT_ITEMS];

     unsigned long      zone_start_pfn;
     struct pglist_data *zone_pgdat;
     struct page        *zone_mem_map;
     ...    
}
  • lock是用來防止并行訪問struct zone的spin lock,它只能保護struct zone這個結構體哈,可不能保護整個zone里的所有pages。
  • spanned_pages是這個zone含有的總的page frames數(shù)目。在某些體系結構(比如Sparc)中,zone中可能存在沒有物理頁面的"holes",spanned_pages減去這些holes里的absent pages就是present_pages。

nr_reserved_highatomic是為某些場景預留的內(nèi)存,managed_pages是由buddy內(nèi)存分配系統(tǒng)管理的page frames數(shù)目,其實也就是present_pages減去reserved pages。

  • free_area由free list空閑鏈表構成,表示zone中還有多少空余可供分配的page frames。_watermark有min(mininum), low, high三種,可作為啟動內(nèi)存回收的判斷標準

lowmem_reserve是給更高位的zones預留的內(nèi)存。vm_stat作為zone的內(nèi)存使用情況的統(tǒng)計信息,是“/proc/zoneinfo”的數(shù)據(jù)來源。

  • zone_start_pfn是zone的起始物理頁面號,zone_start_pfn+spanned_pages就是該zone的結束物理頁面號。zone_pgdat是指向這個zone所屬的node的。zone_mem_map指向由struct page構成的mem_map數(shù)組。

因為內(nèi)核對zone的訪問是很頻繁的,為了更好的利用硬件cache來提高訪問速度,struct zone中還有一些填充位,用于幫助結構體元素的cache line對齊。這和struct page對內(nèi)存精打細算的使用形成了鮮明的對比,因為zone的種類很有限,一個系統(tǒng)中一共也不會有多少個zones,struct zone這個結構體的體積大點也沒有什么關系。

Node Distance

上節(jié)中的例子是以2個節(jié)點為例,如果有>2個節(jié)點存在,就需要考慮不同節(jié)點間的距離來安排節(jié)點,例如以4個節(jié)點2個ZONE為例,各節(jié)點的布局(如4個XLP832物理CPU級聯(lián))值如下:

圖片

上圖中,Node0和Node2的Node Distance為25,Node1和Node3的Node Distance為25,其它的Node Distance為15。

三、NUMA調度器

NUMA系統(tǒng)中,由于局部內(nèi)存的訪存延遲低于遠地內(nèi)存訪存延遲,因此將進程分配到局部內(nèi)存附近的處理器上可極大優(yōu)化應用程序的性能。Linux 2.4內(nèi)核中的調度器由于只設計了一個運行隊列,可擴展性較差,在SMP平臺表現(xiàn)一直不理想。當運行的任務數(shù)較多時,多個CPU增加了系統(tǒng)資源的競爭,限制了負載的吞吐率。在2.5內(nèi)核開發(fā)時,Ingo Molnar寫了一個多隊列調度器,稱為O(1),從2.5.2開始O(1)調度器已集成到2.5內(nèi)核版本中。O(1)是多隊列調度器,每個處理器都有一條自己的運行隊列,但由于O(1)調度器不能較好地感知NUMA系統(tǒng)中結點這層結構,從而不能保證在調度后該進程仍運行在同一個結點上,為此,Eirch Focht開發(fā)了結點親和的NUMA調度器,它是建立在Ingo Molnar的O(1)調度器基礎上的,Eirch將該調度器向后移植到2.4.X內(nèi)核中,該調度器最初是為基于IA64的NUMA機器的2.4內(nèi)核開發(fā)的,后來Matt Dobson將它移植到基于X86的NUMA-Q硬件上。

3.1 初始負載平衡

在每個任務創(chuàng)建時都會賦予一個HOME結點(所謂HOME結點,就是該任務獲得最初內(nèi)存分配的結點),它是當時創(chuàng)建該任務時全系統(tǒng)負載最輕的結點,由于目前Linux中不支持任務的內(nèi)存從一個結點遷移到另一個結點,因此在該任務的生命期內(nèi)HOME結點保持不變。一個任務最初的負載平衡工作(也就是選該任務的HOME結點)缺省情況下是由exec()系統(tǒng)調用完成的,也可以由fork()系統(tǒng)調用完成。在任務結構中的node_policy域決定了最初的負載平衡選擇方式。

Node_policy平衡方式注釋
0(缺省值)do_execve()任務由fork()創(chuàng)建,但不在同一個結點上運行exec()
1do_fork()如果子進程有新的mm結構,選擇新的HOME結點
2do_fork()選擇新的HOME結點

3.2 動態(tài)負載平衡

在結點內(nèi),該NUMA調度器如同O(1)調度器一樣。在一個空閑處理器上的動態(tài)負載平衡是由每隔1ms的時鐘中斷觸發(fā)的,它試圖尋找一個高負載的處理器,并將該處理器上的任務遷移到空閑處理器上。在一個負載較重的結點,則每隔200ms觸發(fā)一次。調度器只搜索本結點內(nèi)的處理器,只有還沒有運行的任務可以從Cache池中移動到其它空閑的處理器。

如果本結點的負載均衡已經(jīng)非常好,則計算其它結點的負載情況。如果某個結點的負載超過本結點的25%,則選擇該結點進行負載均衡。如果本地結點具有平均的負載,則延遲該結點的任務遷移;如果負載非常差,則延遲的時間非常短,延遲時間長短依賴于系統(tǒng)的拓撲結構。

四、CpuMemSets

SGI的Origin 3000 ccNUMA系統(tǒng)在許多領域得到了廣泛應用,是個非常成功的系統(tǒng),為了優(yōu)化Origin 3000的性能,SGI的IRIX操作系統(tǒng)在其上實現(xiàn)了CpuMemSets,通過將應用與CPU和內(nèi)存的綁定,充分發(fā)揮NUMA系統(tǒng)本地訪存的優(yōu)勢。Linux在NUMA項目中也實現(xiàn)了CpuMemSets,并且在SGI的Altix 3000的服務器中得到實際應用。

CpuMemSets為Linux提供了系統(tǒng)服務和應用在指定CPU上調度和在指定結點上分配內(nèi)存的機制。CpuMemSets是在已有的Linux調度和資源分配代碼基礎上增加了cpumemmap和cpumemset兩層結構,底層的cpumemmap層提供一個簡單的映射對,主要功能是:將系統(tǒng)的CPU號映射到應用的CPU號、將系統(tǒng)的內(nèi)存塊號映射到應用的內(nèi)存塊號;上層的cpumemset層主要功能是:指定一個進程在哪些應用CPU上調度任務、指定內(nèi)核或虛擬存儲區(qū)可分配哪些應用內(nèi)存塊。

4.1 cpumemmap

內(nèi)核任務調度和內(nèi)存分配代碼使用系統(tǒng)號,系統(tǒng)中的CPU和內(nèi)存塊都有對應的系統(tǒng)號。應用程序使用的CPU號和內(nèi)存塊號是應用號,它用于指定在cpumemmap中CPU和內(nèi)存的親和關系。每個進程、每個虛擬內(nèi)存區(qū)和Linux內(nèi)核都有cpumemmap,這些映射是在fork()、exec()調用或創(chuàng)建虛擬內(nèi)存區(qū)時繼承下來的,具有root權限的進程可以擴展cpumemmap,包括增加系統(tǒng)CPU和內(nèi)存塊。映射的修改將導致內(nèi)核調度代碼開始運用新的系統(tǒng)CPU,存儲分配代碼使用新的內(nèi)存塊分配內(nèi)存頁,而已在舊塊上分配的內(nèi)存則不能遷移。Cpumemmap中不允許有空洞,例如,假設cpumemmap的大小為n,則映射的應用號必須從0到n-1。

Cpumemmap中系統(tǒng)號和應用號并不是一對一的映射,多個應用號可以映射到同一個系統(tǒng)號。

4.2 cpumemset

系統(tǒng)啟動時,Linux內(nèi)核創(chuàng)建一個缺省的cpumemmap和cpumemset,在初始的cpumemmap映射和cpumemset中包含系統(tǒng)目前所有的CPU和內(nèi)存塊信息。

Linux內(nèi)核只在該任務cpumemset的CPU上調度該任務,并只從該區(qū)域的內(nèi)存列表中選擇內(nèi)存區(qū)分配給用戶虛擬內(nèi)存區(qū),內(nèi)核則只從附加到正在執(zhí)行分配請求CPU的cpumemset內(nèi)存列表中分配內(nèi)存。

一個新創(chuàng)建的虛擬內(nèi)存區(qū)是從任務創(chuàng)建的當前cpumemset獲得的,如果附加到一個已存在的虛擬內(nèi)存區(qū)時,情況會復雜些,如內(nèi)存映射對象和Unix System V的共享內(nèi)存區(qū)可附加到多個進程,也可以多次附加到同一個進程的不同地方。如果被附加到一個已存在的內(nèi)存區(qū),缺省情況下新的虛擬內(nèi)存區(qū)繼承當前附加進程的cpumemset,如果此時標志位為CMS_SHARE,則新的虛擬內(nèi)存區(qū)鏈接到同一個cpumemset。

當分配頁時,如果該任務運行的CPU在cpumemset中有對應的存儲區(qū),則內(nèi)核從該CPU的內(nèi)存列表中選擇,否則從缺省的CPU對應的cpumemset選擇內(nèi)存列表。

4.3硬分區(qū)和CpuMemSets

在一個大的NUMA系統(tǒng)中,用戶往往希望控制一部分CPU和內(nèi)存給某些特殊的應用。目前主要有兩種技術途徑:硬分區(qū)和軟分區(qū)技術,CpuMemSets是屬于軟分區(qū)技術。將一個大NUMA系統(tǒng)的硬分區(qū)技術與大NUMA系統(tǒng)具有的單系統(tǒng)映像優(yōu)勢是矛盾的,而CpuMemSets允許用戶更加靈活的控制,它可以重疊、劃分系統(tǒng)的CPU和內(nèi)存,允許多個進程將系統(tǒng)看成一個單系統(tǒng)映像,并且不需要重啟系統(tǒng),保障某些CPU和內(nèi)存資源在不同的時間分配給指定的應用。

SGI的CpuMemSets軟分區(qū)技術有效解決硬分區(qū)中的不足,一個單系統(tǒng)的SGI ProPack Linux服務器可以分成多個不同的系統(tǒng),每個系統(tǒng)可以有自己的控制臺、根文件系統(tǒng)和IP網(wǎng)絡地址。每個軟件定義的CPU組可以看成一個分區(qū),每個分區(qū)可以重啟、安裝軟件、關機和更新軟件。分區(qū)間通過SGI NUMAlink連接進行通訊,分區(qū)間的全局共享內(nèi)存由XPC和XPMEM內(nèi)核模塊支持,它允許一個分區(qū)的進程訪問另一個分區(qū)的物理內(nèi)存。

五、測試

為了有效驗證Linux NUMA系統(tǒng)的性能和效率,我們在SGI公司上海辦事處測試了NUMA架構對SGI Altix 350性能。

該系統(tǒng)的配置如下:CPU:8個1.5 GHz Itanium2 內(nèi)存:8GB 互連結構:如圖3所示

圖3 SGI Altix350 4個計算模塊的Ring拓撲

圖片

測試用例:

1、Presta MPI測試包(來自ASCI Purple的Benchmark)

從互連拓撲結構可以看出,計算模塊內(nèi)部的訪存延遲不需要通過互連,延遲最逗,剩下的需要通過1步或2步互連到達計算模塊,我們通過Presta MPI測試包,重點測試每步互連對系統(tǒng)的影響,具體結果如下:

最小延遲(us)一步延遲(us)兩步延遲(us)
1.61.82.0

2、NASA的NPB測試

圖片

上述測試表明,SGI Altix 350系統(tǒng)具有較高的訪存和計算性能,Linux NUMA技術已進入實用階段。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)存
    +關注

    關注

    8

    文章

    3110

    瀏覽量

    75011
  • 硬件
    +關注

    關注

    11

    文章

    3461

    瀏覽量

    67217
  • 機器
    +關注

    關注

    0

    文章

    790

    瀏覽量

    41139
  • 存儲管理
    +關注

    關注

    0

    文章

    31

    瀏覽量

    9383
  • numa
    +關注

    關注

    0

    文章

    7

    瀏覽量

    3930
收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    Linux的內(nèi)存管理是什么,Linux的內(nèi)存管理詳解

    Linux的內(nèi)存管理 Linux的內(nèi)存管理是一個非常復雜的過程,主要分成兩個大的部分:內(nèi)核的內(nèi)存管理和進程虛擬內(nèi)存。內(nèi)核的內(nèi)存管理是Linux內(nèi)存
    的頭像 發(fā)表于 05-11 17:54 ?6455次閱讀
    Linux的內(nèi)存<b class='flag-5'>管理</b>是什么,Linux的內(nèi)存<b class='flag-5'>管理</b>詳解

    網(wǎng)絡存儲設備相關介紹

    一些,而且由于NAS本身是為網(wǎng)絡數(shù)據(jù)存儲而量身定做,其硬件配置以及功能都更適合用于提供高速、安全的數(shù)據(jù)存儲服務。SAN & NAS:數(shù)據(jù)存儲技術介紹 隨著互聯(lián)網(wǎng)及網(wǎng)絡應用的飛
    發(fā)表于 11-12 00:19

    NUMA怎么優(yōu)化?

    在網(wǎng)絡研討會期間,我們看到了一些關于NUMA利用的快速幻燈片, 有沒有關于優(yōu)化這個的其他信息?更具體地說,如何確保將ram和gpu插槽分配給正確的套接字?此外,網(wǎng)絡研討會表格的任何副本可用嗎?以上
    發(fā)表于 09-29 14:27

    什么是基于閃存平臺的存儲管理策略?

    作者:李建勛 樊曉光 禚真福來源:什么是基于閃存平臺的存儲管理策略?在嵌入式系統(tǒng)中,由于閃存成本低、容量大、非易失、訪問速度高和機械故障少的優(yōu)勢已逐漸成為最流行的存儲大量數(shù)據(jù)的存儲器。
    發(fā)表于 07-31 08:17

    多核處理器分類之SMP與NUMA簡析

    一致存儲器訪問(Non- Uniform Memory Access,簡稱NUMA)。NUMA系統(tǒng)的特點是,整個系統(tǒng)由多個節(jié)點構成,每個節(jié)點有自己的處理器(一個或多個)和獨立的存儲器,
    發(fā)表于 06-07 16:46

    智能卡操作系統(tǒng)中存儲管理設計

    介紹了智能卡操作系統(tǒng)中存儲管理的設計方法,給出了存儲管理所涉及的數(shù)據(jù)結構,分析了各種存儲
    發(fā)表于 09-14 15:05 ?18次下載

    智能卡操作系統(tǒng)中存儲管理設計

    介紹了智能卡操作系統(tǒng)中存儲管理的設計方法,給出了存儲管理所涉及的數(shù)據(jù)結構,分析了各種存儲
    發(fā)表于 09-22 11:42 ?6次下載

    MEMS存儲設備的管理技術

    MEMS存儲器是一種新型存儲器件,本內(nèi)容介紹了MEMS存儲設備的管理技術,請求調度算法,數(shù)據(jù)布局策略等內(nèi)容
    發(fā)表于 12-11 14:25 ?1199次閱讀

    大數(shù)據(jù)存儲管理

    如何高效地存儲大數(shù)據(jù)并支持實時大數(shù)據(jù)處理與分析是大數(shù)據(jù)技術發(fā)展面臨的首要問題。近年來,以相變存儲器、閃存等為代表的新型存儲為實現(xiàn)高效的大數(shù)據(jù)存儲
    發(fā)表于 03-28 16:05 ?24次下載
    大數(shù)據(jù)<b class='flag-5'>存儲</b><b class='flag-5'>管理</b>

    英特爾VTune放大器解決NUMA系統(tǒng)中的問題

    在多插槽NUMA系統(tǒng)中,了解內(nèi)存子系統(tǒng)上的內(nèi)存對象放置是性能的關鍵。 英特爾?VTune?放大器可以提供幫助。
    的頭像 發(fā)表于 11-09 06:55 ?3109次閱讀

    NUMA架構下的內(nèi)存數(shù)據(jù)庫命令日志故障恢復

    NUMA架構下的內(nèi)存數(shù)據(jù)庫命令日志故障恢復
    發(fā)表于 06-24 16:26 ?26次下載

    SMP、NUMA、MPP體系結構比較

    從系統(tǒng)架構來看,目前的商用服務器大體可以分為三類,即對稱多處理器結構 (SMP :Symmetric Multi-Processor) ,非一致存儲訪問結構 (NUMA :Non-Uniform
    的頭像 發(fā)表于 07-04 09:04 ?1570次閱讀

    華納云淺析海外服務器的3種體系架構:SMP、NUMA、MPP

    華納云淺析海外服務器的3種體系架構:SMP、NUMA、MPP
    的頭像 發(fā)表于 12-14 11:09 ?1524次閱讀

    R5300 G4服務器NUMA節(jié)點CPU處理核分布不規(guī)則的解決辦法

    R5300 G4服務器NUMA節(jié)點CPU處理核范圍存在分布不規(guī)則的情況
    的頭像 發(fā)表于 06-25 11:32 ?1788次閱讀
    R5300 G4服務器<b class='flag-5'>NUMA</b>節(jié)點CPU處理核分布不規(guī)則的解決辦法

    段式存儲管理和頁式存儲管理的區(qū)別

    段式存儲管理和頁式存儲管理是操作系統(tǒng)中兩種常見的內(nèi)存管理技術,它們在物理內(nèi)存的分配和管理上有著顯
    的頭像 發(fā)表于 12-30 17:17 ?5838次閱讀
    段式<b class='flag-5'>存儲</b><b class='flag-5'>管理</b>和頁式<b class='flag-5'>存儲</b><b class='flag-5'>管理</b>的區(qū)別

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品