8.4.2. 插槽队列

和 NIC 硬件队列一样,插槽队列是由来自 softirq 上下文的网络栈填充。然后程序通过调用清空其对应插槽的队列以便进行 readrecvfrom 等等。
要监控这个队列的状态请使用 netstat 程序。Recv-Q 列显示队列大小。一般来说对插槽队列中的超限运转的处理与对 NIC 硬件缓冲超限运转的处理相同(例如:第 8.4.1 节 “NIC 硬件缓冲”):
输入流量
第一个方法是延缓输入流量,方法为填充队列配置速度。具体步骤可以是过滤帧或者抢先丢掉它们。您还可以通过降低 NIC 的设备加权[6]延缓输入流量。
队列深度
您还可以通过增大队列深度避免插槽队列超限运转。方法是增大 rmem_default 内核参数或者 SO_RCVBUF 插槽选项值。有关详情请参考 第 8.2 节 “优化的网络设置”
程序调用频率
尽可能优化程序以便更频繁地执行调用。这包括修改或者重新配置网络程序以便执行更频繁的 POSIX 调用(比如 recvread)。反过来,这也可以让程序更快地排空队列。
很多管理员更喜欢使用增加队列深度的方法。这是最简单的解决方案,但并不总是能够长期使用。因为联网技术发展迅速,插槽队列将继续以更快的速度填充。随着时间的推移这意味着要相应重新调整队列深度。
最好的解决方法是提高或者将程序配置为更迅速地从内核中排空数据,即使需要让数据在程序空间排队也无妨。这样数据的保存就变得更灵活,因为可以根据需要置换出数据或者缓存到页中。


[6] 设备加权是由 /proc/sys/net/core/dev_weight 控制。有关设备加权以及调整它的方法详情请参考 第 8.4.1 节 “NIC 硬件缓冲”

为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。