searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

多核NUMA架构下内存访问距离不均已成性能隐忧,服务器进程绑核与内存交织的量化增益测试给出最优配比

2026-07-13 17:03:05
2
0

一、NUMA架构下的内存访问距离不均

NUMA架构通过将CPU核心和内存控制器分组为多个节点,解决了传统SMP架构中所有核心竞争同一条内存总线的扩展性问题。每个NUMA节点拥有独立的CPU核心群组和本地内存,节点间通过高速互联总线连接。这种架构在大规模多核系统中显著提升了内存带宽的可扩展性,但也引入了新的性能变量:内存访问距离。

当进程运行在Node0的核心上,访问Node0的本地内存时,内存控制器直连,时延通常在80至120纳秒之间。而当该进程访问Node1的远端内存时,请求需经过节点间的互联总线(如UPI或CCXI),往返时延可达180至240纳秒,几乎是本地访问的两倍。更为严峻的是,远端访问不仅时延更高,还会消耗互联总线的带宽,当多个核心同时进行远端访问时,总线可能成为新的性能瓶颈。

息壤平台的数据中心服务器配备了双路或四路CPU,每个CPU对应一个NUMA节点。在生产环境中的性能剖析显示,在未做任何NUMA优化的默认配置下,约35%至45%的内存访问属于远端访问,数据库类负载的远端访问比例甚至可超过50%。这意味着近一半的访存操作在以接近两倍的时延运行,算力的实际发挥被内存访问距离严重拖累。

二、绑核策略:让进程跑在正确的核心上

绑核策略是将进程或线程固定到特定的CPU核心或核心集合上运行,避免操作系统调度器将进程在不同核心间迁移,从而确保进程大部分时间访问本地内存。绑核的本质是"数据随计算走"——让进程的计算位置与其内存分配位置保持在同一NUMA节点内。

我们对绑核策略进行了三种模式的对比测试:无绑核(操作系统自由调度)、同节点绑核(进程固定在一个NUMA节点内的核心上)、跨节点绑核(进程固定在多个NUMA节点的核心上,但不限制访问本地内存的倾向性)。

测试负载选用内存密集型基准程序(Stream和MLC),以及数据库OLTP混合读写负载。结果显示,同节点绑核对内存带宽敏感型负载的增益最为显著——Stream测试的三维复制带宽从无绑核的约85GB/s提升至约115GB/s,增益约35%。数据库OLTP负载的吞吐量从约14200 TPS提升至约18500 TPS,增益约30%。然而,跨节点绑核在某些核心组合下反而导致性能下降——当绑核集合包含了来自不同NUMA节点的核心且未设置内存分配策略时,吞吐量较无绑核下降了约8%至15%。

这一反直觉的结果揭示了一个关键事实:绑核本身不保证性能提升,只有当绑核与内存分配策略协同时才能发挥效果。如果进程的线程分布在多个NUMA节点的核心上,但内存分配仍从单一节点分配,则远端访问比例将显著上升,性能不升反降。

三、内存交织策略:远端访问的平滑化方案

内存交织策略通过将物理内存地址的分配打散,使连续的虚拟内存地址映射到不同NUMA节点的物理内存上。在极端交织模式下,每64字节(一个缓存行)的连续地址空间可能交替映射至Node0和Node1的物理内存。这种模式下,任何核心访问任何地址都有约50%的概率命中本地内存、50%的概率命中远端内存,访问距离在统计意义上被均匀化。

交织策略的优势在于消除了"热点节点"——避免所有内存分配集中到单一NUMA节点导致该节点内存带宽耗尽而其他节点空闲。劣势在于,任何核心都无法获得纯粹的本地访问,平均访存时延介于纯本地访问与纯远端访问之间。

