NUMA架构内多个节点间访存延时平衡 的内存分配策略
numactl参数及说明

numactl参数及说明为了最大化服务器的性能和资源利用率,许多服务器都采用了非一致性内存访问(NUMA)架构。
NUMA架构引入了多个内存节点,每个节点都有自己的处理器和内存。
在这样的架构下,针对内存的访问可能会存在延迟和性能下降的问题。
为了优化在NUMA架构下的内存访问和性能,Linux系统引入了numactl工具。
numactl是一个命令行工具,用于管理和调整NUMA架构下的内存性能。
它提供了一组参数,可以帮助管理员对服务器进行优化和调整,以获得更好的性能。
下面,我们将介绍一些常用的numactl参数及说明:1. --hardware参数numactl --hardware命令可以显示服务器上的NUMA架构和节点拓扑信息。
它可以告诉你服务器上有多少个NUMA节点以及每个节点的内存大小和可用性信息。
这对于了解服务器的具体配置非常有用。
2. --cpunodebind参数numactl --cpunodebind=<numa节点id>命令可以将进程绑定到指定的NUMA节点上。
这可用于优化内存访问,确保进程在访问内存时尽可能地接近。
要使用该参数,你需要指定要绑定的NUMA节点ID。
例如,如果你想将进程绑定到第一个NUMA节点上,可以使用--cpunodebind=0参数。
3. --membind参数numactl --membind=<numa节点id>命令可以将进程的内存分配限制在指定的NUMA节点上。
这可以确保进程分配的内存在访问时与其所在的NUMA节点相近,避免延迟和性能下降。
要使用该参数,你需要指定要限制的NUMA节点ID。
例如,如果你想将进程的内存分配限制在第一个NUMA节点上,可以使用--membind=0参数。
4. --interleave参数numactl --interleave命令可以将进程的内存分配在所有可用的NUMA节点之间进行均匀分配。
这个参数适用于那些不需要特定的内存分配策略的应用程序。
numa 分配策略

numa 分配策略
Numa(Non-uniform Memory Access,非统一内存访问)是一种多处理器计算机体系结构,在该体系结构中,每个处理器核心连接到一个或多个内存区域,并且内存访问延迟可能会因为距离处理器核心的距离而不同。
为了最大程度地减少内存访问延迟,需要使用合适的Numa分配策略。
下面是常见的Numa分配策略:
1. 首次访问者策略(First Touch Policy):将内存分配给第一次访问该内存的处理器核心。
当一个处理器核心访问一个新页时,操作系统会将其分配给与该核心关联的本地内存,这样可以尽量减少内存访问延迟。
2. 非本地性优先策略(Remote First Policy):将内存分配给非本地核心。
这种策略可以减少本地核心的内存压力,将非本地性访问的内存分配给其他核心,从而实现负载均衡。
3. 近邻分配策略(Nearest Neighbor Policy):将内存分配给最近的处理器核心。
这种策略基于Numa体系结构的特点,将内存分配给距离最近的处理器核心,以最大程度地减少内存访问延迟。
4. 平衡分配策略(Balanced Policy):将内存均匀地分配给所有可用的处理器核心。
这种策略可以提供一种均衡的访问模式,从而实现较低的内存访问延迟和
更好的负载均衡。
选择合适的Numa分配策略需要考虑具体的应用场景和硬件配置。
不同的处理器架构和操作系统可能会提供不同的Numa分配策略。
numa 分配原理 -回复

