r-RServe配置选项keep.alive疑难解答



我在无头RHEL 7.9虚拟机上使用RServe 1.7.3。在客户端上,我使用的是RserveCLI2。

在长时间运行的作业中,TCP/IP连接会在2小时后被防火墙阻塞。

我发现了keep.alive配置选项,该选项自RServe 1.7.2(RServe News/Changelog(起就可用。

规格显示:

添加了对keep.alive配置选项的支持-它是全局的所有服务器,如果已启用,则指示客户端套接字保留通过周期性消息激活连接。

我向/etc/Rserv.conf:添加了以下内容

keep.alive enable

但这并不能防止连接被阻塞。

不幸的是,我无法运行像Wireshark这样的网络监控工具来监控客户端和服务器之间的流量。

如何解决此问题?

我有一些具体的问题:

  1. 配置文件的路径确实是/etc/Rserv.conf吗?如Rserve文档中所指定?请注意,它没有最终的e,就像Rserve一样
  2. 这种行为是取决于使用中的de-RServe客户端,还是完全在套接字级别处理
  3. 我可以检查RServe的运行时设置,看看是否启用了keep.alive吗

我们做到了。

总之,我们调整了一些内核设置,以确保以较短的间隔发送保活数据包,以防止网络组件认为连接已断开。

这就是为什么。

keep.alive enable设置实际上是对套接字层的一条指令,用于周期性地从服务器向客户端发送保活数据包。客户端应返回这些数据包的ACK。行为由三个内核级别的设置控制,如TCP Keepalive HOWTO-在Linux下使用TCP Keepalive:中所述

  1. tcp_keepalive_time(默认为7200秒(
  2. tcp_keepalive_intvl(默认为75秒(
  3. tcp_keepalive_probes(默认为9次(

tcp_keepalive_time是在建立tcp/ip连接后首次发送保活数据包。tcp_keepalive_intvl间隔是后续数据包之间的去等待时间,tcp_keepalive_probes是使系统决定连接失效的后续未确认数据包的数量。

因此,第一个保活数据包仅在2小时后发送。在那之后,一些网络组件已经确定连接已断开,并且保活数据包从未到达客户端,因此从未发送ACK。

我们将tcp_keepalive_timetcp_keepalive_intvl都降低到600秒。

使用tcpdump -i [interface] port 6311,我们能够监视保持活动的数据包。

15:40:111.225941 IP<服务器>。6311<某个节点>lt;端口>:Flags[.],ack 1576,win 237,length 015:40:111.226196 IP<某个节点>lt;端口>lt;服务器>。6311:Flags[.],ack 401,win 511,length 0

此过程一直持续到发送回结果并关闭连接为止。至少,我测试了12个小时。

因此,我们在这里使用keep-alive不是为了检查死对等,而是为了防止由于网络不活动而断开连接,正如TCP keep-alive HOWTO-2.2中所讨论的那样。为什么使用TCP保活?。在这种情况下,您希望使用较低的保活时间和间隔值。

请注意,这些都是内核级别的设置,因此适用于系统范围。我们使用专用服务器,所以这对我们来说不是问题,但在其他情况下可能是问题。

最后,为了完整起见,我将回答我自己的三个问题。

  1. 配置的路径是/etc/Rserv.conf,通过更改另一个设置(remoted enableremote disable(确认了这一点
  2. 这是在套接字级别处理的
  3. 我不确定,但使用tcpdump表明Rserve会发出保活数据包,这是检查正在发生的事情的更有用的方法

最新更新