keepalive_abort_interval
Solaris 11.0 还包括一个另外的套接字选项,应用程序可以使用名为 TCP_KEEPALIVE_ABORT_THRESHOLD 的 setsockopt(3socket) 设置该选项,该选项允许基于每个套接字的应用程序设置自己的保持活动中止间隔。
请注意,如果应用程序要使用此选项,则它必须在其源代码中定义此选项。
有了这个,还有另一个可调参数,它允许系统管理员调整保活中止间隔。
此调整仅控制保持活动中止间隔,不会像以前的版本一样影响 tcp_ip_abort_interval。
查询当前值并查看默认值:
# ipadm show-prop -p _keepalive_abort_interval tcp
要在重启后保存持久配置:
# ipadm set-prop -p _keepalive_abort_interval=240000 tcp
Default value: 480000 milliseconds (8 minutes) Minimum value: 0 milliseconds (0 milliseconds) Maximum value: 4294967295 milliseconds (47 Days)
通常,空闲 TCP 连接一旦建立就会无限期地保持,即使主机系统之间没有发生通信。
这在 TCP 中很正常。
在某些情况下,保持连接打开可能会不恰当地消耗主机和/或者应用程序资源(通常是 TCP 端口范围),例如:
- 远程主机崩溃或者以其他方式经历某种类型的非有序关闭和/或者重新启动,而没有通知它的 TCP 对等方。
- 远程主机无法访问;两台主机之间的网络路径中断。 (例如,也许防火墙正在悄悄地超时空闲连接。)
TCP Keepalive 是许多 TCP 实现(包括 Solaris)提供的功能,作为在这些情况下“清理”空闲连接的一种方式。
应用程序必须通过 setsockopt(3SOCKET) 套接字调用使用 SO_KEEPALIVE 套接字选项启用此功能。
不能强制 Solaris 为未设置该选项的应用程序启用 keepalive。
一旦启用,如果连接保持在 ESTABLISHED 状态并且在指定的时间范围内空闲,则会发送“keepalive probe”数据包。
这个时间范围是“tcp_keepalive_interval”:
Default value: 7200000 milliseconds (2 Hours) Minimum value: 10000 milliseconds (10 Seconds) Maximum value: 864000000 milliseconds (10 Days)
“keepalive 探测”数据包的处理就像任何其他需要来自另一端的确认 (TCP ACK) 的 TCP 数据包一样。
它将按照标准的重传退避算法进行重传。
如果 tcp_ip_abort_interval 没有收到响应,则连接将终止,就像任何其他“未确认”数据包的情况一样。
因此,使用 TCP keepalive 且没有响应对等方的连接的实际最大空闲时间为:
tcp_keepalive_interval + tcp_ip_abort_interval
Solaris 默认 tcp_ip_abort_interval 为 8 分钟(480000 毫秒)。
在远程主机重新启动并因此在不知道先前连接的情况下运行的情况下,我们可以期望远程主机立即通过 TCP 重置响应 keepalive 探测,这将导致 Solaris 系统立即终止连接。
只要远程主机仍在响应探测,TCP_keepalive 探测就不会影响非活动连接。
但是,应注意确保上述参数保持足够高的值,以避免不必要的流量和其他问题,例如在丢失一些数据包的情况下过早关闭活动连接。
Solaris 11.0 及以上版本
在 Solaris 11.0 上,ipadm 命令现在管理这些设置。
请注意,在这种情况下,Solaris 11.0 及更高版本将在重新启动后保留更改。
我们可以通过向 ipadm 添加 (-t) 选项来临时更改设置。
查询当前值并查看默认值:
# ipadm show-prop -p _keepalive_interval tcp
要在重启后保存持久配置:
# ipadm set-prop -p _keepalive_interval=900000 tcp
Solaris 10 及以下版本
ndd 实用程序用于更改上述参数。
这些更改不会在重新启动后保留,因此应在启动脚本中放置适当的命令,例如“/etc/rc2.d/S68nettune”(通常在网络应用程序启动之前执行)以使任何更改永久生效。
下面是查询和重置 tcp_keepalive 间隔的 ndd 命令示例:
查询当前值:
# ndd -get /dev/tcp tcp_keepalive_interval 7200000
将 keepalive 间隔更改为 15 分钟(900000 毫秒):
# ndd -set /dev/tcp tcp_keepalive_interval 900000