numa 分配原理-回复关于[numa 分配原理]的文章。
第一部分:什么是NUMA?非一致性存储访问(Non-Uniform Memory Access,NUMA)是一种计算机体系结构,旨在优化多处理器系统中的内存访问速度。
它是通过将处理器和内存资源分为多个节点(也称为域)来实现的。
每个节点都包含一个或多个处理器核心和一部分内存。
这样,每个节点可以独立地访问其本地内存,提供更短的访问时间。
然而,当一个处理器核心需要访问其他节点的内存时,可能会引入延迟。
NUMA架构通常用于大型的多处理器系统,例如服务器或高性能计算集群。
它在提高系统整体性能的同时,还可以提供更好的扩展性和内存利用率。
第二部分:NUMA分配原理是什么?NUMA分配原理是指操作系统如何将任务和内存资源分配给每个NUMA节点的过程。
这个过程旨在优化系统的性能,并确保每个节点的负载均衡。
NUMA分配原理可以归纳为以下几个步骤:1.识别NUMA拓扑结构:操作系统首先需要识别系统中存在的NUMA 节点以及它们之间的连接方式。
这通常通过读取系统中的硬件信息或者通过BIOS设置来完成。
2.任务分配:一旦NUMA节点的拓扑结构被确定,操作系统可以根据负载均衡算法将任务分配给每个节点。
这可以通过各种算法来完成,例如轮询,最小负载,或者基于任务类型的特定算法。
3.内存分配:对于NUMA架构,内存管理也是非常重要的一环。
操作系统需要确保任务可以访问到其所需的内存资源。
为此,可以使用不同的算法来分配内存,例如静态映射或动态映射。
静态映射将内存固定到特定的节点上,而动态映射允许内存在不同节点之间进行迁移。
第三部分:NUMA分配原理的优缺点是什么?NUMA分配原理的优点包括:1. 提高内存访问性能:由于每个节点都包含一部分本地内存,NUMA架构可以将内存访问速度最小化。
这对于那些需要频繁访问内存的任务来说尤为重要。
2. 提供更好的扩展性:NUMA架构可以支持大型多处理器系统,通过添加更多的节点和处理器核心,系统的规模可以很容易地扩展。
numa 分配原理

numa 分配原理
NUMA,全称为Non-Uniform Memory Access,中文译为“非一致性内存访问”。
这是一种特殊构架,它将不同的内存器件和CPU核心划分到不同的Node上,每个Node都拥有自己的集成内存控制器(IMC,Integrated Memory Controller)。
在Node内部,其架构与SMP(对称多处理)类似,使用IMC Bus进行不同核心间的通信;在不同的Node之间,则通过主板上的共享总线来访问其他Node的Remote Memory。
在Linux系统中,一旦识别到NUMA架构,默认的内存分配方案会优先从本地分配内存。
这是为了减少在同一node上的内存访问拥塞。
当本地内存不足时,系统会优先淘汰本地内存中无用的内存,尽可能让内存页和调用线程处在同一个node上。
此外,系统在启动时,为了进一步优化内存分配和访问,会选择以round-robin/interleave的形式在各个node 上分配内存,等到init进程启动后,再切换到默认的local模式。
这在NUMA里被称为memory policy。
NUMA的设计理念是将CPU和主存储器进行分区自治(即Local NUMA node),又可以跨区合作(即Remote NUMA node),以此方式缓解单一内存总线存在的瓶颈。
这里的关键是,不同的NUMA node都拥有几乎相等的资源。
在Local NUMA node内部,会通过自己的存储总线访问Local Memory;而对于Remote NUMA node,则可以通过主板上的共享总线来访问其他Node上的Remote Memory。
NUMA架构的优缺点

NUMA架构的优缺点numa把⼀台计算机分成多个节点(node),每个节点内部拥有多个CPU,节点内部使⽤共有的内存控制器,节点之间是通过互联模块进⾏连接和信息交互。
因此节点的所有内存对于本节点所有的CPU都是等同的,对于其他节点中的所有CPU都不同。
因此每个CPU可以访问整个系统内存,但是访问本地节点的内存速度最快(不经过互联模块),访问⾮本地节点的内存速度较慢(需要经过互联模块),即CPU访问内存的速度与节点的距离有关,该距离成为Node Distance。
查看当前numa的节点情况:numactl --hardware节点之间的距离(Node Distance)指从节点1上访问节点0上的内存需要付出的代价的⼀种表现形式。
Numa内存分配策略有⼀下四种:缺省default:总是在本地节点分配(当前进程运⾏的节点上)。
绑定bind:强制分配到指定节点上。
交叉interleavel:在所有节点或者指定节点上交叉分配内存。
优先preferred:在指定节点上分配,失败则在其他节点上分配。
查看当前系统numa策略:numactl --show因为numa默认的内存分配策略是优先在进程所在CPU的本地内存中分配,会导致CPU节点之间内存分配不均衡,当某个CPU节点内存不⾜时,会导致swap产⽣,⽽不是从远程节点分配内存,这就是swap insanity现象。
MySQL服务器为什么需要关闭numa?MySQL是单进程多线程架构数据库,当numa采⽤默认内存分配策略时,MySQL进程会被并且仅仅会被分配到numa的⼀个节点上去。
假设这个节点的本地内存为10GB,⽽MySQL配置20GB内存,超出节点本地内存部分(20GB-10GB)Linux会使⽤swap⽽不是使⽤其他节点的物理内存。
在这种情况下,能观察到虽然系统总的可⽤内存还未⽤完,但是MySQL进程已经开始在使⽤swap了。
如果单机只运⾏⼀个MySQL实例,可以选择关闭numa,关闭nuam有两种⽅法:1.硬件层,在BIOS中设置关闭;2.OS内核,启动时设置numa=off。
linux numa内存分配策略

