上記のように、アイドル時間が5分以上継続すると接続がタイムアウトされてしまう。
接続をタイムアウトさせないようにするためには、TCP Keepaliveなどの利用を行うように言われている。
TCP KeepaliveはOS側で下記設定で確認することが出来る。
$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
上記設定では、
- アイドル時間が7200秒(2時間)続いていた場合
- 75秒おきにキープアライブプローブを送信
- 9回まで送る
という設定になっている。
(多分OSデフォルト?)
そのため、TCPコネクションが死んでいると確認できるまでは、
7200 + 75 * 9 = 7875秒 かかる形となる。
OS標準でのTCP Keepaliveの設定は、sysctl
とかで変更することも可能
プログラムからTCP Socketを利用する場合は、
基本的にTCP Keepaliveが無効なSocketとして作られることが多い模様。
そのため、プログラム内部で setsockopt
などを使って設定することが必要そう。
rubyだと以下ページとかでSocketのオプションを見れる模様
この辺を参考にTCP Keepaliveを設定するとよさそう