Azure 关闭空闲网络连接

Azure 关闭空闲网络连接

我在单实例 Windows Server 2k8R2 Azure VM 上运行专有客户端/服务器应用程序。

客户端非常依赖与服务器的连接。但是,如果我几分钟内没有任何活动,Azure 端的某些东西就会强制关闭连接(据我从日志中得知)。我不确定这是 Azure 本身的功能还是 Windows 的功能。

除了实现某种保持活动功能(由于该软件是专有的,所以我无法实现)之外,还有其他方法可以延长此超时时间吗?

我已经看到过几次关于改变空闲超时以实现负载平衡情况的参考,但这只是一个实例。

提前致谢!

答案1

您遇到了虚拟机前面的软件负载均衡器的设计问题。默认情况下,它会在 4 分钟后关闭所有空闲连接,但您可以将超时时间配置为 4 到 30 分钟之间的任何时间:

可配置 Azure 负载均衡器的空闲超时

但是,无论是在基础设施方面还是在应用程序方面,拥有某种类型的 Keepalive 都是一个好习惯。它能为您省去很多麻烦。

编辑以添加 Azure 现在支持空闲连接上的 TCP 重置

答案2

Azure VM 的 TCP 设置

Azure VM 使用 NAT(网络地址转换)与公共 Internet 通信。NAT 设备为 Azure VM 分配公共 IP 地址和端口,允许该 VM 建立套接字以与其他设备通信。如果数据包在特定时间后停止流经该套接字,则 NAT 设备将终止映射,并且该套接字可供其他 VM 自由使用。

这是一种常见的 NAT 行为,可能会导致基于 TCP 的应用程序出现通信问题,因为这些应用程序希望套接字在超时期限后仍能保持。对于处于已建立连接状态的会话,有两个空闲超时设置需要考虑:

通过 Azure 负载均衡器进行入站。此超时默认为 4 分钟,最多可调整为 30 分钟。使用 SNAT(源 NAT)进行出站。此超时设置为 4 分钟,无法调整。为确保连接不会在超时限制后丢失,您应确保您的应用程序保持会话处于活动状态,或者您可以配置底层操作系统来执行此操作。Linux 和 Windows 系统要使用的设置不同,如下所示。

对于 Linux,您应该更改下面的内核变量。net.ipv4.tcp_keepalive_time = 120 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 8

对于 Windows,您应该更改以下注册表值。KeepAliveInterval = 30 KeepAliveTime = 120 TcpMaxDataRetransmissions = 8

上述设置可确保在空闲时间 2 分钟(120 秒)后发送一个保持活动数据包,然后每 30 秒发送一次。如果其中 8 个数据包失败,则会话将被丢弃。

来源:https://github.com/wbuchwalter/azure-content/blob/master/includes/guidance-tcp-session-timeout-include.md

相关内容