linux numa内存分配策略NUMA(Non-UniformMemoryAccess)是一种计算机架构,用于处理多处理器系统中的内存访问问题。
NUMA 可以将计算机内存分为多个本地节点和远程节点,每个节点可以由一个或多个处理器访问。
在 NUMA 架构下,内存分配策略非常重要。
Linux 内核为 NUMA 提供了一些内存分配策略,包括:1. 使用本地节点分配:当一个进程需要分配内存时,Linux 内核会尝试使用本地节点分配内存。
这意味着内存将从本地节点中的可用内存池中分配,从而最大限度地减少内存访问延迟。
2. 使用远程节点分配:如果本地节点没有足够的可用内存,则内核将尝试从远程节点中分配内存。
这将增加内存访问延迟,但仍然比从本地节点以外的节点中分配内存更好。
3. 使用任意节点分配:如果本地节点和远程节点都没有足够的可用内存,则内核将尝试从任意节点中分配内存。
这将增加内存访问延迟,并可能导致性能下降。
4. 使用交错节点分配:交错节点内存分配将内存块交错存储在多个本地节点中,这可以在多个节点之间分配内存,从而提高内存带宽。
但是,在某些情况下,交错内存分配可能会导致性能下降,因为它增加了内存访问延迟。
可以使用 Linux 的 numactl 工具来控制 NUMA 内存分配策略。
numactl 工具可以设置进程亲和性,这使得进程将分配到本地或远程节点的内存。
此外,numactl 工具还可以设置交错内存分配策略和其他 NUMA 相关的内核参数。
总之,NUMA 内存分配策略非常重要,可以显著影响系统的性能和可伸缩性。
Linux 内核提供了多种内存分配策略,可以通过numactl 工具进行控制。
在 NUMA 架构下,使用正确的内存分配策略可以提高系统的性能和可伸缩性。
numactl原理 -回复

numactl原理-回复numactl(Non-uniform memory access control)是一个在多节点非统一内存访问系统中管理内存访问的工具。
它通过管理内存和处理器之间的关系,帮助程序员在NUMA架构中优化内存访问和提高性能。
NUMA架构是一种处理器和内存直接连接在不同节点上的体系结构。
与传统的统一内存访问(UMA)架构不同,NUMA架构通过将处理器和内存划分为多个节点,并将它们直接连接,以支持更高的可扩展性和更好的性能。
每个节点具有自己的本地内存,处理器可以直接访问其本地内存,但访问其他节点的内存则需要通过交换数据的方式。
在NUMA架构中,节点之间的访问延迟是不均匀的。
由于节点之间的通信需要通过更长的物理距离和其他节点上的内存控制器,因此访问远程节点的内存速度将比访问本地节点的内存速度慢得多。
这就是所谓的“非统一内存访问”。
对于开发人员而言,了解和优化NUMA架构是至关重要的。
numactl提供了一组工具和库,用于管理内存并控制程序在NUMA架构中的内存访问方式。
下面将详细介绍numactl的原理和使用方法。
首先,numactl通过两种方式来管理内存:绑定和分配。
绑定可以将进程或线程固定在特定的NUMA节点上,以确保其访问本地内存。
分配则用于将内存分配给特定的NUMA节点,并使其成为了这个节点上最近的内存,从而减少远程访问的开销。
使用numactl绑定一个进程或线程到特定的NUMA节点,可以通过在命令行前加上"numactl cpunodebind=<node>"来实现。
例如,"numactl cpunodebind=0"将进程或线程绑定到NUMA节点0上。
绑定之后,进程或线程将只在绑定的节点上运行,从而保证了其内存访问的本地性。
分配内存给特定的NUMA节点,可以通过在命令行前加上"numactl membind=<node>"来实现。
numa和内存对应关系

