双路服务器上压测发现一半线程明显更慢,节点统计显示内存几乎全分配在一个节点上。

排查方向其实有限,先把可能性排一排。进程默认在启动时所在的节点分配内存。还有一种是没有开启自动均衡策略。

不容易想到的是,大页预留集中在单个节点上。

第一件事是看各节点内存分配

numastat -p $(pidof app)

接着确认节点与处理器的对应关系

lscpu | grep -i numa

再往下按节点绑定启动

numactl --cpunodebind=0 --membind=0 ./app

等前面都确认过,再开启自动均衡

sysctl -w kernel.numa_balancing=1

中途换过一次思路,把范围缩到最小的那一层,反而快了。

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

恢复的判定其实很直接。各节点内存分布趋于均衡,压测中各线程耗时差距明显缩小。

跨节点访存延迟差距能有几成,内存密集服务尤其敏感;绑定之前先确认节点拓扑,别绑反。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189