これらのLinux TCPデフォルト設定はどのように決定されましたか?


13

最近、実稼働環境で問題を追跡するのにかなりの時間を費やしました。データベースサーバーが消失するとpoll()、接続されたクライアントが最大2時間ハングします(libpqクライアントライブラリでの呼び出しの待機)。問題を掘り下げると、切断されたTCP接続がタイムリーに通知されるように、これらのカーネルパラメーターを調整する必要があることに気付きました。

net.ipv4.tcp_keepalive_time = 7200 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_keepalive_intvl = 75 net.ipv4.tcp_retries2 = 15

上記の4つの値はUbuntu 12.04マシンのものであり、これらのデフォルトは現在のLinuxカーネルのデフォルトから変更されていないようです。

これらの設定は、既存の接続を開いたままにしておくことに大きく偏っており、キープアライブプローブでは非常にけちです。AIUI、デフォルトtcp_keepalive_timeの2時間は、リモートホストへの応答を待っているときに、キープアライブプローブを開始して接続がまだ有効であることを確認するまで2時間辛抱強く待つことを意味します。そして、リモートホストがキープアライブプローブに応答しない場合、それらのキープアライブプローブを9回(tcp_keepalive_probes)、75秒間隔(tcp_keepalive_intvl)で再試行するため、接続が実際に停止していると判断するまでにさらに11分かかります。

これは、フィールドで見たものと一致します。たとえば、psqlリモートPostgreSQLインスタンスに接続されたセッションを開始し、いくつかのクエリが応答を待っている場合、たとえば

SELECT pg_sleep(30);

そして、リモートサーバーが恐ろしい死を迎える(たとえば、そのマシンへのトラフィックを落とす)ので、接続が停止していると判断するまで、最大2時間11分間psqlセッションが待機しています。ご想像のとおり、これらのデフォルト設定は、たとえばデータベースフェイルオーバーイベント中にデータベースと通信するコードに深刻な問題を引き起こします。これらのノブを下げることは大いに役立ちました!そして、これらのデフォルトの調整を推奨するのは私だけではありません

だから私の質問は:

  • デフォルトはどのくらいの期間でしたか?
  • これらのTCP設定をデフォルトにする最初の理由は何ですか?
  • Linuxディストリビューションはこれらのデフォルト値を変更しますか?

そして、これらの設定の理論的根拠に関するその他の歴史や展望をいただければ幸いです。


ここにいくつかの関連情報... tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html
Drav Sloan

ソケットオプション、、およびを使用してTCP_KEEPIDLE、クライアントコードの接続ごとに最初の3つを変更できることに注意してください。TCP_KEEPCNTTCP_KEEPINTVL
wnoise

1
@wnoiseは実際にはLinux 2.6.37以降TCP_USER_TIMEOUTnet.ipv4.tcp_retries2システム全体に設定する代わりに、ソケットオプションを指定することもできるはずです。もちろん、多くのアプリケーション(私の例のPostgreSQLなど)はまだサポートしてTCP_USER_TIMEOUTいません。
ジョシュKupershmidt

回答:


6

RFC 1122では、セクション4.2.3.6で、キープアライブ期間をデフォルトで2時間未満にしないことを指定しています。


1
いいですね、掘り下げてくれてありがとう。tcp_keepalive_time他の3つの関連する設定の先例/説明にまだ興味がありますが、これはほとんどがデフォルトが7200 である理由の質問に答えていると思います。
ジョシュKupershmidt

これは質問に答えるので、私の答えを削除します(少なくとも1つの値について)
-coteyr

1
@coteyrとにかくありがとう、私は努力に感謝します。IIRCには、以前のLinuxカーネルではデフォルトが15分であったことを示唆する興味深いコメントがあなたの答えにありました。どのように/なぜそれが2時間に変更されたのか、そもそも15分に設定されたのに興味があります。
ジョシュKupershmidt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.