我有一个路由器将流量从一个网络转发到另一个网络,我需要知道数据包队列(在接收端/接口 - rx)占用率何时接近其最大容量。
然而,在分析以下文件(linux文件系统)之后:
- tcp_mem/tcp_rmem/tcp_wmem在 /proc/sys/net/ipv4
- tx_queue_len在 /sys/class/net/(接口)
- 套接字状态在 /proc/net 中
我得出结论,只有当路由器是 TCP 数据包的目的地或来源时,这些文件才与我的问题相关。因此,正如我与一位教授讨论的那样,这些指标在转发情况下不相关,因为数据包不会进入 TCP 队列。
如果确实如此,那么如果有任何相关信息,我可以在哪里找到有关转发队列的当前占用情况及其最大占用情况的信息?
答案1
这个路由器 —— 是你的吗?它是仅使用 Linux 网络进行路由吗?如果是这样,你可能想用一个真正的路由器替换它,除非你知道你与其他网络的链接带宽很低。通用 Linux 机器并不是特别高效的路由器。碰巧运行 Linux 的真实路由器通常不会使用 Linux 网络作为快速路径,因此你列出的文件在这种情况下不会有帮助。如果这些文件在你的本地主机上而不是路由器上,那么它们将没有任何帮助。
如果它是真正的路由器,唯一有用的就是路由器提供的任何管理工具。大多数家用路由器不提供此信息。商用路由器可能会提供,但使用专有接口或 SNMP MIB。SNMP 接口 MIB 有一个输出队列长度条目,但它已被弃用,可能是因为实际情况比接口的单个数字更复杂(因为路由器通常按流而不是按接口排队。)也许有另一个 MIB 会有所帮助。
/sys/class/net/(interface)/tx_queue_len
是一个配置参数,告诉您本地系统上的最大队列长度(以数据包为单位)。除非您可以在路由器上看到它,并且您的路由器仅使用 Linux 网络,否则这没有帮助。
更复杂的是,TCP 使用各种方法(包括但不限于显式拥塞通知)来避免数据包在源和目标之间的路由器中缓冲。当它工作理想时,路径上任何路由器的最大拥塞平均为一个数据包!这样做的原因是,只要最繁忙的路由器始终有数据包准备就绪,最好在网络中缓冲最少的数据包。网络中的膨胀队列只会增加端到端延迟,而不会增加任何性能优势。这是显而易见的,但经过大量的科学和实验才得出这个结论。
因此,如果一切正常,您似乎正在尝试监视某个实际上应该始终最大为 1 的东西。(请注意,即使有许多不相关的 TCP 连接共享路径上的任何路由器,TCP 中的控制算法也能正常工作。当任何 TCP 实现未使用这些方法时,它们就会失败,而且遗憾的是,它们往往会通过节流并让占用者获得带宽而失败。)
所以,我的猜测是,你正在尝试做一些即使可能但没有什么成果的事情。
你可以做的一件事是定期 ping 另一端并对响应时间进行低通滤波。你不知道哪个方向正在经历拥塞,但当出现拥塞时你会得到线索。