使能DPDK和OVS
使能DPDK和OVS的步骤,包括启动OVS、配置DPDK参数并绑定轮询CPU、加载用户态驱动、创建基于DPDK的OVS Bridge以及在虚拟机XML配置中开启共享内存和添加DPDK网络接口。
- 启动OVS。
mkdir -p /var/log/openvswitch/ mkdir /var/run/openvswitch/ ovsdb-tool create /etc/openvswitch/conf.db service openvswitch restart
- 配置DPDK并绑定轮询CPU。
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true other_config:dpdk-socket-mem="4096,4096,4096,4096" other_config:dpdk-lcore-mask="0xf8" other_config:pmd-cpu-mask="0xf0" service openvswitch restart
- “dpdk-socket-mem”参数用于配置针对4个NUMA节点的内存分配,如果机型NUMA数不等于4,请根据实际情况修改。
- “dpdk-lcore-mask”和“pmd-cpu-mask”则分别代表CPU的掩码。例如,如果希望将CPU 4到7绑定到特定任务上,那么对应的“pmd-cpu-mask”二进制表示就是“11110000”(从右至左数第5到8位为1,CPU编号从0开始),而“dpdk-lcore-mask”则比“pmd-cpu-mask”多一位,其二进制表示为“11111000”。将这两个二进制数转换为十进制后再转为十六进制,得到“0xf8”和“0xf0”。可以使用Python快速地进行这样的转换,例如通过print(hex(int('11110000', 2)))。
- 建议将网卡绑定到其所在NUMA节点的CPU核上。
- 查看网口名称。
ip a
- 查询网卡所在的NUMA节点。请将“网口名称”替换为实际的网口名称。
cat /sys/class/net/网口名称/device/numa_node
- 查看网口名称。
- 加载用户态驱动。
modprobe vfio modprobe vfio-pci
- 创建基于DPDK的OVS Bridge。
- 创建Bridge。
ovs-vsctl add-br br-int -- set bridge br-int datapath_type=netdev ovs-vsctl add-port br-int p-tap-dpdk -- set Interface p-tap-dpdk type=patch options:peer=p-tap-dpdk-int
- 创建用户态TAP口。
ovs-vsctl add-br br-ply$i -- set bridge br-ply$i datapath_type=netdev ovs-vsctl add-port br-ply$i tap$i -- set Interface tap$i type=dpdkvhostuser ovs-vsctl add-port br-ply$i p-tap$i-int -- set Interface p-tap$i-int type=patch options:peer=p-tap$i ovs-vsctl add-port br-int p-tap$i -- set Interface p-tap$i type=patch options:peer=p-tap$i-int
其中,需要将命令中的$i替换为TAP口序号。如果需要创建多个TAP口,需要修改$i后重新执行上述命令。
- 绑定网卡设备。
ovs-vsctl add-br br-dpdk -- set bridge br-dpdk datapath_type=netdev ovs-vsctl add-port br-dpdk p0 -- set Interface p0 type=dpdk options:dpdk-devargs=0000:9b:00.0 options:n_rxq=10 ovs-vsctl add-port br-dpdk p-tap-dpdk-int -- set Interface p-tap-dpdk-int type=patch options:peer=p-tap-dpdk
0000:9b:00.0为对应PF(Physical Function)网口的设备ID,请根据实际情况修改。
- 查看OVS状态。
ovs-vsctl show
- 创建Bridge。
- 配置虚拟机XML。
- 在虚拟机的XML配置中,开启共享内存,找到以下这段配置,并添加如下字段。
memAccess='shared'
添加完成后,如下所示。
1 2 3 4 5 6
<cpu mode='host-passthrough' check='none'> <topology sockets='1' dies='1' clusters='1' cores='4' threads='1'/> <numa> <cell id='0' cpus='0-3' memory='16777216' unit='KiB' memAccess='shared'/> </numa> </cpu>
- 添加DPDK网络。
1 2 3 4 5 6 7 8 9
<interface type='vhostuser'> <mac address='52:54:00:62:9a:43'/> <source type='unix' path='/var/run/openvswitch/tap1' mode='client'> <reconnect enabled='yes' timeout='10'/> </source> <target dev='tap1'/> <model type='virtio'/> <driver name='vhost' queues='8' rx_queue_size='1024' tx_queue_size='1024'/> </interface>
- 在虚拟机的XML配置中,开启共享内存,找到以下这段配置,并添加如下字段。
父主题: 虚拟机网络调优