
高性能计算与大型数据库部署日益依赖物理服务器性能,非一致性内存访问(NUMA,)架构在多CPU系统中被广泛采用。它在带来更高可扩展性的同时,也引入了新的性能挑战。本文将以香港某物理服务器出现的内存访问延迟问题为例,深入剖析NUMA架构引发的性能瓶颈,提供一套完整的故障排查与解决方案,供系统管理员、运维工程师与架构师参考。
一、故障背景与现象描述
香港服务器硬件信息
- 部署地点:香港数据中心
- 服务器品牌型号:Dell PowerEdge R7525
- CPU 配置:2 x AMD EPYC 7543(32 核/64 线程,每颗 CPU 带有 8 个内存通道)
- 内存配置:512GB DDR4 ECC(均匀分布于两颗 CPU 上,各 256GB)
- 操作系统:CentOS 8.6
- 应用场景:MySQL 8.0 + Redis 6.2 + 自研微服务系统
运维团队在监控系统中发现:
- 某些高并发服务在业务高峰期响应时间明显上升;
- top/topas/htop 显示 CPU 利用率分布极不均匀,部分核心使用率高达 90%,而另一些核心接近空闲;
- numastat 工具显示跨 NUMA 节点的内存访问频繁,远高于预期;
- Redis 频繁出现 latency spikes,MySQL 延迟指标也随之波动。
二、NUMA架构简介与性能陷阱
在NUMA架构中,每颗 CPU 拥有其本地内存区域。访问本地内存比访问另一颗 CPU 的内存(称为远程内存)延迟低、带宽高。因此,优化进程与线程调度,使其尽可能访问本地内存,是提升 NUMA 架构性能的关键。
性能陷阱出现在:
- 应用没有 NUMA 感知能力,导致进程/线程随机被调度到任意 CPU;
- 内存被分配在远端 NUMA 节点,增加访问延迟;
- 内核未绑定进程或未合理使用 numa-policy;
- 应用在初始化时分配了大量内存,而后被迁移到其他 NUMA 节点执行。
三、故障排查过程
3.1 使用 lscpu 确认 NUMA 拓扑
lscpu | grep -E 'Socket|NUMA'
输出示例:
Socket(s): 2
NUMA node(s): 2
NUMA node0 CPU(s): 0-63
NUMA node1 CPU(s): 64-127
3.2 查看内存使用与跨节点访问
numastat -m
重点观察 numa_miss 和 numa_foreign 的指标是否显著偏高。若远程访问比本地访问高出数倍,即为异常。
3.3 检查应用进程与 NUMA 节点的绑定情况
ps -eo pid,cmd | grep redis
taskset -cp <pid>
numactl --show --pid <pid>
发现 Redis 进程运行在 node0,但占用了 node1 的大部分内存(远程访问)。
四、优化方案与实操步骤
4.1 使用 numactl 精确绑定内存与CPU
以 Redis 为例,我们希望将其锁定在 NUMA node0 上运行,并只使用该节点内存:
numactl --cpunodebind=0 --membind=0 redis-server /etc/redis.conf
对于systemd管理的服务,可以通过修改service文件:
[Service]
ExecStart=/usr/bin/numactl --cpunodebind=0 --membind=0 /usr/bin/redis-server /etc/redis/redis.conf
执行以下命令使其生效:
systemctl daemon-reexec
systemctl restart redis
4.2 优化 MySQL 内存分配策略
在MySQL启动脚本中加入NUMA绑定参数:
numactl --interleave=all mysqld_safe --defaults-file=/etc/my.cnf
或者启用 transparent hugepages 和内核自动页迁移功能:
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo 1 > /proc/sys/vm/zone_reclaim_mode
4.3 进阶调度控制:使用 tuned 自动优化 NUMA
安装并启用 NUMA-aware profile:
dnf install tuned
tuned-adm profile throughput-performance
systemctl enable --now tuned
五、优化结果验证
5.1 延迟降低情况(数据前后对比)

5.2 NUMA 指标改善
numastat -m
远程访问率下降至不到 10%,大部分进程的内存访问已本地化。
六、优化建议
NUMA架构虽为提升服务器性能设计,但一旦使用不当,便可能成为性能瓶颈的根源。对于香港这种高密度部署环境中的物理服务器,优化 NUMA 策略具有现实而深远的意义。建议在部署阶段就明确:
- 评估应用是否支持NUMA感知;
- 主动使用 numactl、taskset 等工具进行资源绑定;
- 利用 tuned、systemd 实现自动化调度;
- 定期使用 numastat、perf、htop 检查性能瓶颈。
合理配置 NUMA,不仅提升单台服务器性能,也能在大规模部署中获得系统级的稳定性和效率提升。











