多路服务器在NUMA架构下,CPU跨节点访问远端内存的延迟比本地内存高出50%-100%。数据库、中间件等高吞吐应用在NUMA配置不当的情况下,性能衰减可达20%-30%。服务器NUMA架构调优通过CPU绑核、内存本地化和中断亲和性配置,消除跨节点访问瓶颈。
NUMA拓扑结构分析与诊断工具
NUMA(Non-Uniform Memory Access)架构将CPU和内存划分为多个节点,每个节点有本地内存控制器。以双路Intel Xeon服务器为例,两个CPU分别对应Node 0和Node 1,各自拥有本地内存。跨节点内存访问需要经过QPI/UPI互连总线,延迟显著增加。
使用numactl和lscpu查看NUMA拓扑:
# 查看NUMA节点分布
numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
node 0 size: 64236 MB
node 1 cpus: 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
node 1 size: 64468 MB
# 查看CPU与NUMA节点对应关系
lscpu | grep NUMA
NUMA node(s): 2
NUMA node0 CPU(s): 0-15
NUMA node1 CPU(s): 16-31
使用numastat查看各节点的内存分配情况,远端访问(remote hit)比例过高说明NUMA配置存在问题:
numastat -p $(pgrep -f mysqld)
Per-node process memory layout
Node 0 Node 1 Total
Numa_Hit 1024.50 0.00 1024.50
Numa_Miss 0.00 3072.00 3072.00
Numa_Foreign 3072.00 0.00 3072.00
Numa_Miss表示进程在远端节点分配了内存,Numa_Foreign表示本地节点的内存被远端CPU使用。两者合计值越低越好。
CPU绑核与numactl内存策略配置
numactl提供四种内存分配策略:–membind限定内存分配节点,–cpunodebind限定CPU执行节点,–preferred优先在指定节点分配内存,–interleave在多个节点间交错分配内存。
MySQL绑核到Node 0并使用本地内存:
# 方式一:numactl命令行绑定
numactl --cpunodebind=0 --membind=0 /usr/sbin/mysqld --defaults-file=/etc/my.cnf
# 方式二:systemd服务配置
# /etc/systemd/system/mysqld.service
[Service]
ExecStart=/usr/bin/numactl --cpunodebind=0 --membind=0 /usr/sbin/mysqld
CPUAffinity=0-15
NumaPolicy=bind
NumaNode=0
Redis等单线程应用绑定到单个CPU核心可减少上下文切换:
taskset -c 8 numactl --membind=0 redis-server /etc/redis/redis.conf
对于需要大内存且跨节点的应用(如Elasticsearch JVM堆),使用–interleave策略让内存均匀分布在两个节点上,避免单节点内存不足时触发swap:
numactl --interleave=all java -Xms48G -Xmx48G -jar elasticsearch.jar
IRQ中断亲和性与RPS/RFS优化
网卡中断默认由CPU 0处理,高网络吞吐场景下CPU 0成为瓶颈。通过设置IRQ亲和性,将网卡中断分散到不同NUMA节点的CPU上。
# 查看网卡中断号
grep eth0 /proc/interrupts
# 将中断绑定到Node 0的CPU 2-3
echo 0000000c > /proc/irq/64/smp_affinity
# c的二进制为1100,对应CPU 2和CPU 3
RPS(Receive Packet Steering)在软件层面将接收队列分散到多个CPU处理,RFS(Receive Flow Scheduling)保证同一网络流的包由同一CPU处理,提高缓存命中率:
# 启用RPS,将eth0 rx-0队列分散到Node 0所有CPU
echo ffff > /sys/class/net/eth0/queues/rx-0/rps_cpus
# 启用RFS
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
NUMA调优性能验证与监控
调优前后使用sysbench进行对比测试。未调优状态下MySQL QPS为8500,绑定到单NUMA节点后QPS提升至11000,提升约29%。内存延迟方面,使用mbw测试本地与远端内存带宽差异:
numactl --cpunodebind=0 --membind=0 mbw 1024
# 本地内存带宽:约11.2 GB/s
numactl --cpunodebind=0 --membind=1 mbw 1024
# 远端内存带宽:约7.8 GB/s
监控方面,通过Prometheus node_exporter采集numa_total和numa_used指标,配合Grafana面板可视化各节点的内存使用率。当某节点内存使用率超过90%而另一节点低于50%时,说明NUMA平衡策略需要调整。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/fu-wu-qi-numa-jia-gou-diao-you-shi-zhan-cpu-bang-he-yu-nei/