排查linux网络延迟抖动时,需先检查硬中断分布是否失衡:执行cat /proc/interrupts | grep eth0,若某cpu核中断数远超其他核(如相差3倍以上),说明中断绑定不均;再查软中断net_rx是否过载,watch -n 1 'cat /proc/softirqs | grep net_rx'观察单核每秒增长是否超5000次,并用perf top验证net_rx_action是否主导及执行时间是否超1ms。

排查 Linux 网络延迟抖动时,系统中断响应速度是关键一环——它直接决定网卡收到数据包后能否被及时处理。中断响应慢会导致 RX 队列积压、包延迟入队、TCP ACK 滞后,最终表现为 RTT 剧烈波动,而非单纯延迟高。
查硬中断分布是否失衡
单核承载全部网卡中断是最常见瓶颈。执行:
cat /proc/interrupts | grep eth0
观察各 CPU 核上的中断计数。若某核数值远超其他核(例如相差 3 倍以上),说明中断绑定不均。常见于未启用 RSS 或 RPS 的场景。
建议检查:
- RSS 是否启用:ethtool -l eth0 查看 combined 队列数是否 >1
- RPS 是否配置:cat /sys/class/net/eth0/queues/rx-0/rps_cpus 是否为非零掩码(如 03 表示 CPU0 和 CPU1)
- 若为多队列网卡但未启用 RSS,需先用 ethtool -L eth0 combined N 开启(N 通常为 CPU 数)
看软中断(NET_RX)是否持续过载
硬中断触发后,实际包处理由软中断 NET_RX 完成。top 中 %si 高只是表象,需深入验证:
运行:watch -n 1 'cat /proc/softirqs | grep NET_RX'
关注该行数值每秒增长量。若单核上 NET_RX 超过 5000 次/秒且持续,已接近处理极限。
进一步确认影响范围:
- 用 perf top -e irq:softirq_entry --no-children 查看是否 net_rx_action 占主导
- 结合 vmstat 1 观察 cs(context switch)是否同步飙升,说明软中断频繁抢占调度
- 若 dmesg 出现 “watchdog: BUG: soft lockup”,表明软中断执行超时(默认 20 秒),必须立即干预
验证中断延迟与处理耗时
光看计数不够,要测真实响应延迟。推荐两个轻量方法:
① 使用 irqtop(需安装 perf 工具):
sudo perf top -e irq:softirq_entry,irq:softirq_exit -C 0
观察 net_rx_action 的平均执行时间。超过 1ms 即属异常,超过 5ms 会显著拖慢 TCP 流控。
② 抓取典型请求路径:
- 在业务请求期间运行:perf record -e 'irq:softirq_entry,syscalls:sys_enter_recvfrom' -C 0 -g -- sleep 5
- 然后 perf script | grep -A 5 -B 2 "net_rx",看 recvfrom 是否被 net_rx_action 长时间阻塞
若发现软中断处理耗时长 + 硬中断扎堆,基本可断定:本机中断处理能力已达瓶颈,抖动根源不在链路,而在内核收包路径。











