CPU性能优化:NUMA间内存迁移高占CPU致业务丢包问题深度分析与解决

张开发
2026/5/20 19:21:52 15 分钟阅读
CPU性能优化:NUMA间内存迁移高占CPU致业务丢包问题深度分析与解决
一、问题现象生产环境中某核心业务进程通过绑核策略部署在CPU 55核上运行期间出现间歇性网络丢包现象业务请求响应延迟骤增部分请求超时失败影响业务正常服务能力。二、问题定位与分析2.1 第一步定位CPU核异常占用首先通过mpstat命令对绑定业务的55核进行实时使用率统计每秒采集一次数据命令如下mpstat -P 55 1采集结果显示CPU 55核出现间歇性sys态爆核内核态CPU使用率%sys最高达到90%以上空闲态%idle占比大幅降低与业务丢包时段完全吻合初步判定丢包由CPU核高占用导致。图1CPU55核实时使用率监控可见sys态CPU间歇性冲高至90%2.2 第二步perf工具定位内核热点函数为进一步定位CPU高占用的具体原因使用Linux性能分析工具perf对55核进行采样分析捕获消耗CPU的进程与内核函数执行命令perf record -C 55 -e cycles -o 55.out -g通过perf report -i 55.out解析采样报告发现CPU消耗高度集中在内存迁移相关内核函数核心热点函数如下do_page_fault页异常处理函数do_numa_pageNUMA架构下的页处理函数migrate_misplaced_page/ migrate_pages内存页迁移核心函数try_to_unmap/ handle_mm_fault内存映射与缺页处理函数图2perf采样报告内存迁移相关函数占比超50%为CPU高占用核心原因2.3 第三步梳理NUMA内存迁移调用链路结合内核源码与perf采样结果梳理出NUMA自动内存均衡的核心调用链路确认内核正在执行跨NUMA节点的内存迁移操作do_page_fault → __do_page_fault → handle_mm_fault → handle_pte_fault→ do_numa_page → migrate_misplaced_page → migrate_pages→ unmap_and_move → try_to_unmap/ move_to_new_page2.4 第四步验证NUMA均衡开关与节点状态检查内核NUMA自动内存均衡开关状态执行命令sysctl kernel.numa_balancing返回结果为kernel.numa_balancing 1确认NUMA自动内存迁移功能已开启查看服务器NUMA节点拓扑与内存使用情况执行命令numactl -H结果显示服务器包含2个NUMA节点node0、node1其中node1空闲内存仅54MB内存资源紧张图3NUMA节点CPU与内存分布node1空闲内存极低2.5 第五步排除内存不足为根因初步怀疑内存不足触发内存迁移但通过以下两点排除该可能性执行top命令查看进程未发现内存回收进程kswapd运行说明系统未触发页交换未达到内存紧缺阈值查看/proc/meminfo发现Inactive file值偏高存在大量可回收的非活跃文件缓存执行echo 3 /proc/sys/vm/drop_caches手工释放缓存后node节点空闲内存恢复但CPU高占用与业务丢包现象仍未解决再次通过perf采样热点函数仍为内存迁移相关确认NUMA自动内存迁移为CPU高占用的直接根因。三、问题解决与验证3.1 临时关闭NUMA自动内存迁移针对定位结果直接关闭内核NUMA自动内存均衡开关执行以下命令root权限# 临时关闭重启服务器后失效sysctl -w kernel.numa_balancing0执行后通过sysctl -a | grep numa验证返回kernel.numa_balancing 0确认开关已关闭。图4关闭NUMA自动内存均衡开关并验证3.2 效果验证CPU使用率验证再次执行mpstat -P 55 1CPU 55核sys态使用率迅速降至正常水平5%以内空闲态占比恢复无爆核现象业务丢包验证查看业务网络丢包监控关闭开关后Dispatch通道及业务核心链路丢包数骤降为0业务请求响应延迟恢复正常丢包问题彻底解决。图5关闭NUMA内存迁移前后业务丢包趋势对比丢包数从百万级降至03.3 永久关闭NUMA自动内存迁移重启生效为避免服务器重启后配置失效将NUMA均衡开关配置写入系统内核参数配置文件步骤如下备份原有配置文件防止配置丢失cp /etc/sysctl.conf /etc/sysctl.conf.bak.$(date %Y%m%d)编辑/etc/sysctl.conf配置文件使用vi/vimvi /etc/sysctl.conf新增/修改配置项若文件中已有kernel.numa_balancing则将其值改为0若无则直接添加kernel.numa_balancing 0加载配置使其立即生效无需重启sysctl -p四、问题根因总结服务器开启NUMA自动内存均衡numa_balancing功能后内核会自动检测跨NUMA节点的内存访问当发现某节点内存资源紧张或存在远程内存访问时会触发跨NUMA节点的内存页迁移操作。该操作涉及大量的页异常处理、内存映射解除、TLB快表刷新、跨节点内存拷贝等内核操作会持续占用大量CPU内核态资源而业务进程绑定在单一CPU核上CPU资源被内存迁移操作抢占后业务进程无法及时处理网络请求与业务逻辑最终导致业务间歇性丢包、请求超时。五、适用场景与配置建议5.1 建议关闭NUMA自动内存迁移的场景业务进程绑核部署尤其是核心业务独占CPU核的场景避免内核操作抢占CPU资源低延迟/高性能业务如金融交易、实时数据处理、核心网络服务等对延迟和CPU利用率要求极高的业务NUMA节点资源规划合理已通过人工规划如进程与内存绑定、节点资源均分实现本地内存访问无需内核自动均衡单节点内存压力可控服务器整体内存充足各NUMA节点无持续性内存紧缺无大量远程内存访问。5.2 关闭后的影响与补充优化关闭后的轻微影响内核不再自动检测和优化跨NUMA节点的远程内存访问若存在大量远程内存访问会导致内存访问延迟略有增加但该影响远小于CPU被抢占导致的业务丢包补充优化措施通过numactl命令将进程与NUMA节点绑定numactl --cpunodebind1 --membind1 ./app实现进程与内存本地访问避免远程内存访问合理规划各NUMA节点的进程与内存分配避免单一节点内存资源过度占用对核心业务进程采用独占CPU核策略通过taskset绑核并关闭核的超线程减少资源竞争。5.3 建议保持开启的场景非核心业务/后台业务对延迟和CPU利用率要求较低允许内核进行资源自动优化NUMA节点资源规划混乱存在大量跨节点远程内存访问内核自动均衡可有效降低内存访问延迟动态业务负载业务进程负载频繁变化人工规划无法及时适配需要内核自动调整内存分布。六、问题定位常用命令汇总本次问题定位中使用的核心Linux命令适用于同类CPU高占用、内核态资源异常问题排查建议收藏命令功能说明示例mpstat -P N 1统计指定CPU核N为核号的实时使用率每秒采集一次mpstat -P 55 1perf record -C N -e cycles -o file.out -g对指定CPU核采样捕获CPU消耗的进程与函数-g记录函数调用链路perf record -C 55 -e cycles -o 55.out -gperf report -i file.out解析perf采样文件查看CPU消耗的进程、函数占比perf report -i 55.outnumactl -H查看服务器NUMA节点拓扑、CPU分布、内存使用情况numactl -Hsysctl [参数]查看/修改内核参数-w临时修改-p加载配置文件sysctl kernel.numa_balancing/sysctl -pcat /proc/meminfo查看系统内存详细统计包括空闲内存、缓存、交换分区等cat /proc/meminfoecho 3 /proc/sys/vm/drop_caches手工释放系统非活跃缓存pagecache、slab等root权限echo 3 /proc/sys/vm/drop_cachestop实时查看进程CPU、内存占用检测系统关键进程如kswapdtop七、同类问题排查思路总结针对绑核业务CPU高占用、业务丢包/延迟类问题可按照以下标准化思路排查快速定位根因定位异常CPU核通过mpstat/top确定业务绑核的CPU使用率区分用户态%usr和内核态%sys高占用内核态高占用→perf定位热点函数若为sys态高占用通过perf工具采样定位消耗CPU的内核函数判断是否为内存、网络、中断相关操作检查NUMA/内存相关配置若热点函数为内存迁移相关检查NUMA均衡开关、节点内存使用情况排除内存不足验证配置修改效果临时关闭相关内核功能验证CPU使用率与业务指标是否恢复永久化配置补充优化将有效配置永久化同时结合业务场景做资源规划优化避免问题复现复盘总结针对问题场景制定配置规范纳入业务部署与服务器运维标准。

更多文章