8.3. 数据包接收概述
为更好地分析网络瓶颈和性能问题,您需要直到数据包接收的原理。数据包接收对网络性能调节来说很重要,因为接收路径是经常会丢帧的地方。在接收路径丢帧可能会造成对网络性能的极大负面影响。
图 8.1. 网络接收路径图表
Linux 内核接收每一帧,并将其送入四步处理过程:
- 硬件接收:网卡(NIC)接收传送的帧。根据其驱动程序配置,NIC 可将帧传送到内部硬件缓冲内存或者指定的环缓存。
- Hard IRQ:NIC 通过中断 CPU 插入网络帧。这样可让 NIC 驱动程序意识到该中断并调度 soft IRQ 操作。
- Soft IRQ:这个阶段采用实际接收进程,并在
softirq
环境中运行。就是说这个阶段会预先清空所有在指定 CPU 中运行的程序,但仍允许插入 hard IRQ。在这个环境中(与 hard IRQ 在同一 CPU 中运行,以便尽量减少锁定消耗),该内核会删除 NIC 硬件缓存以及它通过网络栈的进程中的帧。从那里开始,可将帧转发、忽略或者传递给目标侦听插槽。传递给插槽后,该帧就会被附加到拥有该插槽的程序中。这个过程会以互动方式进行直到 NIC 硬件缓存超出帧外,或者直到达到设备加权(dev_weight
)。有关设备加权的详情请参考 第 8.4.1 节 “NIC 硬件缓冲”。 - 程序接收:程序接受帧并使用标准 POSIX 调用(
read
,recv
,recvfrom
)从任意拥有的插槽中退出队列。此时从网络中接收到的数据不再存在于网络栈中。
CPU/缓存亲和性
要维护接收路径的高流量,建议您让 L2 缓存处于热状态。如前所述,网络缓冲由作为 IRQ 的显示其存在的同一 CPU 接收。就是说该缓存数据将位于接收 CPU 的 L2 缓存中。
要利用这个功能,请在要接收共享 L2 缓存同一核的 NIC 中的大多数数据的程序中配置进程亲和性。这样可已最大化缓存成功率,并籍此提高性能。