ovs中断驱动
1.数据包到达网卡 → 2. 网卡触发硬件中断通知CPU → 3. CPU 暂停当前任务,执行中断处理程序(ISR)→ 4. ISR 将数据包从网卡缓冲区DMA复制到内核内存(sk_buff) → 5. 唤醒协议栈处理线程(如软中断 softirq)→ 6. 协议栈处理数据包 → 7. 数据传递到上层应用。
ovs-dpdk
DPDK 是一个用户态的数据平面开发工具包,通过绕过 Linux 内核网络栈,直接访问网卡硬件,显著提高数据包处理性能。
传统的处理是中断驱动的,当数据包到达时,硬件网卡(NIC)会中断内核。引入中断处理、上下文切换和数据拷贝额外开销(CPU)。
- DPDK 绕过内核通过pmd线程在用户态直接访问网卡缓冲区,避免数据拷贝。
- PMD 线程主动轮询队列替代中断驱动,避免中断处理、上下文切换和数据拷贝额外开销。
- 独占 CPU 核可以确保 PMD 线程持续检查队列,及时处理数据包,
- 使用大页内存提高 CPU 缓存命中率,提升内存访问性能。
- 支持多队列,可以将数据包分发到多个CPU核心上并行处理,充分利用多核处理器的能力。
- 硬件加速主机测的网络数据流卸载到硬件网卡提升转发性能并降低主机侧CPU占用率。
pmd进程
pmd 进程主要用于多核环境下,通过轮询模式高效地处理数据包。
ovs-vswitchd里。在添加dpdk端口或者ovs启动(已添加dpdk端口)的时候,会触发创建pmd_thread_main线程。通过pmd_thread_setaffinity_cpu设置线程绑定的lcore,然后通过for循环各个端口,执行dp_netdev_process_rxq_port处理端口的数据包:
ovs选路fastpath和slowpath
fastpath:通过ovs datapath直接转发的路径称为fast-path。
slowpath:通过ovs-vswitchd查找OpenFlow实现转发的路径称为slow-path。
OVS的设计思路就是通过slow-path和fast-path的配合使用,完成网络数据的高效转发。当一个网络连接的第一个网络数据包(首包)被发出时,OVS内核模块会先收到这个数据包。但是内核还不知道如何处理这个包,因为所有的OpenFlow都存在ovs-vswitchd,默认将这个包上送到ovs-vswitchd。ovs-vswitchd通过OpenFlow的pipeline,处理完数据包送回给OVS内核模块,同时,ovs-vswitc