DPDK之多队列网卡测试
0 背景
基于环境 VMware+Ubuntu 虚拟机环境,在DPDK接管多队列网卡后,每个网卡数据接收情况。
- 配置多队列网卡
- 多队列网卡测试
1 添加多个网卡
在vmware环境中对应虚拟机的虚拟机设置中,增加网络适配器(一个或者多个),对应网卡的个数。
启动虚拟机,查看网卡信息
当前生效的只有一个网卡,是桥接模式的第一个网卡:
1 | ubuntu@ubuntu:~$ service networking restart #不同的linux环境重启网络命令是不同的 |
2 配置网卡支持多队列
多队列网卡:就是网卡的DMA队列有多个,有自己对队列的分配机制。
- 修改虚拟机配置,使支持多队列(关闭虚拟机)
1 | #在Ubuntu 64 位.vmx 中打开,修改ethernet1配置,把e1000 改为 vmxnet3 |
- 修改虚拟机配置,处理器个数设为4
- 查看是否支持多队列网卡
使用cat /proc/interrupts 命令可以查看多队列网卡的效果
1 | ubuntu@ubuntu:~$ cat /proc/interrupts |grep eth0 |
可以看到,配置了4个处理器,这里的队列个数为4个。
- 使用cat /proc/cpuinfo,可以查看支持的cpu个数(processor+1)
1
2
3
4
5
6#可以自己查看细节
ubuntu@ubuntu:~$ cat /proc/cpuinfo |grep processor
processor : 0
processor : 1
processor : 2
processor : 3
3 配置Nginx环境
- 安装Nginx
- 修改nginx配置环境,设置cpu亲和性
1 | #在nginx配置文件中修改/增加如下 支持4个进程对应4个cpu |
- 绑定中断和cpu
在/proc/interrupts 文件中查看对应的多队列网卡的中断号,可以看到这里是56-59
1 | ubuntu@ubuntu:/usr/local/nginx$ cat /proc/interrupts |grep eth0 |
- 手动对中断号进行cpu的绑定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36root@ubuntu:/proc/irq# cat /proc/irq/56/smp_affinity
00000000,00000000,00000000,00000008
root@ubuntu:/proc/irq# cat /proc/irq/57/smp_affinity
00000000,00000000,00000000,00000008
root@ubuntu:/proc/irq# cat /proc/irq/58/smp_affinity
00000000,00000000,00000000,00000008
root@ubuntu:/proc/irq# cat /proc/irq/59/smp_affinity
00000000,00000000,00000000,00000008
root@ubuntu:/home# echo 00000001> /proc/irq/56/smp_affinity
root@ubuntu:/home# echo 00000002> /proc/irq/57/smp_affinity
root@ubuntu:/home# echo 00000004> /proc/irq/58/smp_affinity
root@ubuntu:/home# echo 00000008> /proc/irq/59/smp_affinity
#查看修改后的
root@ubuntu:/home# cat /proc/irq/56/smp_affinity
00000000,00000000,00000000,00000001
root@ubuntu:/home# cat /proc/irq/57/smp_affinity
00000000,00000000,00000000,00000002
root@ubuntu:/home# cat /proc/irq/58/smp_affinity
00000000,00000000,00000000,00000004
root@ubuntu:/home# cat /proc/irq/59/smp_affinity
00000000,00000000,00000000,00000008
#可以通过查看/proc/irq/56/smp_affinity_list 最后生效的,其实是对应的smp_affinity_list 其实是绑定的cpu号,可以多个
ubuntu@ubuntu:~$ cat /proc/irq/56/smp_affinity_list
0
ubuntu@ubuntu:~$ cat /proc/irq/57/smp_affinity_list
1
ubuntu@ubuntu:~$ cat /proc/irq/58/smp_affinity_list
2
ubuntu@ubuntu:~$ cat /proc/irq/59/smp_affinity_list
3
#如果有多于4个的,是继续如下配置的
root@ubuntu:/home# echo 00000010> /proc/irq/60/smp_affinity
root@ubuntu:/home# echo 00000020> /proc/irq/61/smp_affinity
root@ubuntu:/home# echo 00000040> /proc/irq/62/smp_affinity
root@ubuntu:/home# echo 00000080> /proc/irq/63/smp_affinity
4 多队列网卡测试
使用wrk性能测试工具对多队列网卡进行测试。
查看多队列网卡中中断产生所在cpu上的情况:主要看eth0,(中断号56,57,58,59) 。
可以从现象看出,56号中断数据在最后测试时,数据在cpu0, 57在cpu1, 58在cpu2, 59在cpu3 (cpu3上中断次数过多,是因为测试前的数据)
1 | root@ubuntu:/usr/local/nginx# cat /proc/interrupts |grep eth |
一次中断,保证一个包的完整接收,但是并不是限定了连接就一致在这个cpu上。
5 其他
5.1 多队列网卡的发送和接收
网卡内部有多个队列,与CPU进行绑定,通过PCI总线进行数据分发。
接收数据:
- 数据先进行hash
- 根据hash后的结果,放入对应的队列中
- 触发中断,由CPU进行处理:使用NAPI对单纯的硬件中断进行优化,有中断触发,数据就一直读, 因此rte_eth_rc_burst读出来得到数据是多个数组(多个队列即多个NAPI)。
发送数据:
- 通过队列,把send()接口和网卡发送进行拆分,对应的QDisc就是队列,可以是多个队列。
- 多个QDIsc队列设计方案:FIFO,可以四元组检索对应放数据。 (可以设置)
5.2 DPDK与多队列网卡
配置:rte_eth_dev_configure() :对网卡进行配置
启动: rte_eth_rx_queue_setup() : 对RX队列的配置
rte_eth_tx_queue_setup() : 对TX队列的配置
接收: rte_eth_rx_burst()
发送:rte_eth_tx_burst()
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.