10個の接続がTCPリスナーをブロックしてブロックを解除する方法

10個の接続がTCPリスナーをブロックしてブロックを解除する方法

いくつかのsのためにCLOSE_WAIT。既存の接続の総数がCLOSE_WAIT10の場合、新しい接続は失敗します。 10の接続制限はどこですか?どのように延長しますか? (これを削除する方法を見つけるのは難しいですが、CLOSE_WAITこれは別の質問です。特に10の接続制限を拡張する方法についてです。)

Ubuntu 18.04
カーネル: 4.15.0-91-一般
アーキテクチャ: x86_64

出力netstat --tcp --numeric-ports -p|grep 2225

tcp       15      0 localhost:2225          localhost:42928         CLOSE_WAIT  -                   
tcp        8      0 localhost:2225          localhost:33860         CLOSE_WAIT  10570/mdp           
tcp       15      0 localhost:2225          localhost:41938         CLOSE_WAIT  -                   
tcp       15      0 localhost:2225          localhost:42800         CLOSE_WAIT  -                   
tcp       15      0 localhost:2225          localhost:40912         CLOSE_WAIT  -                   
tcp       25      0 localhost:2225          localhost:33974         CLOSE_WAIT  -                   
tcp        0      1 localhost:51842         localhost:2225          SYN_SENT    12221/telnet        
tcp       15      0 localhost:2225          localhost:41808         CLOSE_WAIT  -                   
tcp        0      0 localhost:33202         localhost:2225          ESTABLISHED 33721/controller    
tcp      481      0 localhost:2225          localhost:33596         CLOSE_WAIT  10570/mdp           
tcp       20      0 localhost:2225          localhost:33582         CLOSE_WAIT  10570/mdp           
tcp        0      0 localhost:2225          localhost:33202         ESTABLISHED 10570/mdp           

接続しようとすると、「接続タイムアウト」というメッセージが表示されます。
リスニングバックログは5に設定されます。
アプリケーションは(意図的に)接続を制限しません。

ベストアンサー1

そのような制限はありません(もちろん、はいしかし、一般的なシステムの場合でも、40,000の接続制限をはるかに超えています。

そこに何がありますか?はいしかし、それは制限ソケットバックログプラスサービス接続(マルチスレッドサーバーの場合)

確認するには、straceバイナリを実行し、grepを使用してその行の出力を見つけますlisten(x,y)。 CLOSE_WAIT状態の接続は合計バックログに含めることができるため、値が低すぎる場合ノーマルCLOSE_WAIT の量が原因で、サーバーが新しい接続を受け入れられない可能性があります。

CLOSE_WAIT は次のことを意味します。顧客接続は閉じたが、サーバーはソケットを解放しませんでした。ソケットに接続されているすべてのスレッドまたはリソースは引き続き使用されています。通常、サーバーの場合、これは意味がありません。接続が終了するとすぐに、プロセスも終了する必要があります。そうでなければ、コードレベルに問題があることを意味します(一方、TIME_WAITはカーネルレベルで調整できます)。例えばこの記事

あなたできる場合によっては、CLOSE_WAIT遅延時間が短縮されます(参照:ここ)、しかし実際の問題はコードにあるので、コードで解決する必要があります。

提供できる接続数を増やすには、サーバーコードの操作も必要です。これは、単純な設定ディレクティブ(MaxConnectionsなど)でも、スキーマの変更を意味する場合もあります。

場合によっては、マルチプレクサを配置することが可能かもしれません。ガンディールサーバーの前で(たとえば、元のプログラムをポート(例:127.0.0.1:12225)で実行してから、redirに0.0.0.0:2225の接続を受信して​​127.0.0.1:12225にリダイレクトするように指示する)、過度のCLOSE_WAITを引き起こす可能性があります特定の接続事故を「治療」します。

おすすめ記事