我们测试了三种交织粒度:64字节(缓存行级交织)、4KB(页级交织)和2MB(大页级交织)。结果表明,交织粒度越小,访问时延的分布越均匀,但TLB和页表缓存的压力也越大。在数据库OLTP负载中,4KB页级交织使P99时延的标准差从无交织的34毫秒降至21毫秒,降幅约38%,但平均吞吐量较同节点绑核策略下降约8%。

这一结果表明,交织策略的价值不在于提升峰值吞吐,而在于提升性能的一致性。对于对尾时延敏感的业务(如在线交易系统),P99时延的稳定性有时比平均吞吐更重要,交织策略在此类场景中具有不可替代的价值。

四、最优配比:负载特征决定的最佳组合

测试数据揭示了一个核心结论:绑核与交织的最优配比取决于负载特征和可用核心数的组合,不存在单一最优方案。我们将测试结果归纳为三种典型场景的推荐配比:

场景一:内存带宽敏感型负载(如科学计算、AI训练) 。推荐策略为同节点绑核+关闭内存交织。进程绑定在一个NUMA节点的全部核心上,所有内存从该节点分配,最大化本地访问比例。若数据规模超过单节点内存容量,则采用"本地分配优先、远端分配补充"策略,将超过单节点容量的数据放置在远端节点,但频繁访问的热数据集保持在本地节点。

场景二:时延敏感型混合负载(如OLTP数据库、高频交易) 。推荐策略为跨节点绑核+4KB页级交织。进程分布在多个NUMA节点的核心上,每个核心优先访问本地内存,但交织机制保障了内存分配在节点间的均匀性,避免了单一节点成为热点。此配置下平均吞吐较场景一低约8%至12%,但P99时延的稳定性最优,适合对尾时延有严格要求的业务。

场景三:CPU计算密集、访存不频繁的负载(如数据压缩、加密解密) 。推荐策略为宽松绑核(仅限定NUMA节点层面)+不开启交织。由于访存操作不频繁,访问距离差异的影响较小,操作系统自动调度即可满足需求,强行优化反而增加调度开销。此类负载下,NUMA优化的边际收益低于5%,不值得引入额外的配置复杂度。

五、动态感知调度器:让最优配比自适应变化

静态的最优配比表解决了"已知负载特征时如何配置"的问题,但生产环境的负载特征随时间变化,静态配置会随着负载迁移而逐渐偏离最优。我们设计了一个轻量级NUMA状态感知调度器,实时采集每个进程的访存分布(本地/远端访问计数器)和每个NUMA节点的内存带宽利用率,在检测到访存分布偏差时自动调整绑核或交织策略。

调度器的决策逻辑遵循"先纠偏、后优化"原则:当某进程的远端访问比例超过30%时,优先迁移该进程至内存所在的NUMA节点(纠正绑核偏差);当远端访问比例稳定在15%以下但仍存在明显的节点间负载不均时,适度调整内存交织粒度(从2MB降至4KB)以平滑分配。

动态调度器的引入使最优配比策略的覆盖范围从静态负载扩展至动态混合负载。在持续运行72小时的混合负载测试中,动态调度器使平均吞吐维持在静态最优配置的95%以上,而静态最优配置在负载发生两次大幅切换后,吞吐降至峰值的78%。

结语:NUMA架构下的内存访问距离不均是硬件层面的固有特征,但通过合理的绑核与内存交织策略配比,可以将其对性能的负面影响降至最低。本文的量化测试表明,绑核对内存密集型负载的增益可达35%,而交织策略可显著提升尾时延的一致性。两者的最优配比并非固定值,而是负载特征与系统规模的函数。对运维团队而言,理解这一依赖关系并建立动态调节能力,比固守某一策略更为重要。未来我们将探索将NUMA状态感知调度器与容器编排平台整合,在容器调度阶段即考虑NUMA拓扑的亲和性,将容器优先调度至其数据已驻留的NUMA节点上,从源头减少远端访问的发生。

