DPDK通过用户态轮询收包绕过内核中断路径,彻底消除NET_RX软中断;实测万兆网卡64字节小包场景下软中断占用从90%+降至接近0%,核心是禁用内核datapath、绑定PMD线程至隔离物理核、启用多队列并禁用conntrack等内核开销。
虚拟交换机在高并发场景下软中断飙升,本质是内核收包路径扛不住流量压力——网卡每收一个包就触发一次硬中断,再经软中断(softirq)处理、进协议栈、再交给用户态进程(如 ovs-vswitchd),小包场景下每秒百万级中断直接把 cpu 拖垮。这不是配置问题,而是架构瓶颈。优化核心思路只有一个:绕过内核中断收包路径。
关掉内核 datapath,启用 DPDK 用户态转发
默认 OVS 依赖内核模块 openvswitch.ko,所有包都走内核协议栈,软中断(NET_RX)必然暴涨。DPDK 方案彻底跳过这一步:网卡绑定到 UIO 或 VFIO 驱动,由用户态 PMD 线程轮询收包,不触发任何中断。实测中,万兆网卡跑 64 字节小包,软中断占用从 90%+ 降到接近 0%。
- 必须用支持 DPDK 的网卡驱动(如
igb_uio或vfio-pci),禁用原生内核驱动(ixgbe等) - OVS 编译时需显式开启 DPDK 支持:
./configure --with-dpdk=/path/to/dpdk - 启动 ovs-vswitchd 时指定 DPDK 参数:
--dpdk -c 0x3 -n 4 --socket-mem 1024,0 --vdev=net_pcap0,iface=eth0
绑定 PMD 线程到独占物理核,关闭超线程
PMD(Poll Mode Driver)线程负责轮询网卡队列,若和其他业务线程共享 CPU 核,会因调度抖动导致收包延迟升高、甚至丢包。软中断虽已消失,但 PMD 若被抢占,性能一样崩。
直播话术巡检系统(Windows版) — 实时语音转写、关键词检测、场景自动切换、告警推送、大屏可视化。支持 Windows VB-Cable 虚拟声卡音频采集,阿里云 ASR 实时识别。一键启动脚本,自动安装环境。
- 用
taskset或isolcpus内核参数隔离出专用物理核(例如 2–5 号核),只跑 PMD 和 vhost-user 线程 - BIOS 中关闭超线程(Hyper-Threading),避免同一物理核上两个逻辑核争抢缓存和执行单元
- OVS 启动后检查 PMD 绑定状态:
ovs-appctl dpif-netdev/pmd-stats-show,确认每个 PMD 线程绑定唯一 core 且无迁移
调大网卡多队列并均分到各 PMD
单队列网卡只能由一个 PMD 处理,无法水平扩展;多队列才能让多个 PMD 并行工作。但若队列数 > PMD 数,部分队列会空转;若队列数
- 先查网卡支持队列数:
ethtool -l eth0,然后用ethtool -L eth0 combined N设置(N 通常取物理核数) - OVS 中为该端口设置 PMD 分配:
ovs-vsctl set Interface phy0 options:n_rxq=N - 验证队列负载均衡:
ovs-appctl dpif-netdev/pmd-rxq-show,各 rxq 应均匀分配到不同 PMD
禁用干扰性内核功能,减少上下文切换
即使用了 DPDK,若系统仍频繁触发其他软中断(如定时器、ksoftirqd、netfilter),仍会间接影响 PMD 调度稳定性。
- 关闭 RPS/RFS:
echo 0 > /sys/class/net/eth0/queues/rx-0/rps_cpus(DPDK 不需要) - 禁用 conntrack:
sysctl -w net.netfilter.nf_conntrack_enable=0,避免连接跟踪占用 softirq - 关闭透明大页(THP):
echo never > /sys/kernel/mm/transparent_hugepage/enabled,防止内存分配抖动干扰 PMD 实时性

















