/topics/dpdk/bridge
添加一个使用DPDK的桥接器:ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
配置桥接器以支持OpenFlow 1.4:ovs-vsctl set bridge br0 datapath_type=netdev protocols=OpenFlow10,OpenFlow11,OpenFlow12,OpenFlow13,OpenFlow14
检查桥接器表中的OpenFlow协议支持情况:ovsdb-client dump Bridge protocols
查询端口统计信息:ovs-ofctl -O OpenFlow14 dump-ports br0
获取接口的统计信息:ovs-vsctl get Interface <iface> statistics
设置Exact Match Cache (EMC)的插入概率:ovs-vsctl --no-wait set Open_vSwitch . other_config:emc-insert-inv-prob=N
启用或禁用接口的EMC:ovs-vsctl set interface <iface> other_config:emc-enable={true,false}
启用SMC缓存:ovs-vsctl --no-wait set Open_vSwitch . other_config:smc-enable=true
获取dpcls实现的信息:ovs-appctl dpif-netdev/subtable-lookup-info-get
设置dpcls查找函数的优先级:ovs-appctl dpif-netdev/subtable-lookup-prio-set avx512_gather 5
获取用户空间数据路径接口的实现信息:ovs-appctl dpif-netdev/dpif-impl-get
设置用户空间数据路径接口的实现:ovs-appctl dpif-netdev/dpif-impl-set dpif_avx512
设置用户空间数据路径接口的实现为默认实现:ovs-appctl dpif-netdev/dpif-impl-set dpif_scalar
获取优化后的miniflow提取实现的信息:ovs-appctl dpif-netdev/miniflow-parser-get
设置miniflow解析函数的实现:ovs-appctl dpif-netdev/miniflow-parser-set [-pmd core_id] name [study_cnt]
显示可用的Actions实现:ovs-appctl odp-execute/action-impl-show
设置Actions实现:ovs-appctl odp-execute/action-impl-set avx512
设置Actions实现为默认实现:ovs-appctl odp-execute/action-impl-set scalar
/topics/dpdk/phy
添加一个使用DPDK的物理端口:ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:01:00.0
配置DPDK物理端口的流控支持:ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:01:00.0 options:tx-flow-ctrl=true
配置DPDK物理端口的流控支持:ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:01:00.0 options:rx-flow-ctrl=true
配置DPDK物理端口的流控支持为自动协商模式:ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk options:dpdk-devargs=0000:01:00.0 options:flow-ctrl-autoneg=true
设置DPDK物理端口的Rx校验和卸载:ovs-vsctl set Interface dpdk-p0 options:rx-checksum-offload=true
热插拔端口:ovs-vsctl add-port br0 dpdkx -- set Interface dpdkx type=dpdk options:dpdk-devargs=0000:08:00.0
配置DPDK representors:ovs-vsctl add-port br0 dpdk-rep3 -- set Interface dpdk-rep3 type=dpdk options:dpdk-devargs=0000:08:00.0,representor=vf3
配置DPDK物理端口的LSC检测模式为中断模式:ovs-vsctl set interface <iface_name> options:dpdk-lsc-interrupt=true
配置DPDK物理端口的LSC检测模式为轮询模式:ovs-vsctl set interface <iface_name> options:dpdk-lsc-interrupt=false
/topics/dpdk/vhost-user
添加vhost-user客户端端口到现有的名为br0的桥接设备:
$ ovs-vsctl add-port br0 dpdkvhostclient0 \
-- set Interface dpdkvhostclient0 type=dpdkvhostuserclient \
options:vhost-server-path=/tmp/dpdkvhostclient0
$ ovs-vsctl add-port br0 dpdkvhostclient1 \
-- set Interface dpdkvhostclient1 type=dpdkvhostuserclient \
options:vhost-server-path=/tmp/dpdkvhostclient1
创建vhost-user设备的socket路径:
$ ovs-vsctl add-port br0 vhost-user-1 -- set Interface vhost-user-1 \
type=dpdkvhostuser
将vhost-user设备的socket附加到虚拟机:
-chardev socket,id=char1,path=/usr/local/var/run/openvswitch/vhost-user-1
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1
如果有多个vhost-user设备,需要为每个设备指定不同的chardev路径和id:
-chardev socket,id=char2,path=/usr/local/var/run/openvswitch/vhost-user-2
-netdev type=vhost-user,id=mynet2,chardev=char2,vhostforce
-device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet2
启用多队列支持:
-chardev socket,id=char2,path=/usr/local/var/run/openvswitch/vhost-user-2
-netdev type=vhost-user,id=mynet2,chardev=char2,vhostforce,queues=$q
-device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet2,mq=on,vectors=$v
其中,$q是队列的数量,$v是向量的数量($q * 2 + 2)。
添加vhost-user-client端口到交换机:
$ VHOST_USER_SOCKET_PATH=/path/to/socket
$ ovs-vsctl add-port br0 vhost-client-1 \
-- set Interface vhost-client-1 type=dpdkvhostuserclient \
options:vhost-server-path=$VHOST_USER_SOCKET_PATH
将vhost-user-client端口添加到虚拟机:
-chardev socket,id=char1,path=$VHOST_USER_SOCKET_PATH,server
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1
启用vhost IOMMU支持:ovs-vsctl set Open_vSwitch . other_config:vhost-iommu-support=true
启用vhost-user-client Post-copy Live Migration支持:ovs-vsctl set Open_vSwitch . other_config:vhost-postcopy-support=true
配置vhost-user-client的tx重试次数:ovs-vsctl set Interface vhost-client-1 options:tx-retries-max=0
设置vhost-user接口的XML配置示例:
<interface type='vhostuser'>
<mac address='00:00:00:00:00:01'/>
<source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser0' mode='client'/>
<model type='virtio'/>
<driver queues='2'>
<host mrg_rxbuf='on'/>
</driver>
</interface>
配置vhost-user-client接口的XML配置示例:
<interface type='vhostuser'>
<mac address='00:00:00:00:00:02'/>
<source type='unix' path='/usr/local/var/run/openvswitch/dpdkvhostuser1' mode='client'/>
<model type='virtio'/>
<driver queues='2'>
<host mrg_rxbuf='on'/>
</driver>
</interface>
/topics/dpdk/vdev
添加一个使用null DPDK PMD驱动的dpdk端口:ovs-vsctl add-port br0 null0 -- set Interface null0 type=dpdk options:dpdk-devargs=eth_null0
添加一个使用af_packet DPDK PMD驱动的dpdk端口:ovs-vsctl add-port br0 myeth0 -- set Interface myeth0 type=dpdk options:dpdk-devargs=eth_af_packet0,iface=eth0
/topics/dpdk/pmd
显示当前PMD线程统计信息:ovs-appctl dpif-netdev/pmd-stats-show
显示PMD线程的详细性能指标:ovs-appctl dpif-netdev/pmd-perf-show
启用PMD线程的详细性能指标:ovs-vsctl set Open_vSwitch . other_config:pmd-perf-metrics=true
清除先前的PMD线程统计信息:ovs-appctl dpif-netdev/pmd-stats-clear
显示PMD核心周期的端口/Rx队列分配和使用历史记录:ovs-appctl dpif-netdev/pmd-rxq-show
显示端口/Rx队列分配和最近5秒的使用历史记录:ovs-appctl dpif-netdev/pmd-rxq-show -secs 5
触发Rx队列到PMD的分配:ovs-appctl dpif-netdev/pmd-rxq-rebalance
手动将Rx队列固定到核心:ovs-vsctl set Interface <iface> other_config:pmd-rxq-affinity=<rxq-affinity-list>
启用具有固定Rx队列的非隔离PMD线程:ovs-vsctl set Open_vSwitch . other_config:pmd-rxq-isolate=false
设置自动将Rx队列分配给PMD的算法:ovs-vsctl set Open_vSwitch . other_config:pmd-rxq-assign=<assignment>
启用PMD的自动负载均衡:ovs-vsctl set open_vswitch . other_config:pmd-auto-lb="true"
设置PMD自动负载均衡的负载阈值:ovs-vsctl set open_vswitch . other_config:pmd-auto-lb-load-threshold="70"
设置PMD自动负载均衡的方差改进阈值:ovs-vsctl set open_vswitch . other_config:pmd-auto-lb-improvement-threshold="40"
设置PMD自动负载均衡迭代之间的最小时间间隔:ovs-vsctl set open_vswitch . other_config:pmd-auto-lb-rebal-interval="<interval>"
启用基于PMD负载的睡眠:ovs-vsctl set open_vswitch . other_config:pmd-sleep-max=50
显示当前PMD基于负载的睡眠配置:ovs-appctl dpif-netdev/pmd-sleep-show
显示PMD线程的睡眠时间统计信息:ovs-appctl dpif-netdev/pmd-stats-clear && sleep 10 && ovs-appctl dpif-netdev/pmd-perf-show
请注意,上述代码中的<iface>和<rxq-affinity-list>是需要替换为实际的接口名称和Rx队列亲和性列表的占位符。
/topics/dpdk/qos
设置端口的出口限速(QoS):ovs-vsctl set port vhost-user0 qos=@newqos -- \
--id=@newqos create qos type=egress-policer other-config:cir=46000000 \
other-config:cbs=2048
查看端口的QoS配置:ovs-appctl -t ovs-vswitchd qos/show vhost-user0
清除端口和ovsdb中的QoS配置:ovs-vsctl destroy QoS vhost-user0 -- clear Port vhost-user0 qos
设置端口的入口限速(Rate Limiting):ovs-vsctl set interface vhost-user0 ingress_policing_rate=368000 \ ingress_policing_burst=1000
查看端口的入口限速配置:ovs-vsctl list interface vhost-user0
清除端口的入口限速配置:ovs-vsctl set interface vhost-user0 ingress_policing_rate=0
/topics/dpdk/jumbo-frames
添加DPDK物理端口并设置MTU为9000:
$ ovs-vsctl add-port br0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk
\ options:dpdk-devargs=0000:01:00.0 mtu_request=9000
修改已存在端口的MTU为6200: ovs-vsctl set Interface dpdk-p0 mtu_request=6200
设置vHost User端口的可合并缓冲区:
示例中的QEMU命令行片段如下:
$ -netdev type=vhost-user,id=mynet1,chardev=char0,vhostforce \
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1,mrg_rxbuf=on
如果virtio设备绑定到Linux内核驱动程序(即接口未绑定到宿主DPDK驱动程序),则还需要增加逻辑网络接口的MTU以避免在宿主中分段接收到的Jumbo Frames。注意,'MTU'仅指IP数据包的长度,而不是整个帧的长度。
计算标准IPv4帧的确切MTU时,从最大支持的帧大小中减去L2头和CRC长度(即18B)。因此,要设置9018B Jumbo Frame的MTU:ip link set eth1 mtu 9000
启用Jumbo Frames后,DPDK端口的mbuf段的大小会增加,以便在单个mbuf段中容纳特定大小的完整Jumbo Frame。Jumbo Frame支持已针对使用DPDK i40e驱动程序的Fortville NIC支持的最大帧大小9728B进行验证,但可能还支持更大的帧和其他DPDK NIC驱动程序。这些情况通常适用于仅涉及东西向流量的用例。
/topics/dpdk/memory
设置全局配置值:ovs-vsctl set Open_vSwitch . other_config:per-port-memory=true
设置共享内存配置:ovs-vsctl ovs-vsctl --no-wait set Open_vSwitch . \
other_config:shared-mempool-config=9000,1500:1,6000:1