0条评论
0 / 1000
c****8
1304文章数
2粉丝数
c****8
1304 文章 | 2 粉丝
原创

多核NUMA架构下内存访问距离不均已成性能隐忧,服务器进程绑核与内存交织的量化增益测试给出最优配比

2026-07-13 17:03:05
2
0

一、NUMA架构下的内存访问距离不均

NUMA架构通过将CPU核心和内存控制器分组为多个节点,解决了传统SMP架构中所有核心竞争同一条内存总线的扩展性问题。每个NUMA节点拥有独立的CPU核心群组和本地内存,节点间通过高速互联总线连接。这种架构在大规模多核系统中显著提升了内存带宽的可扩展性,但也引入了新的性能变量:内存访问距离。

当进程运行在Node0的核心上,访问Node0的本地内存时,内存控制器直连,时延通常在80至120纳秒之间。而当该进程访问Node1的远端内存时,请求需经过节点间的互联总线(如UPI或CCXI),往返时延可达180至240纳秒,几乎是本地访问的两倍。更为严峻的是,远端访问不仅时延更高,还会消耗互联总线的带宽,当多个核心同时进行远端访问时,总线可能成为新的性能瓶颈。

息壤平台的数据中心服务器配备了双路或四路CPU,每个CPU对应一个NUMA节点。在生产环境中的性能剖析显示,在未做任何NUMA优化的默认配置下,约35%至45%的内存访问属于远端访问,数据库类负载的远端访问比例甚至可超过50%。这意味着近一半的访存操作在以接近两倍的时延运行,算力的实际发挥被内存访问距离严重拖累。

二、绑核策略:让进程跑在正确的核心上

绑核策略是将进程或线程固定到特定的CPU核心或核心集合上运行,避免操作系统调度器将进程在不同核心间迁移,从而确保进程大部分时间访问本地内存。绑核的本质是"数据随计算走"——让进程的计算位置与其内存分配位置保持在同一NUMA节点内。

我们对绑核策略进行了三种模式的对比测试:无绑核(操作系统自由调度)、同节点绑核(进程固定在一个NUMA节点内的核心上)、跨节点绑核(进程固定在多个NUMA节点的核心上,但不限制访问本地内存的倾向性)。

测试负载选用内存密集型基准程序(Stream和MLC),以及数据库OLTP混合读写负载。结果显示,同节点绑核对内存带宽敏感型负载的增益最为显著——Stream测试的三维复制带宽从无绑核的约85GB/s提升至约115GB/s,增益约35%。数据库OLTP负载的吞吐量从约14200 TPS提升至约18500 TPS,增益约30%。然而,跨节点绑核在某些核心组合下反而导致性能下降——当绑核集合包含了来自不同NUMA节点的核心且未设置内存分配策略时,吞吐量较无绑核下降了约8%至15%。

这一反直觉的结果揭示了一个关键事实:绑核本身不保证性能提升,只有当绑核与内存分配策略协同时才能发挥效果。如果进程的线程分布在多个NUMA节点的核心上,但内存分配仍从单一节点分配,则远端访问比例将显著上升,性能不升反降。

三、内存交织策略:远端访问的平滑化方案

内存交织策略通过将物理内存地址的分配打散,使连续的虚拟内存地址映射到不同NUMA节点的物理内存上。在极端交织模式下,每64字节(一个缓存行)的连续地址空间可能交替映射至Node0和Node1的物理内存。这种模式下,任何核心访问任何地址都有约50%的概率命中本地内存、50%的概率命中远端内存,访问距离在统计意义上被均匀化。

交织策略的优势在于消除了"热点节点"——避免所有内存分配集中到单一NUMA节点导致该节点内存带宽耗尽而其他节点空闲。劣势在于,任何核心都无法获得纯粹的本地访问,平均访存时延介于纯本地访问与纯远端访问之间。

