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之前的数据排队位置。
性能关注点¶
- 中断是否打到正确 CPU。
- NAPI 是否被 budget 限制。
- 是否进入
ksoftirqd,导致调度延迟。 - socket receive buffer 是否积压。
- 用户态是否及时 drain 数据。
观测与调试¶
面试高频问题¶
epoll 返回慢可能慢在哪里¶
不一定是 epoll 本身慢。可能是包还在 NIC ring、softirq 没处理、socket 队列积压、线程被调度走、或者用户态处理太慢。回答时要按路径逐层排查。