歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

剖析Linux系統下基於NUMA構建的服務器

  NUMA(Non-Uniform Memory Access Architecture)系統在市場上的應用越來越廣泛,許多廠商都成功推出了基於 NUMA 架構的服務器,本文重點討論了當前 Linux 的 NUMA 技術,主要包括:存儲管理、 NUMA 調度和用戶層的 API, 並在 SGI 的 Altix 350 系統上進行了 NUMA 基本測試,對進行 Linux NUMA 技術的研究具有參考價值。 一、引言 隨著科學計算、事務處理對計算機性能要求的不斷提高,SMP(對稱多處理器)系統的應用越來越廣泛,規模也越來越大,但由於傳統的 SMP 系統中,所有處理器都共享系統總線,因此當處理器的數目增大時,系統總線的競爭沖突加大,系統總線將成為瓶頸,所以目前 SMP 系統的 CPU 數目一般只有數十個,可擴展能力受到極大限制。NUMA 技術有效結合了 SMP 系統易編程性和 MPP(大規模並行)系統易擴展性的特點,較好解決了 SMP 系統的可擴展性問題,已成為當今高性能服務器的主流體系結構之一。目前國外著名的服務器廠商都先後推出了基於 NUMA 架構的高性能服務器,如 HP 的  Superdome、SGI 的 Altix 3000、IBM 的 x440、NEC 的 TX7、AMD 的Opteron 等。隨著  Linux 在服務器平台上的表現越來越成熟,Linux 內核對 NUMA 架構的支持也越來越完善,特別是從 2.5 開始,Linux 在調度器、存儲管理、用戶級 API 等方面進行了大量的 NUMA 優化工作,目前這部分工作還在不斷地改進,如新近推出的 2.6.7-RC1 內核中增加了 NUMA 調度器。本文主要從存儲管理、調度器和 CpuMemSets 三個方面展開討論。 二、NUMA 存儲管理 NUMA 系統是由多個結點通過高速互連網絡連接而成的,如圖 1 是 SGI Altix 3000 ccNUMA 系統中的兩個結點。  圖 1 SGI Altix3000 系統的兩個結點NUMA 系統的結點通常是由一組 CPU(如,SGI Altix 3000 是 2 個Itanium2 CPU)和本地內存組成,有的結點可能還有I/O子系統。由於每個結點都有自己的本地內存,因此全系統的內存在物理上是分布的,每個結點訪問本地內存和訪問其它結點的遠地內存的延遲是不同的,為了減少非一致性訪存對系統的影響,在硬件設計時應盡量降低遠地內存訪存延遲(如通過 Cache 一致性設計等),而操作系統也必須能感知硬件的拓撲結構,優化系統的訪存。 目前IA64 Linux所支持的NUMA架構服務器的物理拓撲描述是通過ACPI (Advanced Configuration and Power Interface)實現的。ACPI是由Compaq、Intel、 Microsoft、Phoenix和Toshiba 聯合制定的BIOS規范,它定義了一個非常廣泛的配置和電源管理,目前該規范的版本已發展到 2.0,3.0版本正在制定中,具體信息可以從http://www.acpi.info 網站上獲得。ACPI規范也已廣泛應用於IA-32架構的至強服務器系統中。 Linux對NUMA系統的物理內存分布信息是從系統firmware的ACPI表中獲得的,最重要的是SRAT (System Resource Affinity Table)和SLIT(System Locality Information Table) 表,其中SRAT包含兩個結構: Processor Local APIC/SAPIC Affinity StrUCture:記錄某個 CPU 的信息; Memory Affinity Structure:記錄內存的信息; SLIT表則記錄了各個結點之間的距離,在系統中由數組node_distance[ ] 記錄。Linux采用Node、Zone和頁三級結構來描述物理內存的,如圖2所示,  圖 2 Linux 中 Node、Zone 和頁的關系2.1 結點 Linux 用一個 struct pg_data_t 結構來描述系統的內存,系統中每個結點都掛接在一個 pgdat_list 列表中,對  UMA 體系結構,則只有一個靜態的 pg_data_t 結構 contig_page_data。對 NUMA 系統來說則非常容易擴充, NUMA 系統中一個結點可以對應 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 分配時內存時zone的排序。它是由free_area_init_core()通過page_alloc.c中  build_zonelists() 設置 zone 的順序nr_zones 該結點的zone個數,可以從1到3,但並不是所有的結點都需要有3個 zonenode_mem_map它是struct page數組的第一頁,該數組表示結點中的每個物理頁框。根據該結點在系統中的順序,它可在全局 mem_map數組中的某個位Valid_addr_bitmap用於描述結點內存空洞的位圖,node_start_paddr該結點的起始物理地址。 node_start_mapnr給出在全局mem_map中的頁偏移,在free_area_init_core()計算在mem_map和 lmem_map之間的該結點的頁框數目,node_size該zone內的頁框總數,node_id該結點的ID,全系統結點ID從0開始。系統中所有結點都維護在pgdat_list列表中,在init_bootmem_core函數中完成該列表初始化工作。 2.2 Zone 每個結點的內存被分為多個塊,稱為zones,它表示內存中一段區域。一個zone用struct_zone_t結構描述,zone的類型主要有 ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。ZONE_DMA位於低端的內存空間,用於某些舊的ISA設備。 ZONE_NORMAL的內存直接映射到Linux內核線性地址空間的高端部分,許多內核操作只能在ZONE_NORMAL中進行。例如,在X86中, zone的物理地址如下: 類型 地址范圍 ZONE_DMA前16MB內存;ZONE_NORMAL 16MB - 896MB;ZONE_HIGHMEM 896 MB以上。Zone是用struct zone_t描述的,它跟蹤頁框使用、空閒區域和鎖等信息,具體描述如下: 

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;下面就該結構中的主要域進行說明: 域說明 Lock旋轉鎖,用於保護該zone,free_pages 該zone空閒頁總數pages_min,pages_low, pages_high Zone的阈值,need_balance 該標志告訴kswapd需要對該zone的頁進行交換,Free_area 空閒區域的位圖,用於buddy分配器。wait_table等待釋放該頁進程的隊列散列表,這對wait_on_page()和unlock_page()是非常重要的。當進程都在一條隊列上等待時,將引起進程的抖動。zone_mem_map 全局mem_map中該zone所引用的第一頁。 zone_start_paddr 含義與node_start_paddr類似。zone_start_mapnr含義與 node_start_mapnr類似。Name 該zone的名字。如,“DMA”,“Normal”或“HighMem”。Size Zone的大小,以頁為單位。 當系統中可用的內存比較少時,kswapd將被喚醒,並進行頁交換。如果需要內存的壓力非常大,進程將同步釋放內存。如前面所述,每個zone有三個阈值,稱為pages_low,pages_min和pages_high,用於跟蹤該zone的內存壓力。pages_min的頁框數是由內存初始化 free_area_init_core函數,根據該zone內頁框的比例計算的,最小值為20頁,最大值一般為255頁。當到達pages_min時,分配器將采用同步方式進行kswapd的工作;當空閒頁的數目達到pages_low時,kswapd被buddy分配器喚醒,開始釋放頁;當達到 pages_high時,kswapd將被喚醒,此時kswapd不會考慮如何平衡該zone,直到有pages_high空閒頁為止。一般情況下, pages_high缺省值是pages_min的3倍。 Linux存儲管理的這種層次式結構可以將ACPI的SRAT和SLIT信息與Node、Zone實現有效的映射,從而克服了傳統Linux中平坦式結構無法反映NUMA架構的缺點。當一個任務請求分配內存時,Linux采用局部結點分配策略,首先在自己的結點內尋找空閒頁;如果沒有,則到相鄰的結點中尋找空閒頁;如果還沒有,則到遠程結點中尋找空閒頁,從而在操作系統級優化了訪存性能。 更多內容請看Linux服務器配置  操作系統  系統管理專題,或




Copyright © Linux教程網 All Rights Reserved