跳转至

NAPI 与 softirq

是什么 / 解决什么问题

NAPI 是 Linux 网络驱动常用的收包机制。它在低流量时依赖中断,在高流量时切换成 poll,减少每包一次中断的成本。

工作模型

packet arrives
  -> NIC interrupt
  -> driver disables RX interrupt
  -> schedule NAPI poll
  -> softirq polls packets up to budget
  -> if drained, re-enable interrupt

softirq 与 ksoftirqd

网络包通常在 NET_RX softirq 中处理。如果 softirq 处理时间太长,内核可能把后续工作交给 ksoftirqd/N 线程。进入 ksoftirqd 后就受普通调度影响,尾延迟可能变差。

关键指标

cat /proc/net/softnet_stat
cat /proc/softirqs
top -H | grep ksoftirqd

softnet_stat 可用于观察 dropped、time squeeze 等问题。具体列含义和内核版本有关,排查时要结合源码或发行版文档确认。

调优方向

  1. 调整网卡队列和 RSS,让流量分布合理。
  2. 绑定 IRQ 到合适 CPU。
  3. 避免业务线程和高频 softirq 抢同一个核心。
  4. 检查应用是否及时读取 socket。
  5. 对极低延迟场景评估 busy poll 或 kernel bypass。

面试高频问题

中断越少越好吗

不是。中断合并能提高吞吐、降低 CPU 开销,但也会引入等待时间。低延迟场景通常要在 CPU 成本和单包延迟之间取舍。