Linux网卡RX/TX队列数设置不当的典型特征是:网络吞吐上不去但单个CPU核心持续100%占用,主要运行ksoftirqd/0或irq/xx-eth0等软中断线程,/proc/interrupts显示所有网卡中断绑定同一CPU,/proc/net/softnet_stat中time_squeeze频繁非零且dropped增长,ethtool -l显示队列数为1或远低于CPU核心数,导致软中断拥塞和丢包。

Linux 网卡 RX/TX 队列数设置不当,最典型的特征是:**网络吞吐上不去,但某个 CPU 核心持续 100% 占用,其余核心空闲,且该核心主要运行软中断(softirq)线程,如 ksoftirqd/0 或 irq/xx-eth0 类进程**。
软中断集中在单个 CPU 上
执行 top 或 htop 可观察到某一 CPU 使用率长期满载,而其他核负载极低;进一步用 cat /proc/interrupts 查看中断分布,会发现所有网卡中断(尤其是 rx 相关的 MSI/MSI-X 中断)都绑定在同一个 CPU 上。这是因为队列数为 1 或未启用多队列,导致所有数据包只能由一个硬件队列接收,进而触发单一 CPU 处理软中断。
netstat 或 nstat 显示大量 softirq 延迟
运行 watch -n 1 'cat /proc/net/softnet_stat',查看每行第二列(dropped 计数)是否持续增长,或第一列(processed)数值极高但第三列(time_squeeze)频繁非零——这表示该 CPU 的软中断处理不过来,反复被挤压,被迫丢包或延迟处理。配合 perf top -e irq:softirq_entry 也能确认 net_rx_action 占主导。
ethtool 显示队列数远低于 CPU 核心数
用 ethtool -l eth0 检查当前网卡支持的最大和实际配置的 RX/TX 队列数。常见错误包括:
• 当前设置为 Current hardware settings: RX: 1 TX: 1(默认值,尤其在老旧驱动或未调优场景)
• 虽然硬件支持 16 队列,但系统未启用 RSS(Receive Side Scaling)或未通过 ethtool -L 手动分配
• 驱动未加载多队列支持(如某些 virtio_net 未启用 multiqueue,或 igb/kvm 下未配 mq 模式)
网络性能与 CPU 利用率严重不匹配
例如千兆网卡实测吞吐仅 300 Mbps,却已将一个 CPU 核跑满;或万兆卡在 2 Gbps 流量下就触发持续丢包。此时用 iftop 或 ip -s link show eth0 查看 rx_dropped、tx_dropped 计数上升,而 rx_packets 增速明显放缓,说明数据包在进入协议栈前就被内核丢弃,根源正是单队列瓶颈引发的软中断拥塞。
本质是“一个队列 → 一个中断向量 → 绑定一个 CPU → 所有软中断串行处理”,打破这个单点瓶颈的关键,就是让队列数 ≥ CPU 核心数,并配合 RPS/RSS/rps_flow_cnt 均衡分发。










