跳转至

NIC 到用户态路径

是什么 / 解决什么问题

理解包从网卡到用户态的路径,是排查网络延迟、丢包和 CPU 分布问题的基础。交易系统里的行情和订单路径经常要把这条链路拆开分析。

接收路径概览

NIC
  -> DMA 写入 RX ring
  -> 硬中断或中断合并
  -> NAPI poll
  -> skb 分配/填充
  -> 协议栈处理 IP/TCP/UDP
  -> socket receive queue
  -> epoll/read/recvmsg 进入用户态

关键数据结构

  • RX/TX descriptor ring:网卡和驱动共享的收发队列。
  • DMA buffer:网卡直接写内存。
  • skb:Linux 网络栈中的 packet 表示。
  • socket receive queue:用户态 recv 之前的数据排队位置。

性能关注点

  1. 中断是否打到正确 CPU。
  2. NAPI 是否被 budget 限制。
  3. 是否进入 ksoftirqd,导致调度延迟。
  4. socket receive buffer 是否积压。
  5. 用户态是否及时 drain 数据。

观测与调试

cat /proc/interrupts
cat /proc/net/softnet_stat
ss -tinp
ethtool -S <iface>

面试高频问题

epoll 返回慢可能慢在哪里

不一定是 epoll 本身慢。可能是包还在 NIC ring、softirq 没处理、socket 队列积压、线程被调度走、或者用户态处理太慢。回答时要按路径逐层排查。