リクエストを受信し、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 ドメイン ソケットであることに注意してください。