据我所知,当主机尝试与另一台服务器建立大量连接并且会话耗尽所有可用的临时端口时,就会发生端口耗尽的情况。例如
192.168.1.1:端口 -> 10.20.30.40:443
这似乎并不常见,但对于负载均衡器来说这是一个问题。我的问题是,有没有办法在负载均衡器即将接近时提前收到警告?
我知道我可以使用 netstat 来获取所有连接,但如果有数万个连接。运行命令、对目标进行排序并计算共享相同客户端 IP、服务器 IP 和服务器端口的连接数将需要相当多的资源。并定期执行此操作。
有没有更简单的方法?由于 TCP 堆栈正在分配端口,它能否以某种方式知道它在散列未使用的端口时遇到问题并生成错误或日志?
答案1
您可以使用 bpftrace 编写一个 bpf 软件来监视所有连接的打开和关闭,并维护每个客户端、服务器、服务器端口组合的计数器。这对于用例来说似乎过于复杂。对 /proc/net/tcp{,6}(与 netstat 显示的相同数据)进行切片和切块似乎相当快,并且肯定会在亚秒时间内在具有数万个连接的机器上完成。
答案2
如果您只是输入 netstat,那么是的,具有数千个连接的系统或设备将占用一些资源。它将尝试解析所有这些 IP!当您观察连接时,使用 netstat -n(仅 IP,不要尝试解析它们),然后您可以简单地计算连接数或特定端口数……无论什么。您可以通过多种方式实现这一点,具体取决于您想要投入多少精力。BPF、DTrace、一个简单的 CLI 东西、SNMP 计数器。真的很花哨,用 perl/python/winnebago 或其他什么来做。大多数负载平衡器在开始崩溃时都有一个限制。完全取决于您正在使用什么以及它是如何被使用的。话虽如此,但 TCP 堆栈只有一定数量的端口可用。65,535 之后,您就完成了!有些系统会让您分配任意高端口,有些网络会盲目转发它们无法解析或理解的任何内容(即到 1.1.1.1:239321232 的 TCP 连接)。很有趣!