我在单实例 Windows Server 2k8R2 Azure VM 上运行专有客户端/服务器应用程序。
客户端非常依赖与服务器的连接。但是,如果我几分钟内没有任何活动,Azure 端的某些东西就会强制关闭连接(据我从日志中得知)。我不确定这是 Azure 本身的功能还是 Windows 的功能。
除了实现某种保持活动功能(由于该软件是专有的,所以我无法实现)之外,还有其他方法可以延长此超时时间吗?
我已经看到过几次关于改变空闲超时以实现负载平衡情况的参考,但这只是一个实例。
提前致谢!
答案1
您遇到了虚拟机前面的软件负载均衡器的设计问题。默认情况下,它会在 4 分钟后关闭所有空闲连接,但您可以将超时时间配置为 4 到 30 分钟之间的任何时间:
但是,无论是在基础设施方面还是在应用程序方面,拥有某种类型的 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 个数据包失败,则会话将被丢弃。