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.
