質問

サーバーのテストプログラムを書いています。テストアプリでは、多数のクライアントをサーバーに接続しようとしますが、しばらくすると、次のようなエラーが発生します。

Connection reset by peer: socket write error                   

または

java.net.SocketException: Connection reset                     

または

java.net.ConnectException: Connection refused: connect

サーバーに接続するすべてのクライアントに新しいソケットを使用します。

この奇妙な行動について誰かに教えてもらえますか?

役に立ちましたか?

解決

残念ながら、サーバーの性質に関する詳細は提供していません。典型的なTCPサーバーを書いていると思います。この回答では、Java固有の詳細については話さない

簡単なアドバイスは、クライアント接続の間に遅延を挿入することです。これがないと、サーバーへのDoS攻撃を積極的にシミュレートしています。

長いものについては、以下をお読みください。

通常、TCPサーバーは、(美しいCインターフェイスで) int sockfd = socket(...)関数を呼び出して結果を渡すことにより、 listening を1つだけ作成します( sockfd の場合)から bind()および listen()関数へ。この準備の後、サーバーは accept()を呼び出します。これにより、サーバーは眠りに落ちます(ソケットがブロッキングとしてマークされている場合)、そして地球の反対側のクライアントが connect()関数、OSカーネルをサポートする accept()(サーバー側)は、接続されたソケットを作成します。

実際に可能な保留中の接続の数は、 listen()関数を調べることで知ることができます。 listen()には、 OSカーネルがソケットにキューイングする接続の最大数を定義する backlog パラメーターがあります(これは基本的に SYN_RCVD および ESTABLISHED 状態のすべての接続)。歴史的に1980年代の backlog の推奨値は5のようなものでしたが、これは私たちの時代には明らかに悲惨でした。たとえば、FreeBSD 7.2では、 backlog hard limit は次のように入力することで推測できます。

% sysctl kern.ipc.somaxconn
kern.ipc.somaxconn: 128

およびFedora 10の場合:

% cat /proc/sys/net/core/somaxconn
128

P.S。
ひどい英語でごめんなさい。

他のヒント

ウェブ/アプリサーバーは、一度に有限量のクライアントにのみサービスを提供できます。

この制限に達すると、接続が拒否/リセットされます。

質問に答える希望。

乾杯

OSとWebサーバーには、開始/承認できる接続の速度と数に制限があります。サーバーでパフォーマンステストを実行する場合は、これらの制限に対する解決策があるため、Apache JMeterを試してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top