超过心跳间隔的客户端重连接导致额外的License消耗
Posted 王万林 Ben
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超过心跳间隔的客户端重连接导致额外的License消耗相关的知识,希望对你有一定的参考价值。
描述
当客户端应用程序失去网络连接但又重新获得时,许可证服务器上的套接字仍处于打开状态,并且在应用程序重新连接(并消耗额外的许可证)然后干净地退出后,其他用户无法使用该许可证。
复制场景
- 设置客户端/服务器系统(在不同的机器上)并签出许可证
- 在服务器上使用 lmstat 确认许可证已签出
- 拔掉客户端的网线
- 至少等待一次心跳(通常为两分钟)
- 重新插入电缆并注意(从供应商日志中)已签出第二个许可证。
- 使用 lmstat 确认签出两个许可证
- 退出客户端应用程序并确认只签入了一个许可证。
- 使用 lmstat 确认一个许可证被签出,即使 1 小时后。
根本原因:
在网络断开期间,客户端到服务器的心跳失败并出现网络错误。因此,客户端断开与守护程序的连接,当网络恢复时,它会创建一个新连接并再次发送该功能的结帐请求。由于这是一个不同的连接,服务器会对该功能进行额外的检查。该功能的附加许可永远不会被客户端收回,因为它不知道这一点,并且当客户端退出时,许可将永远存在。
以防万一,如果客户端在网络断开之前签出了 n 个许可证,则所有 n 个许可证都将保留在服务器中。
解决方法
>> 第一个解决方法减少 LM_A_TCP_TIMEOUT 值(由客户端设置,服务器在决定客户端断开连接并重新检查许可证之前等待的时间)。我们建议使用此公式根据心跳设置计算超时:
LM_A_TCP_TIMEOUT = (LM_A_CHECK_INTERVAL x 2) + LM_A_RETRY_COUNT x LM_A_RETRY_INTERVAL + 一分钟缓冲。
举个例子,:
1.) 将 LM_A_CHECK_INTERVAL 设置为 30 秒,
2.) LM_A_RETRY_COUNT 到 2 和
3.) LM_A_RETRY_INTERVAL 到 30 秒
将导致 LM_A_TCP_TIMEOUT 为 3 分钟。
由于默认的 LM_A_TCP_TIMEOUT 是 2 小时,这显着降低了许可证服务器阻止许可证的可能性——要发生这种情况,客户端必须在 3 分钟内重新连接。
此解决方法的缺点是:
1. 没有完全解决这个问题(但确实大大减少了发生)
2. 需要客户端更新
解决方法的结果是客户端在 3 分钟后重新连接(使用上面的示例)将不得不再次签出许可证,即使它们设法在同一套接字上重新连接也是如此。
>> 第二种解决方法是编辑服务器操作系统 TCP 属性:
编辑/创建 KeepAliveTime、KeepAliveInterval 和 TcpMaxDataRetransmission 注册表值,如 HKLM\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters 中所设置(请参阅http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html 上的等效项Linux)。
因此,如果我们将 KeepAliveTime 设置为 600 秒,KeepAliveInterval 设置为 60 秒,TcpMaxDataRetransmission 设置为 3,则服务器将等待 600 秒,然后每 60 秒
向客户端发送 3 次心跳探测。之后,服务器认为连接断开。第二种解决方法的缺点是,这会为服务器上运行的所有进程配置 TCP 属性。
如果许可证服务器是在服务器上运行的唯一生产进程,例如,如果服务器通过在 VM 中运行而被隔离,则这应该没问题。
版本修复
上述问题已在 FNP 11.18.3.0 (2021 R4) 中修复,因此您可以在我们的最新版本中运行快速测试。(FNP-18904)
作为此修复的一部分,我们引入了供应商变量“ls_server_override_client_tcp_timeout”以覆盖服务器端的 LM_A_TCP_TIMEOUT 值。断开的客户端连接在“ls_server_override_client_tcp_timeout”超时期限后在服务器端被清除,并且许可证被重新签入。我们还启用 TCP keepalive,这样如果应用程序在一段时间后未能关闭它,TCP 堆栈也会清除断开的连接。
因此,要使修复生效,您需要在 lsvendor.c 中设置此变量的值 ls_server_override_client_tcp_timeout=300 并重建服务器。
实际上根据评论区,本版本修复也只是Workaround,并未真正修复。
参考资料
Additional license consumed on client reconnection post heartbeat interval - Community
以上是关于超过心跳间隔的客户端重连接导致额外的License消耗的主要内容,如果未能解决你的问题,请参考以下文章