我们测试了三种交织粒度:64字节(缓存行级交织)、4KB(页级交织)和2MB(大页级交织)。结果表明,交织粒度越小,访问时延的分布越均匀,但TLB和页表缓存的压力也越大。在数据库OLTP负载中,4KB页级交织使P99时延的标准差从无交织的34毫秒降至21毫秒,降幅约38%,但平均吞吐量较同节点绑核策略下降约8%。

这一结果表明,交织策略的价值不在于提升峰值吞吐,而在于提升性能的一致性。对于对尾时延敏感的业务(如在线交易系统),P99时延的稳定性有时比平均吞吐更重要,交织策略在此类场景中具有不可替代的价值。

四、最优配比:负载特征决定的最佳组合

测试数据揭示了一个核心结论:绑核与交织的最优配比取决于负载特征和可用核心数的组合,不存在单一最优方案。我们将测试结果归纳为三种典型场景的推荐配比:

场景一:内存带宽敏感型负载(如科学计算、AI训练) 。推荐策略为同节点绑核+关闭内存交织。进程绑定在一个NUMA节点的全部核心上,所有内存从该节点分配,最大化本地访问比例。若数据规模超过单节点内存容量,则采用"本地分配优先、远端分配补充"策略,将超过单节点容量的数据放置在远端节点,但频繁访问的热数据集保持在本地节点。

场景二:时延敏感型混合负载(如OLTP数据库、高频交易) 。推荐策略为跨节点绑核+4KB页级交织。进程分布在多个NUMA节点的核心上,每个核心优先访问本地内存,但交织机制保障了内存分配在节点间的均匀性,避免了单一节点成为热点。此配置下平均吞吐较场景一低约8%至12%,但P99时延的稳定性最优,适合对尾时延有严格要求的业务。

场景三:CPU计算密集、访存不频繁的负载(如数据压缩、加密解密) 。推荐策略为宽松绑核(仅限定NUMA节点层面)+不开启交织。由于访存操作不频繁,访问距离差异的影响较小,操作系统自动调度即可满足需求,强行优化反而增加调度开销。此类负载下,NUMA优化的边际收益低于5%,不值得引入额外的配置复杂度。

五、动态感知调度器:让最优配比自适应变化

静态的最优配比表解决了"已知负载特征时如何配置"的问题,但生产环境的负载特征随时间变化,静态配置会随着负载迁移而逐渐偏离最优。我们设计了一个轻量级NUMA状态感知调度器,实时采集每个进程的访存分布(本地/远端访问计数器)和每个NUMA节点的内存带宽利用率,在检测到访存分布偏差时自动调整绑核或交织策略。

调度器的决策逻辑遵循"先纠偏、后优化"原则:当某进程的远端访问比例超过30%时,优先迁移该进程至内存所在的NUMA节点(纠正绑核偏差);当远端访问比例稳定在15%以下但仍存在明显的节点间负载不均时,适度调整内存交织粒度(从2MB降至4KB)以平滑分配。

动态调度器的引入使最优配比策略的覆盖范围从静态负载扩展至动态混合负载。在持续运行72小时的混合负载测试中,动态调度器使平均吞吐维持在静态最优配置的95%以上,而静态最优配置在负载发生两次大幅切换后,吞吐降至峰值的78%。

结语:NUMA架构下的内存访问距离不均是硬件层面的固有特征,但通过合理的绑核与内存交织策略配比,可以将其对性能的负面影响降至最低。本文的量化测试表明,绑核对内存密集型负载的增益可达35%,而交织策略可显著提升尾时延的一致性。两者的最优配比并非固定值,而是负载特征与系统规模的函数。对运维团队而言,理解这一依赖关系并建立动态调节能力,比固守某一策略更为重要。未来我们将探索将NUMA状态感知调度器与容器编排平台整合,在容器调度阶段即考虑NUMA拓扑的亲和性,将容器优先调度至其数据已驻留的NUMA节点上,从源头减少远端访问的发生。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0