LinuxカーネルによってFIN_WAIT2状態の接続が閉じられないのはなぜですか?


11

Kubernetesの一部であるkube-proxyと呼ばれる長命のプロセスに問題があります。

問題は、時々接続がFIN_WAIT2状態のままになることです。

$ sudo netstat -tpn | grep FIN_WAIT2
tcp6       0      0 10.244.0.1:33132        10.244.0.35:48936       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:48340        10.244.0.35:56339       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:52619        10.244.0.35:57859       FIN_WAIT2   14125/kube-proxy
tcp6       0      0 10.244.0.1:33132        10.244.0.50:36466       FIN_WAIT2   14125/kube-proxy

これらの接続は時間の経過とともに積み重ねられ、プロセスが誤動作します。既にKubernetesバグトラッカーに問題報告しましたが、そのような接続がLinuxカーネルによって閉じられない理由を理解したいと思います。

そのドキュメント(tcp_fin_timeoutの検索)によると、FIN_WAIT2状態の接続はX秒後にカーネルによって閉じられるはずです。Xは/ procから読み取ることができます。私のマシンでは、60に設定されています。

$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60

正しく理解できれば、そのような接続は60秒で閉じられるはずです。しかし、これはそうではありません、彼らは何時間もそのような状態のままになります。

また、FIN_WAIT2接続は非常に珍しいことも理解していますが(これは、ホストが接続のリモートエンドからのACKを待っていることを意味します。 。

何かできることはありますか?

関連プロセスの再起動は最後の手段であることに注意してください。


1
ところで、FIN-WAIT2では、接続はACKを待機していません(送信したFINは既に確認されているため、FIN-WAIT1にはいません)。代わりに、もう一方の端には、無制限の量のデータを送信するオプションがあります。
ハーゲンフォン

回答:


14

カーネルタイムアウトは、接続が孤立している場合にのみ適用されます。接続がまだソケットに接続されている場合、そのソケットを所有するプログラムが接続のシャットダウンのタイムアウトを担当します。おそらく呼び出してshutdownおり、接続が正常にシャットダウンするのを待っています。シャットダウンが完了するまで、アプリケーションは待機することができます。

典型的なクリーンシャットダウンフローは次のようになります。

  1. アプリケーションは、接続をシャットダウンすることを決定し、接続の書き込み側をシャットダウンします。

  2. アプリケーションは、相手側が接続の半分をシャットダウンするのを待ちます。

  3. アプリケーションは、接続の相手側のシャットダウンを検出し、そのソケットを閉じます。

アプリケーションは、好きなだけステップ2で待機できます。

アプリケーションにはタイムアウトが必要なようです。接続をシャットダウンすることを決定したら、ある程度の時間の後、相手側がクリーンシャットダウンを行うのを待つのをshouldめます。


このようなタイムアウトが実装されているかどうかを確認するには、Kubernetes開発者とこの情報を確認します。確認したら回答を受け入れます。それにもかかわらず、迅速な対応に感謝します。
アダム・ロマネック

あなたの答えをより詳細に理解したいと思います。孤立した接続とは何ですか?
アダムロマネク

1
@AdamRomanek孤立した接続とは、関連付けられたソケットがない接続、つまり、カーネル自体のみがアクセスでき、プロセスが操作を実行できない接続です。
デビッドシュワルツ

これは役立つだろう...」 blog.cloudflare.com/...
ジョン・グリーン

2

ソケットがshutdown()で、まだclose()ではない場合、ソケットはFIN_WAIT2状態のままになります。また、アプリケーションはまだファイル記述子を所有しているため、カーネルは面倒なことはしません。


それはすでに受け入れられた答えで言及されています。
-RalfFriedl

close()が呼び出されないことを具体的に追加しました。
L.ヤン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.