先前做的转发核热扩容,简单分析下该功能在OVS-DPDK中是如何实现的
说明
OVS-DPDK热扩容实现,即OVS-DPDK支持的动态调整转发核,该功能要求使用DPDK 20.08之后的版本
功能验证
1.使用DPDK接管网口
//默认只开一个队列
ovs-vsctl add-port br0 dpdk_port_1 -- set Interface dpdk_port_1 type=dpdk options:dpdk-devargs=0000:b1:00.0
2.查看当前转发核与网口队列
ovs-appctl dpif-netdev/pmd-rxq-show
3.查看OVS-DPDK配置以及ovs-vswitchd数据面线程结构
ovs-vsctl --no-wait get Open_vSwitch . other_config
其中pmd-cpu-mask即ovs-dpdk用于转发的pmd线程。-l所指定的lcore则并不是pmd线程,不做转发,实际应该是没啥用的(可以pstack或perf再结合代码确认)。-l参数应该也只是为了限制住master core的亲核性。
最好将其二者隔开,避免-l影响到pmd收发包线程(可参考:https://developers.redhat.com/blog/2017/06/28/ovs-dpdk-parameters-dealing-with-multi-numa#)。
4.修改网口队列数量(立即生效无需重启OVS-DPDK)
//该操作需要将网口stop后重新configure,所以会导致网络中断
ovs-vsctl set interface dpdk_port_1 options:n_rxq=4
5.修改pmd线程(立即生效无需重启OVS-DPDK)
//可以看到这时候pmd线程变成了3个,而多出的一个队列则被绑定在了另一个pmd core上
ovs-vsctl set Open_vSwitch . other_config:pmd-cpu-mask=0xE00000
实现代码分析
跟踪修改pmd线程代码,即可分析OVS-DPDK是如何实现的动态调整转发核
\->reconfigure_datapath
-->reconfigure_pmd_threads//利用glibc调整pmd线程
--->pmd_thread_main//子线程中运行的代
---->dpdk_attach_thread
----->rte_thread_register//将该子线程注册到dpdk lcore结构中
//再重新绑定转发核与网口队列:
\->port_reconfigure//port->need_reconfigure = true,pmd线程数量或网口队列改变,都会进到这里
-->netdev_reconfigure
--->netdev_dpdk_reconfigure
---->rte_eth_dev_stop//说明修改pmd线程或网口队列,在ovs-dpdk的实现中,都需要stop网口
总结
以上,便是OVS-DPDK中转发核热扩容功能相关的代码,那么OVS-DPDK的pmd线程是如何与DPDK启动解耦的?
答:DPDK在20.08后的版本,DPDK提供了一个API rte_thread_register,可以支持将未经过eal初始化的线程,也作为一个简单的pmd线程,OVS-DPDK则是利用此实现动态调整转发核。