超过心跳间隔的客户端重连接导致额外的License消耗

博客描述了一个客户端应用程序在失去和恢复网络连接时与许可证服务器交互的问题,导致额外的许可证消耗。当客户端重新连接时,服务器无法正确签入许可证。提出的解决方法包括调整客户端的LM_A_TCP_TIMEOUT值和修改服务器的TCP属性。虽然在最新版本中进行了部分修复,但问题并未完全解决。解决方案包括心跳超时设置和TCP保持活动配置,以减少许可证被占用的情况。
摘要由CSDN通过智能技术生成

描述

当客户端应用程序失去网络连接但又重新获得时,许可证服务器上的套接字仍处于打开状态,并且在应用程序重新连接(并消耗额外的许可证)然后干净地退出后,其他用户无法使用该许可证。

复制场景

- 设置客户端/服务器系统(在不同的机器上)并签出许可证

- 在服务器上使用 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值