numa node效应对网卡的影响以及解决方式

NUMA的诞生是为了解决SMP架构下不断增多的CPU Core导致的性能问题,NUMA调整了CPU和内存的布局和访问关系。将CPU划分到多个Node节点上,每个Node都有自己独立的内存空间。各个node之间通过高速互联通讯。

CPU访问不同类型节点的内存是不相同的,访问本地节点的速度最快,访问远端节点的速度最慢,即访问速度与节点的距离有关,距离越远访问速度越慢,即非一致。在NUMA系统中,当linux内核收到内存分配请求时,它会优先从发出请求的CPU本地或邻近的内存node中寻找空闲内存,这种方式称为local allocation。

 当网卡PCIe EP、内存、TX&RX CPU 不在同一个Numa上,如果存在数据拷贝,那么就会跨node去访问内存,对于CPU的消耗是比在本node上的消耗多的多的。因此,我们可以尽量使CPU,内存,以及TX&RX CPU均处在一个node上。

1. numa查看

查看网卡处在哪个node的方法如下,如果是-1,表示该主机只有一个node。

cat /sys/bus/pci/devices/0000\:01\:00.0/numa_node

查看node上的cpu以及相应的内存

查看伙伴系统内存

NUMA(non-uniform memory access)是一种计算机系统架构,它允许多个处理器和内存子系统同时工作。在NUMA系统中,不同的CPU与内存之间的访问速度是不同的,因此需要进行一些特殊处理来保证性能。在NUMA系统中,每个CPU和内存子系统都被分配到一个NUMA节点中。 在代码中,NUMA节点通常使用NUMA API进行管理和访问。例如,通过调用numa_alloc_onnode()函数可以在指定的NUMA节点上分配内存。同时,numa_run_on_node()函数可以将当前线程绑定到指定的NUMA节点上运行,以确保访问该节点上的内存。 以下是一个使用NUMA API的代码示例: ``` #include <numa.h> int main() { // 获取系统中的NUMA节点数量 int num_nodes = numa_max_node() + 1; printf("Number of NUMA nodes: %d\n", num_nodes); // 在NUMA节点0上分配1MB的内存 void *mem = numa_alloc_onnode(1024 * 1024, 0); printf("Allocated memory on NUMA node 0\n"); // 将当前线程绑定到NUMA节点1上 numa_run_on_node(1); printf("Running on NUMA node 1\n"); // 访问NUMA节点1上的内存 *((int*) mem) = 42; printf("Memory value on NUMA node 1: %d\n", *((int*) mem)); return 0; } ``` 在这个示例中,我们使用numa_max_node()函数获取了系统中的NUMA节点数量,并使用numa_alloc_onnode()函数在NUMA节点0上分配了1MB的内存。接着,我们使用numa_run_on_node()函数将当前线程绑定到NUMA节点1上,并访问了在NUMA节点0上分配的内存。通过这种方式,我们可以在不同的NUMA节点之间进行内存访问,从而实现更高效的计算和数据处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值