原文:dpdk 对 numa 的使用与多 numa 架构下性能调优的基础_dpdk numa-优快云博客
另外可以看下这篇:https://zhuanlan.zhihu.com/p/532451717
numa 是什么?
//numa节点就是内存节点,把内存分成了几块而已。
//注意numa和内存个数相关如果配置为2numa内存数就要是2的倍数,8numa就要是8的倍数,为了使后面产品规格容易搭配后面最好采用2numa的配置。
在 SMP 架构中,内存统一寻址(Uniform Memory Architecture),处理器和内存之间通过一条总线连接起来。由于所有处理器都是通过一条总线连接起来的,随着处理器的增加,系统总线成为了系统瓶颈,另外,处理器和内存之间的通信延迟也较大。为了克服以上缺点,NUMA 架构应运而生。
numa 架构全称为非一致性内存架构 (Non Uniform Memory Architecture),与 SMP 中的 UMA 统一寻址内存架构相对。在 numa 系统中有本地内存与远端内存的区别。访问本地内存有更小的延迟和更大的带宽,跨处理器内存访问速度会相对较慢一点,但是整个内存对于所有的处理器都是可见的。
numa 系统的一个示意图如下:
上图中有两个 cpu,CPU0 与 CPU1 都有自己的本地内存,访问这些内存的性能最优,这两个 cpu 也可以通过总线等架构跨处理器访问远端的内存,只不过性能相对会差一些。
dpdk-16.04 中对 numa 的使用
//每个PCI设备会关联一个numa
1. 如何获取 pci 网卡所在的 numa 节点?
linux 系统中 pci 设备会在 /sys/bus/pci/devices/ 中创建独立的子目录,目录名称就是 pci 设备的 pci 号。dpdk eal 初始化时,会扫描此目录来获取当前设备上所有可用的 pci 设备。每个 pci 设备所在的 numa 节点在 /sys/bus/pci/devices/xxx/numa_node 文件中保存,dpdk 通过访问这些文件获取到每个 pci 网卡的 numa_node 信息。
一个示例:
[root] # cat /sys/bus/pci/devices/0000\:80\:00.0/numa_node
dpdk 会为每个扫描到的 pci 设备创建一个 rte_pci_device 结构,并将解析 sys 目录得到的字段写入到此结构中,解析完成后将每个 rte_pci_device 链入到 pci_device_list 链表中。
dpdk 内部会为每个网卡接口分配一个 rte_eth_dev 结构,在网卡 probe 流程中,pci 网卡接口的 rte_eth_dev 结构中的 pci_dev 结构被设置为扫描 pci 时创建的 rte_pci_device 结构地址。
同时每个 pci 接口的 rte_eth_dev 的 data 结构中的 numa_node 字段也用于存储接口所在的 numa_node,这个字段能够在多进程间共享且能够通过每个接口的 rte_eth_dev 直接访问到。其拷贝过程是在驱动初始化函数中调用 rte_eth_copy_pci_info 完成的。
一个示例如下:
static int
eth_i40e_dev_init(struct rte_eth_dev *dev)
{
struct rte_pci_device *pci_dev;
struct i40