虚拟交换机本身不提供动态队列分配,该功能由物理网卡驱动、linux内核qdisc(如mq/sfq/prio)、rps/rfs及virtio-net多队列协同实现,需在宿主机、vswitch和虚拟机侧联合配置。
虚拟交换机本身不直接提供“动态队列分配机制”这一功能,它不主动调度或分配硬件队列;真正承担队列管理、流量整形与调度的是底层物理网卡驱动、宿主机操作系统(如 linux 内核)的 qdisc 机制、以及虚拟化平台的网络栈策略。所谓“虚拟交换机的动态队列分配”,实质是在虚拟化环境中协同配置多队列网卡(rss / rps / rfs)、tc(traffic control)调度器、vswitch 队列绑定策略及虚拟机网卡参数,从而实现流量按流/按优先级动态分发到不同软硬队列。
下面从四个关键环节说明如何配置和协同实现该机制:
虚拟交换机需启用多队列支持
主流虚拟交换机(如 Open vSwitch、Linux Bridge、VMware vDS、Hyper-V vSwitch)必须配合多队列网卡使用:
- 确保物理网卡支持 MSI-X 和多接收队列(如
ethtool -l eth0查看Current hardware settings中RX: N) - 启用网卡多队列:
ethtool -L eth0 rx N tx N(N 通常 ≤ CPU 核数) - OVS 示例:创建支持多队列的 datapath 并绑定多个 vhost-user 接口(用于 DPDK 场景),或启用
n_rxq=8参数启动 ovs-vswitchd - VMware ESXi:在 vSwitch 或 dvSwitch 上启用 “Network I/O Control (NIOC)” 并为端口组配置 shares/limit/reservation
宿主机内核层配置 RPS/RFS 实现软件队列负载均衡
当物理网卡未开启 RSS(或 RSS 哈希能力受限)时,由内核接管软中断分发:
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
- 开启 RPS(Receive Packet Steering):向
/sys/class/net/eth0/queues/rx-*/rps_cpus写入 CPU 掩码(如echo f > rps_cpus表示前4核参与) - 启用 RFS(Receive Flow Steering)提升缓存局部性:设置
net.core.rps_sock_flow_entries=32768,并配置rps_flow_cnt - 这让同一 TCP 流始终被同一 CPU 处理,减少跨核 cache miss,间接实现“动态按流分配队列”
使用 TC + 多队列调度器(如 MQ、HTB+SFQ)做策略化分流
Linux 的 tc 是实现动态队列行为的核心工具:
- 绑定多队列 qdisc:
tc qdisc add dev eth0 root handle 1: mq(自动为每个硬件 RX 队列映射一个子 qdisc) - 为各子队列配置不同策略:
-
tc qdisc add dev eth0 parent 1:1 handle 10: sfq(子队列1用 SFQ 公平调度) -
tc qdisc add dev eth0 parent 1:2 handle 20: prio(子队列2用优先级队列)
-
- 结合
tc filter按 DSCP、端口、协议等字段将流量重定向至指定子队列
虚拟机侧协同:启用 virtio-net 多队列与 vCPU 绑定
避免虚拟机内部成为瓶颈:
- KVM 启动时添加多队列参数:
<interface type="network"><model type="virtio"></model><driver name="vhost" queues="4"></driver></interface>
- 在虚拟机内启用多队列:
ethtool -L eth0 combined 4(需内核支持VIRTIO_NET_F_MQ) - 将 virtio-net 的中断亲和性绑定到专用 vCPU(通过
/proc/interrupts+smp_affinity_list设置),使每个 RX 队列对应固定 vCPU
不复杂但容易忽略









