背景
工作中接触到DPDK相关知识,在提高DPDK性能上,使用NUMA架构是一个调优点,之前日常运维的过程中也了解过NUMA相关的运维知识,遂总结本文供自己参考。本文主要参考《NUMA架构下的性能挑战》演讲,以及互联网上相关优秀的文章。
SMP到NUMA
CPU就像一个高速公路,不停的从Memory中加载数据,计算数据,再写回Memroy。数据读取和写回的速度,是制约系统性能的一个关键因素。随着制程工艺的发展,芯片上晶体管的密度越来越高,功耗墙的存在迫使CPU从单核走向多核。
从单核到SMP,所有的核均通过总线访问内存。每一个进程都可以被分配到任何一个核上运行,达到很好的负载均衡。
从SMP到NUMA,在SMP系统中,核数的扩展受到内存总线的限制。非统一内存访问架构(Non-uniformmemory access)很好的解决了这一问题。
NUMA下性能优化
使用numactl操作NUMA策略
使用CPU亲和性提高性能
让进程在给定的Core上尽可能长时间的运行,而不被迁移到其他处理器的倾向性。
Nginx服务:可以将 网卡中断 和 worker 进程绑定到同一个NUMA节点上
NUMA下性能挑战
NUMA非统一内存访问,减少跨NUMA的内存拷贝,但是还是有一些其他的性能挑战,比如 锁,避免使用锁和伪共享问题
相关操作
开启
需要BIOS中设置,启动参数设置,等
查看服务器NUMA架构
lscpu 查看:
1 | [root@0xfe ~]# lscpu |
可以看到已经启用NUMA架构:
- NUMA node0 CPU(s): 0-5,12-17
- NUMA node1 CPU(s): 6-11,18-23
demsg查看:
1 | [root@0xfe ~]# grep -i NUMA /var/log/dmesg |
放一个shell脚本,查看CPU topo:
1 |
|
如上面本机的CPU信息,输出为:
1 | ===== CPU Topology Table ===== |
结合lscpu查看的NUMA结果,可见每个socket中的cpu core是一个NUMA node。
top 查看numa节点的相关信息
top 命令下:
按 1
,显示每CPU的信息
按 2
,显示每NUMA NODE的信息
1 | top - 16:08:52 up 218 days, 2:00, 2 users, load average: 0.00, 0.02, 0.05 |
按 3
,输入对应的node号,显示node中每CPU的信息
1 | top - 16:09:31 up 218 days, 2:01, 3 users, load average: 0.00, 0.02, 0.05 |
numastat查看内存分配情况
1 | [root@0xfe numa]# numastat |
赞赏支持一下