当前位置: 首页 > 图文教程 > 服务器 > Linux服务器 > 基于NUMA架构的高性能服务器技术(1)

Linux服务器
linux下用cron定时执行任务的方法
.htaccess绑定域名到子目录的方法
linux apache下虚拟主机配置方法
apache 局域网访问配置方案
linux Apache服务器系统安全设置与优化
linux中mac地址绑定方法
linux托盘不断闪烁之解决方法
Apache配置 虚拟转向实例
Apache No space left on device的解决办法
Apache rewrite的重写相关的参数说明
LINUX入门级常用命令20条整理
Ubuntu设置开机自动挂载所有格式硬盘分区
5个可能被你忽略的Linux安全设置方法
学习Apache的mod rewrite、access写法
改版时保留原链接,创建新的URL的方法
rsync中文手册之使用rsync实现网站镜像和备份linux
rsync 数据同步使用详解
linux URL的301重定向代码分析
eclipse3.2.2 + MyEclipse5.5 + Tomcat5.5.27 配置数据库连接池
Apache服务器二级域名的完美实现

Linux服务器 中的 基于NUMA架构的高性能服务器技术(1)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-18   浏览: 70 ::
收藏到网摘: n/a


NUMA(Non-UniformMemoryAccessArchitecture)系统在市场上的应用越来越广泛,许多厂商都成功推出了基于NUMA架构的服务器,本文重点讨论了当前Linux的NUMA技术,主要包括:存储管理、NUMA调度和用户层的API,并在SGI的Altix350系统上进行了NUMA基本测试,对进行LinuxNUMA技术的研究具有参考价值。

一、引言
随着科学计算、事务处理对计算机性能要求的不断提高,SMP(对称多处理器)系统的应用越来越广泛,规模也越来越大,但由于传统的SMP系统中,所有处理器都共享系统总线,因此当处理器的数目增大时,系统总线的竞争冲突加大,系统总线将成为瓶颈,所以目前SMP系统的CPU数目一般只有数十个,可扩展能力受到极大限制。NUMA技术有效结合了SMP系统易编程性和MPP(大规模并行)系统易扩展性的特点,较好解决了SMP系统的可扩展性问题,已成为当今高性能服务器的主流体系结构之一。目前国外著名的服务器厂商都先后推出了基于NUMA架构的高性能服务器,如HP的Superdome、SGI的Altix3000、IBM的x440、NEC的TX7、AMD的Opteron等。随着Linux在服务器平台上的表现越来越成熟,Linux内核对NUMA架构的支持也越来越完善,特别是从2.5开始,Linux在调度器、存储管理、用户级API等方面进行了大量的NUMA优化工作,目前这部分工作还在不断地改进,如新近推出的2.6.7-RC1内核中增加了NUMA调度器。本文主要从存储管理、调度器和CpuMemSets三个方面展开讨论。

二、NUMA存储管理
NUMA系统是由多个结点通过高速互连网络连接而成的,如图1是SGIAltix3000ccNUMA系统中的两个结点。
 

图1SGIAltix3000系统的两个结点

NUMA系统的结点通常是由一组CPU(如,SGIAltix3000是2个Itanium2CPU)和本地内存组成,有的结点可能还有I/O子系统。由于每个结点都有自己的本地内存,因此全系统的内存在物理上是分布的,每个结点访问本地内存和访问其它结点的远地内存的延迟是不同的,为了减少非一致性访存对系统的影响,在硬件设计时应尽量降低远地内存访存延迟(如通过Cache一致性设计等),而操作系统也必须能感知硬件的拓扑结构,优化系统的访存。

目前IA64Linux所支持的NUMA架构服务器的物理拓扑描述是通过ACPI(AdvancedConfigurationandPowerInterface)实现的。ACPI是由Compaq、Intel、Microsoft、Phoenix和Toshiba联合制定的BIOS规范,它定义了一个非常广泛的配置和电源管理,目前该规范的版本已发展到2.0,3.0版本正在制定中,具体信息可以从http://www.acpi.info网站上获得。ACPI规范也已广泛应用于IA-32架构的至强服务器系统中。

Linux对NUMA系统的物理内存分布信息是从系统firmware的ACPI表中获得的,最重要的是SRAT(SystemResourceAffinityTable)和SLIT(SystemLocalityInformationTable)表,其中SRAT包含两个结构:

ProcessorLocalAPIC/SAPICAffinityStructure:记录某个CPU的信息;

MemoryAffinityStructure:记录内存的信息;
SLIT表则记录了各个结点之间的距离,在系统中由数组node_distance[]记录。

Linux采用Node、Zone和页三级结构来描述物理内存的,如图2所示
 

图2Linux中Node、Zone和页的关系

2.1结点

Linux用一个structpg_data_t结构来描述系统的内存,系统中每个结点都挂接在一个pgdat_list列表中,对UMA体系结构,则只有一个静态的pg_data_t结构contig_page_data。对NUMA系统来说则非常容易扩充,NUMA系统中一个结点可以对应Linux存储描述中的一个结点,具体描述见linux/mmzone.h。

typedefstructpglist_data{
zone_tnode_zones[MAX_NR_ZONES];
zonelist_tnode_zonelists[GFP_ZONEMASK+1];
intnr_zones;
structpage*node_mem_map;
unsignedlong*valid_addr_bitmap;
structbootmem_data*bdata;
unsignedlongnode_start_paddr;
unsignedlongnode_start_mapnr;
unsignedlongnode_size;
intnode_id;
structpglist_data*node_next;
}pg_data_t;

下面就该结构中的主要域进行说明
 

系统中所有结点都维护在pgdat_list列表中,在init_bootmem_core函数中完成该列表初始化工作。

2.2Zone

每个结点的内存被分为多个块,称为zones,它表示内存中一段区域。一个zone用struct_zone_t结构描述,zone的类型主要有ZONE_DMA、ZONE_NORMAL和ZONE_HIGHMEM。ZONE_DMA位于低端的内存空间,用于某些旧的ISA设备。ZONE_NORMAL的内存直接映射到Linux内核线性地址空间的高端部分,许多内核操作只能在ZONE_NORMAL中进行。例如,在X86中,zone的物理地址如下:
 

Zone是用structzone_t描述的,它跟踪页框使用、空闲区域和锁等信息,具体描述如下:

typedefstructzone_struct{
spinlock_tlock;
unsignedlongfree_pages;
unsignedlongpages_min,pages_low,pages_high;
intneed_balance;
free_area_tfree_area[MAX_ORDER];
wait_queue_head_t*wait_table;
unsignedlongwait_table_size;
unsignedlongwait_table_shift;
structpglist_data*zone_pgdat;
structpage*zone_mem_map;
unsignedlongzone_start_paddr;
unsignedlongzone_start_mapnr;
char*name;
unsignedlongsize;
}zone_t;

下面就该结构中的主要域进行说明

当系统中可用的内存比较少时,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采用局部结点分配策略,首先在自己的结点内寻找空闲页;如果没有,则到相邻的结点中寻找空闲页;如果还没有,则到远程结点中寻找空闲页,从而在操作系统级优化了访存性能。