numa和内存对应关系在计算机领域中,NUMA(Non-Uniform Memory Access)是一种多处理器架构,它允许多个处理器通过高速互联网络连接到共享内存系统。
NUMA架构的出现是为了解决传统对称多处理(SMP)架构中内存访问延迟和带宽瓶颈的问题。
NUMA架构通过将内存划分为多个节点,并将每个节点与特定的处理器核心关联,从而提供更高的内存访问性能。
在NUMA架构中,每个节点都有自己的本地内存和处理器核心。
当一个处理器核心需要访问内存时,它首先会尝试访问本地节点的内存。
如果所需的数据在本地节点的内存中,则可以直接访问,从而实现低延迟和高带宽的内存访问。
然而,如果所需的数据不在本地节点的内存中,处理器核心就需要通过互联网络访问其他节点的内存。
这种访问方式会导致较高的延迟和较低的带宽。
NUMA架构中的内存对应关系是通过内存节点和处理器核心之间的映射来实现的。
每个内存节点都与一个或多个处理器核心关联,并且只能由这些处理器核心访问。
这种映射关系可以通过操作系统的内存管理单元(MMU)来实现。
MMU负责将虚拟内存地址转换为物理内存地址,并根据NUMA架构的配置将内存访问路由到正确的节点。
在NUMA架构中,内存对应关系的优化是非常重要的。
合理地分配内存节点和处理器核心之间的映射关系可以最大程度地减少内存访问延迟和提高内存带宽。
一种常见的优化策略是将内存节点与最常访问的处理器核心关联,以便最大程度地减少远程内存访问。
此外,还可以通过合理地分配任务和数据来减少内存访问的竞争,从而提高系统的整体性能。
然而,NUMA架构也存在一些挑战和限制。
首先,由于内存节点之间的访问延迟和带宽差异,程序的性能可能会受到影响。
特别是在多线程程序中,如果线程之间的数据访问不均衡,就可能导致性能下降。
其次,NUMA架构需要操作系统和应用程序对内存访问进行显式管理,这对开发人员来说可能是一项挑战。
最后,NUMA架构的成本相对较高,因为它需要更多的硬件资源和复杂的互联网络。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要: 随着多核架构的发展和普及,NUMA多核架构凭借其本地访存低延时的优势,被各大商业
数据中心以及科学计算集群广泛采用。NUMA架构通过增加多个内存控制器,缓解了多核架构 下对同一个内存控制器的争用问题,但同时也增加了内存管理的负担。Linux的系统开发者为了 实现充分利用NUMA本地访存低延时的特点,在给一个进程分配内存时,选择进程当前正在运 行的NUMA节点作为分配内存的目标节点。这种分配会导致进/线程之间共享内存的不公平。 针对这一问题,本文设计了一种保证NUMA架构内各内存节点间访存延时平衡的内存分配策 略,并在Linux系统中实现和验证。实验结果表明,与Linux默认的内存分配策略相比,进/线程 间的不公平性平均降低了15%(最多32%),并且各进/线程的性能没有较大抖动。
22
《高性能计算发展与应用》 2015年第四期 总第五十三期
NUMA架构内多个节点间访存延时平衡 的内存分配策略
李慧娟 王辉 杨海龙 刘岚 栾钟治 钱德沛
北京航空航天大学计算机学院 中德联合软件研究所 北京 100091 huijuanli@buaa.edu.cn
基金项目:863计划课题,编号:2012AA010904;国家自然科学基金项目,编号:61133004,61361126011
NUMA架构内各内存节点在分配时已具有的访存延时 差异,这种内存节点的延时差异会使并行运行的应 用进程遭受不公平的访存延时。这种不公平性是内 存分配策略在分配时未考虑内存节点已具有的访存 延时引起的。运行在这种内存分配策略下,各应用 性能差异很大,这种不公平性在单物理机上很常见。
但是NUMA架构也使得内存管理更加复杂,尤其
是片上高速互联和内存控制器的引入以及远程内存 节点的可访问。访问远端内存节点相较于访问本地 节点会增加通过片上互联的额外延时。现在已有一 些研究以实现本地访存获得低延时来提高NUMA架构 的整体性能。在NUMA架构下,与访存相关的开销可 以分为四种:最后一级缓存LLC的争用、内存控制器 的拥塞、高速片上互联的拥塞和远端内存访问的延 时[3]。当前大多数研究集中在多级内存资源-- LLC和 内存的争用。最常使用的解决方法是对应用进行分 类学习,使相互干扰达到最小,以获取较高的整体 性能 。 [4][5][6] 在这些研究中,一些集中在应用间的干 扰识别和降低,另一些集中在实时调度策略[7][8]。 但是它们侧重于从调度策略入手提高应用运行过程 中访存的命中率,进而提升系统的整体性能,而忽 略了系统内存分配策略是影响应用运行时行为的直 接因素,内存分配的结果直接影响应用的后期运行 为和系统调度。因此本文从内存分配策略入手解决 NUMA架构下共享内存资源时,各应用进程面临不公 平的访存延时问题。这里不公平的访存延时是指:
在多核架构下,多个进/线程公平地共享资源 将会提高整个系统的性能,这点已有研究证实[9], 并且对访存延时是性能瓶颈的应用而言,访存的公 平性是整体性能制约的关键。前人研究多集中在以 调度的方式解决争用问题,而据我们研究发现,共 享内存资源的各应用进程会由于操作系统的内存分 配策略直接导致访存的不公平,进而影响系统整体 性能。Linux系统的内存分配策略仅考虑到尽可能访 问本地内存以实现低延时访存,但是忽略了内存节 点在分配时已具有的访存延时差异。而这些访存延 时差异直接影响应用的性能,尤其是访存密集型应 用。由于系统内进/线程的实时调度,访存延时会 在原有的基础上再加上进程中断、保存寄存器状态 等开销。最终导致应用的访存延时远远超过平均延 时,进而影响整体性能。因此,在NUMA架构中,访 存延迟仍然是应用性能的主要制约因素,而在当前 的内存分配策略下,它们还忍受着不公平的访存延 时带来的性能抖动。
2.2 Linux系统的内存分配策略的不足 虽然Linux系统的内存分配策略考虑到选择当前
节点作为分配节点,来获取本地访存的低延时,但 是这种方式存在两点不足。1)分配策略选择单链表 0上的内存分配,分配过程中不进行严格的节点匹 配,可能会导致分配给一个进程的内存块分散在多 个内存节点。2)分配内存时没有考虑节点间的访存 延时是否平衡。前面提到Linux内存分配策略选择空 闲页面数合适的内存块,这样做只能保证系统中多 个内存块的空闲物理页面数一致,但是不能保证节 点间的访存延时平衡。只考虑到内存块的空闲页面 数一致,可能会将一个进程申请的页面分配在一个 有足够的空闲内存页面但是访存延时很高的内存块 (一个内存块含有充足的空闲页面,但是它属于一 个访存竞争相当激烈的内存节点)。这样会增加该 进程的平均访存延时,同时增大了进程间共享内存 的不公平性。这种不公平性同样也会带来整体性能 的不稳定。因此,无论是将一个进程的内存分散在 多个节点,还是在分配内存时缺少对访存延时的考 虑,都会造成进程间共享内存的不公平同时造成性
图1 内存的组织的三个层次 其中1)页面(Page)是一个逻辑结构并且与 物理内存页框一一对应,页面大小一般是4KB。大 量连续的页面组成一个内存管理区,也称内存区( Zone)。2)内存区(Zone)是为了有效地管理物理 页面的使用而引入的。内存区可被分为3种类型: Zone_DMA,Zone_NORMAL和Zone_HIGHMEM。它 们按照内存的地址分类,DMA内存区包含16MB的 低地址内存页,用于硬盘I/O;NORMAL内存区包含 地址高于16MB的内存页,用于给一般的进程分配内 存页面;HIGHMEM内存区比较特殊,在32位系统 中可能包含一些页面,但是在64位系统中,该区域 不包含任何页面:32位操作系统的寻址能力是4G, 如果系统内存大于4G,那么超出的内存页面就属于 HIGHMEN内存区;但是对于64位操作系统,它的寻 址能力对于当前的内存容量是足够的。每一种类型 的内存区都包含一些小的内存块,这些内存块以单 链表的形式存在。3)内存节点(Node)与NUMA架 构中的物理内存节点一一对应,每一个节点内都
本文主要的贡献如下: 1. 提出一个可以衡量NUMA架构中内存节点访存 延时的指标。该指标可以反映出整体访存开销(详 见2.3节NUMA架构中GQ队列所携带的事件信息与所 处位置以及3.5.2小节的实现)。 2. 提出针对NUMA架构的内存分配策略,该策略 可以实时感知内存节点的访存延时,并且在保证访 存延时平衡的基础上选出分配节点。这个策略用于 选出访存延时最小的节点并在该节点上分配物理页 面,保证访存延时平衡和进程共享内存的公平。
关键词:NUMA架构,内存分配策略,访存延时感知,访存延时平衡
1. 引言
现代数据中心、科学计算集群以及云架构普遍 采用多核架构作为基础平台设施。多核架构凭借可 扩展的计算资源提高了计算能力,然而内存一直是 限制整体性能的瓶颈。主要表现有:有限的内存容 量、有限的内存带宽和内存控制器的争用。虽然内 存的容量已经足够大,但是相对于片上多核处理器 的核数而言,内存资源依旧是有限的。并且所有的 进程访问内存都需要通过唯一的内存控制器,当多 个进程同时需要访存时,将会导致多数进程处于等 待内存控制器的状态。非一致访存(NUMA)多核 架构通过把一块内存划分成多个内存节点并且每一 个节点附加一个内存控制器的方式,缓解了内存控 制器的争用。在此基础上,所有的片上多核都可以 通过高速片上互联和内存控制器访问每一个内存节 点。现在NUMA架构的服务器有很多,这些服务器至 少含有2个片上多处理器,比如戴尔的PowerEdge[1]和 惠普的ProLiant[2]。
当一个进程需要申请内存时,Linux系统为其分 配内存的过程如下:首先选择当前节点作为分配的 目标内存节点。然后选择节点的两个内存单链表之 一:如果这个进程的所有分配行为已被用户指定为 完全在当前节点,那么将会选择只含有本节点内存 块的单链表1;如果用户没有指定,则根据Linux默 认分配策略选择单链表0,并且优先选择属于本节点 的内存块。在单链表上选出合适的内存块后,交给 buddy内存分配器,分配物理页面并且将页面的地址 返回给上层分配策略。
高性能计算技术
3. 在Linux系统中实现并且用访存密集型应用验 证了提出的策略。实验结果表明进/线程间的不公平 性被显著的降低,同时保证了整体性能的稳定性。
后面文章组织结构如下:第2章介绍了Linux系 统的内存分配策略,分析了存在的不足,并通过 几组实验展示了这些不足带来的影响,2.3节给出 NUMA架构下访存延时的具体来源。第3章详细介绍 本文提出策略的设计,策略中各部件的实现和该策 略的执行过程。第4章展示和分析实验结果。第5章 总结本文。
2. 相关概念及问题描述
2.1 Linux系统的内存分配策略 访问本地内存节点的延时要比访问远端节点低
的多是NUMA架构的一个重要特征。因此,Linux操 作系统为了充分利用这一特征,对物理内存的组织 方式进行了改进。现有Linux系统采用三层结构来管 理内存,它们分别是:节点、内存区和内存页面, 它们之间的关系如图1所示。
ห้องสมุดไป่ตู้
23
24
《高性能计算发展与应用》 2015年第四期 总第五十三期
包含上述的3类内存区(如果HIGHMEM内存区存 在)。
图2 节点内存区的组织形式 为了实现NUMA架构内远端内存节点的可访问, 内存的组织方式也做了调整,其中每个内存节点都 包含两个单链表(如图2所示,以系统中包含两个内 存节点为例),每个单链表上的节点是包含一定数 量内存页面的内存块。1)单链表0包含整个系统中 所有内存区的内存块,不同节点的内存区按照节点 间距离的远近来排列(Linux默认内存分配策略选择 此链表上的内存块进行内存分配,所选内存块可能 分散在多个节点);2)单链表1只包含属于该物理 内存节点的内存块(以图2为例,节点0的单链表1仅 仅包含属于它的三种内存区)。 Linux系统的默认内存分配策略从单链表0上选 择合适的内存块,并将选定的内存块交给buddy分配 器进行具体的内存页面分配。选择的合适内存块, 是指该内存块上的空闲页面对于本次分配是足够 的。为了防止某个内存块的所有页面全部被分配, Linux系统为每个内存块定义了三个“水位线”。它 们分别是:pages_high,pages_low和pages_min。这些 水位线用来表示内存块内剩余的空闲页面数量的多 少,可以反映当前内存块经受的内存分配压力,图 3中显示了内存块内可用空闲页面在系统运行过程中 随着时间的变化情况。