了解 TCP 动态
Understanding TCP dynamics
我遇到的情况:
我们有一个连接到 rabbitmq 服务器的应用程序服务器。
随着时间的推移,来自 rabbitmq 服务器的 ESTABLISHED 连接数量增加,但来自应用服务器的计数保持相当稳定。
我运行这两个:
root@app01:~# netstat -ant | grep EST | grep 5672 | grep 172.25.12.48
tcp 0 0 172.25.12.48:50587 10.48.64.230:5672 ESTABLISHED
tcp 0 0 172.25.12.48:50588 10.48.64.230:5672 ESTABLISHED
root@rabbit01:~# netstat -ant | grep EST | grep 5672 | grep 172.25.12.48
tcp6 0 0 10.48.64.230:5672 172.25.12.48:38408 ESTABLISHED
tcp6 0 0 10.48.64.230:5672 172.25.12.48:50588 ESTABLISHED
tcp6 0 0 10.48.64.230:5672 172.25.12.48:33491 ESTABLISHED
tcp6 0 0 10.48.64.230:5672 172.25.12.48:50587 ESTABLISHED
tcp6 0 0 10.48.64.230:5672 172.25.12.48:34541 ESTABLISHED
示例结果将在应用程序服务器上给出 6,在 rabbitmq 服务器上给出 15(甚至高达 46)。
我重新启动了 rabbitmq 服务器,显然一切都恢复正常了,每边 2 个连接。
我假设要么是交换机连接超时,要么是应用程序不正常地终止了进程。我正在研究这个,但我想更好地了解 TCP 行为。
rabbitmq 服务器上的当前设置:
tcp_retries1 设为 3
tcp_retries2 设为 15
因此,如果我对论坛的理解正确的话,我通常希望看到那些 'invalid' 连接在大约 13-30 分钟后断开。
然而,查看 tcp keepalive 值:
tcp_keepalive_time 设置为 7200(因此 2 小时后它将发送第一个 keepalive 探测。)
tcp_keepalive_intvl 是 75(所以在第一个 75 秒后,它会重新发送一个探测。)
tcp_keepalive_probes 是 9(所以它总共会发送 9 个探测)
因此,keepalive 过程将花费 7200+(9*75)=7875,或关闭前大约 2 小时 11 分钟。
由于连接(大概)消失了,这导致了两个问题。
1. 哪个是正确的?
2. 除了可能导致这些无效连接的开关或应用程序异常终止之外,我是否还缺少其他选项?
来源:https://www.frozentux.net/ipsysctl-tutorial/chunkyhtml/tcpvariables.html
我们的 F5 是造成这种情况的原因。
似乎在空闲超时后,F5 从其表中删除条目。因此,来自应用程序服务器的连接无效,TCP 将关闭它们。
但是,从 rabbitmq 服务器来看,连接仍然是有效连接。
虽然我不明白为什么交换机有能力保持连接状态有效——但是,这就是原因。
我遇到的情况: 我们有一个连接到 rabbitmq 服务器的应用程序服务器。 随着时间的推移,来自 rabbitmq 服务器的 ESTABLISHED 连接数量增加,但来自应用服务器的计数保持相当稳定。
我运行这两个:
root@app01:~# netstat -ant | grep EST | grep 5672 | grep 172.25.12.48
tcp 0 0 172.25.12.48:50587 10.48.64.230:5672 ESTABLISHED
tcp 0 0 172.25.12.48:50588 10.48.64.230:5672 ESTABLISHED
root@rabbit01:~# netstat -ant | grep EST | grep 5672 | grep 172.25.12.48
tcp6 0 0 10.48.64.230:5672 172.25.12.48:38408 ESTABLISHED
tcp6 0 0 10.48.64.230:5672 172.25.12.48:50588 ESTABLISHED
tcp6 0 0 10.48.64.230:5672 172.25.12.48:33491 ESTABLISHED
tcp6 0 0 10.48.64.230:5672 172.25.12.48:50587 ESTABLISHED
tcp6 0 0 10.48.64.230:5672 172.25.12.48:34541 ESTABLISHED
示例结果将在应用程序服务器上给出 6,在 rabbitmq 服务器上给出 15(甚至高达 46)。 我重新启动了 rabbitmq 服务器,显然一切都恢复正常了,每边 2 个连接。
我假设要么是交换机连接超时,要么是应用程序不正常地终止了进程。我正在研究这个,但我想更好地了解 TCP 行为。
rabbitmq 服务器上的当前设置:
tcp_retries1 设为 3
tcp_retries2 设为 15
因此,如果我对论坛的理解正确的话,我通常希望看到那些 'invalid' 连接在大约 13-30 分钟后断开。
然而,查看 tcp keepalive 值:
tcp_keepalive_time 设置为 7200(因此 2 小时后它将发送第一个 keepalive 探测。)
tcp_keepalive_intvl 是 75(所以在第一个 75 秒后,它会重新发送一个探测。)
tcp_keepalive_probes 是 9(所以它总共会发送 9 个探测)
因此,keepalive 过程将花费 7200+(9*75)=7875,或关闭前大约 2 小时 11 分钟。
由于连接(大概)消失了,这导致了两个问题。
1. 哪个是正确的?
2. 除了可能导致这些无效连接的开关或应用程序异常终止之外,我是否还缺少其他选项?
来源:https://www.frozentux.net/ipsysctl-tutorial/chunkyhtml/tcpvariables.html
我们的 F5 是造成这种情况的原因。 似乎在空闲超时后,F5 从其表中删除条目。因此,来自应用程序服务器的连接无效,TCP 将关闭它们。 但是,从 rabbitmq 服务器来看,连接仍然是有效连接。 虽然我不明白为什么交换机有能力保持连接状态有效——但是,这就是原因。