6

リクエストを受信し、Unix ドメイン ソケットで転送するサーバー アプリケーションがあります。これは妥当な使用法の下では完全に機能しますが、数千のリクエストでいくつかの負荷テストを行っていると、Broken Pipe エラーが発生します。

リクエストを送信するために、 junixsocketでJava 7 を使用しています。多くの同時リクエストがありますが、UNIX ドメイン ソケットに書き込みを行う 20 個のワーカーのスレッド プールがあるため、同時オープン接続が多すぎるという問題はありません。

要求ごとに、Unix Domain Socket との接続を開き、送信し、閉じます。

Unix ドメイン ソケットでパイプが壊れる原因は何ですか?

アップデート:

必要に応じてコード サンプルを配置します。

byte[] mydata = new byte[1024];
//fill the data with bytes ...

AFUNIXSocketAddress socketAddress = new AFUNIXSocketAddress(new File("/tmp/my.sock"));
Socket socket = AFUNIXSocket.connectTo(socketAddress);
OutputStream out = new BufferedOutputStream(socket.getOutputStream());
InputStream in = new BufferedInputStream(socket.getInputStream()));

out.write(mydata);
out.flush();  //The Broken Pipe occurs here, but only after a few thousand times

//read the response back...

out.close();
in.close();
socket.close();

私は20個のワーカーのスレッドプールを持っており、それらは上記を同時に実行しており(同じUnixドメインソケットへの最大20個の同時接続)、それぞれが開いたり、送信したり、閉じたりしています。これは、10,000 リクエストのバーストの負荷テストでは問題なく動作しますが、さらに数千リクエストを送信すると、突然このエラーが発生するため、OS の制限によるものではないかと考えています。

これはネットワーク TCP ソケットではなく、Unix ドメイン ソケットであることに注意してください。

4

2 に答える 2

4

「壊れたパイプ」とは、相手側で既に閉じられている接続に書き込んだことを意味します。バッファリングのため、多少非同期に検出されます。これは基本的に、アプリケーション プロトコルにエラーがあることを意味します。

于 2012-04-15T22:39:19.707 に答える