いくつかのsのためにCLOSE_WAIT
。既存の接続の総数がCLOSE_WAIT
10の場合、新しい接続は失敗します。 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を引き起こす可能性があります特定の接続事故を「治療」します。