开发者
基于 numactl 的 NUMA 亲和性绑定实战优化
基于 numactl 的 NUMA 亲和性绑定实战优化
发表于01/21
2.2k0

在鲲鹏 HPC 集群的性能调优中,NUMA(非统一内存访问)架构的适配度直接决定内存访问效率与 CPU 算力利用率,而 numactl 工具作为鲲鹏架构下 NUMA 亲和性绑定的核心工具,是解决跨 NUMA 节点内存访问、提升缓存命中率的关键手段。多数 HPC 任务迁移至鲲鹏集群后,因默认任务调度未绑定 NUMA 节点,跨节点内存访问占比常达 30% 以上,CPU 缓存命中率不足 50%,严重制约计算效率。本文聚焦 numactl 工具的实操应用,结合 OpenFOAM 流体力学模拟场景,从 NUMA 拓扑解析、绑定策略设计、工具参数配置、优化效果验证四个维度,分享可落地的 NUMA 亲和性绑定方案,精准攻克内存访问瓶颈。

鲲鹏 920 处理器单颗芯片集成 4 个 NUMA 节点,每个节点包含 16 个物理核心、独立的内存控制器及缓存体系,节点内内存访问时延仅为跨节点访问的 1/3 左右,这种架构设计旨在通过本地化内存访问提升算力效率,但也对任务调度提出了严格要求。未做 NUMA 绑定的情况下,MPI 进程与 OpenMP 线程会被随机分配至不同 NUMA 节点,进程计算所需的数据需频繁跨节点读取,不仅增加内存访问时延,还会引发节点间缓存冲突,导致 CPU 算力浪费。以 OpenFOAM 流体模拟任务为例,未绑定 NUMA 时,单步迭代时间达 120 秒,跨 NUMA 节点内存访问占比 35%,CPU 缓存命中率仅 42%,即便鲲鹏处理器多核性能强劲,也难以发挥实际算力。而 numactl 工具可通过精准绑定进程与 NUMA 节点、控制内存分配范围,强制进程在本地节点获取计算资源与内存数据,从根源上减少跨节点访问。

开展 NUMA 亲和性绑定前,需先通过 numactl 工具解析鲲鹏节点的 NUMA 拓扑,明确节点与 CPU 核心、内存区域的对应关系,为绑定策略设计提供依据。核心命令为numactl --hardware,执行后可输出节点数量、每个节点对应的 CPU 核心列表、内存大小及内存访问距离等关键信息。以鲲鹏 920 服务器为例,输出结果中 “node0 cpus: 0-15” 代表 node0 节点对应 0-15 号物理核心,“node0 size: 128000 MB” 表示该节点内存容量为 128GB,“node distances” 则展示了各节点间的内存访问时延比例,node0 到自身的访问时延系数为 10,到 node1 的系数为 23,直观体现了跨节点访问的性能损耗。同时,可结合lscpu命令辅助验证,通过 “NUMA node0 CPU (s): 0-15” 等信息交叉确认拓扑关系,避免因拓扑识别错误导致绑定策略失效。此外,需注意鲲鹏服务器多颗处理器的 NUMA 节点编号规则,双路鲲鹏 920 服务器共 8 个 NUMA 节点,编号从 0 到 7,需区分不同处理器对应的节点范围,确保绑定精准性。

基于 NUMA 拓扑解析结果,结合 HPC 任务的并行编程模型(MPI+OpenMP 混合编程),设计分层 NUMA 亲和性绑定策略,通过 numactl 参数实现进程、线程与 NUMA 节点的深度绑定。针对 MPI 进程绑定,核心参数为--cpunodebind--membind,其中--cpunodebind指定 MPI 进程绑定的 NUMA 节点,--membind限制进程内存分配范围,确保内存访问局限于绑定节点。以 OpenFOAM 任务为例,若启动 16 个 MPI 进程,可通过命令numactl --cpunodebind=0 --membind=0 mpirun -np 16 simpleFoam -parallel,将 16 个进程全部绑定至 node0 节点,内存仅从 node0 分配,彻底消除跨节点内存访问。针对 OpenMP 线程绑定,需结合环境变量与 numactl 参数配合,先通过export OMP_NUM_THREADS=16设置线程数与单个 NUMA 节点核心数一致,再通过numactl --cpunodebind=0 --membind=0绑定节点,同时启用export OMP_PROC_BIND=close让线程绑定至相邻核心,减少缓存冲突。

对于多节点并行任务,需采用 “节点分组绑定” 策略,将 MPI 进程按 NUMA 节点均匀分配,例如双路鲲鹏服务器 8 个 NUMA 节点,启动 64 个 MPI 进程时,通过numactl --cpunodebind=0-7 --membind=0-7 --interleave=all mpirun -np 64 simpleFoam -parallel,让进程均匀分布在 8 个节点,内存按节点交织分配,兼顾负载均衡与本地化访问。需注意避免过度绑定导致资源浪费,若任务进程数少于 NUMA 节点数,可将多个进程绑定至同一节点,确保节点核心利用率饱和。同时,针对内存密集型任务,可启用--preferred参数指定内存优先分配节点,进一步优化内存访问效率。

NUMA 亲和性绑定的优化效果,需结合性能监控工具量化验证,确保跨节点访问占比、缓存命中率、任务计算周期等指标达到预期。借助鲲鹏 BoostKit 的perf工具,通过perf stat -e cache-misses,cache-references ./your_task命令监控缓存命中率,优化后 OpenFOAM 任务的 CPU 缓存命中率从 42% 提升至 86%,缓存缺失率降低 60% 以上;通过numastat命令查看跨节点内存访问情况,跨节点内存访问占比从 35% 降至 5% 以下;任务计算周期从 120 秒缩短至 68 秒,性能提升 43%。同时,需排查绑定过程中的常见问题:若绑定后进程无法启动,需检查 NUMA 节点编号是否正确、进程数是否超过节点核心数;若性能无明显提升,需验证内存分配是否局限于绑定节点,可通过numastat -m命令查看内存分配情况,确保--membind参数生效。

在实际工程应用中,这套基于 numactl 的 NUMA 亲和性绑定方案已在多个鲲鹏 HPC 场景落地见效:某航空航天企业的 OpenFOAM 流体仿真集群,经优化后任务计算周期缩短 43%,仿真精度保持不变;某高校的 LAMMPS 分子动力学模拟集群,绑定 NUMA 节点后,单步迭代时间缩短 40%,集群整体算力利用率从 58% 提升至 85%。可见,numactl 工具的精准应用的是鲲鹏 HPC 集群突破内存访问瓶颈的关键,通过科学的拓扑解析、分层绑定策略与参数配置,可充分发挥鲲鹏 NUMA 架构的优势,为计算密集型、内存密集型 HPC 任务提供高效的国产化算力支撑。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