在设计vswitch的架构的时候,每个核心上分配的虚拟设备端口是个挺麻烦的事情。在物理端口上,由于都支持多队列模式,所以每个核心都可以负责至少一条队列,也就是每个核心在转发数据包的时候只要送往自己负责的队列上即可,不用跨核心做数据交换。
而虚拟端口,默认只有两条,分别是一条读写队列,而假设数据平面有两个核心,则会导致某个核心上肯定会缺失对应的虚拟端口,必须跨核心来完成,这是一个不小的运行负担,所以研究虚拟端口是否支持多队列,假设支持,那么线程结构以及性能都会比较好一点。
经过查询英特尔的文档,发现可以对虚机进行配置来支持多队列,下面记录一下如何完成多队列的配置。
我们在创建虚机的时候,需要指定以下几个参数:
on
则可以开启网卡的多队列模式vector
数量vector
的值可以使用queue的数量 * 2 + 2
的方式来计算。所以以下为启动虚机的命令行:
./qemu/x86_64-softmmu/qemu-system-x86_64 -cpu host -smp 2,cores=2 -hda /root/fedora-22.img -m 2048M --enable-kvm -object memory-backend-file,id=mem,size=2048M,mem-path=/dev/hugepages,share=on -numa node,memdev=mem -mem-prealloc -chardev socket,id=char1,path=/usr/local/var/run/openvswitch/vhost-user0 -netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce,queues=2 -device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mq=on,vectors=6
当虚机启动完毕的时候,我们还需要对网卡进行一些配置来启用多队列功能,首先我们需要查看一下网卡的信息:
ethtool -l eth0
Channel parameters for eth0:
Pre-set maximums:
RX: 0
TX: 0
Other: 0
Combined: 2
Current hardware settings:
RX: 0
TX: 0
Other: 0
Combined: 1
可以看出网卡是支持多队列的,但是当前没有启用。我们可以使用如下的命令来变更当前的队列数:
ethtool -L eth0 combined 2
当我们再次使用查看命令来查看网卡信息的时候,我们就可以看到如下的输出:
Channel parameters for eth0:
Pre-set maximums:
RX: 0
TX: 0
Other: 0
Combined: 2
Current hardware settings:
RX: 0
TX: 0
Other: 0
Combined: 2
这个时候当虚机通过vhost-user
连接到dpdk
对应的模块的时候,通过获取vring
数量,我们就可以得到4
条,由于之前也说过每个队列都有一条读和一条写,所以开启多队列就成功了。
成功之后,我们只需要将虚拟端口加入到每个核心中处理就可以获得读写每个端口的能力,避免频繁的跨核心数据交换。