在Unix域套接字上断管的原因是什么?

时间:2012-04-15 16:17:13

标签: java unix broken-pipe unix-socket

我有一个服务器应用程序,它接收请求并在Unix域套接字上转发它们。这在合理的使用情况下工作得很好但是当我用几千个请求做一些负载测试时,我收到了一个Broken Pipe错误。

我正在使用带有junixsocket的Java 7来发送请求。我有很多并发请求,但我有一个20个工作线程的池,它写入unix域套接字,因此没有太多并发打开连接的问题。

对于我打开的每个请求,使用Unix域套接字发送和关闭连接。

可能导致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个工作线程的线程池,它们同时执行上述操作(最多20个并发连接到同一个Unix域套接字),每个都打开,发送和关闭。这适用于10,000个请求突发的负载测试,但是当我再放几千个时,我突然得到这个错误,所以我想知道它是否来自某些操作系统限制。

请记住,这是一个Unix域套接字,而不是网络TCP套接字。

1 个答案:

答案 0 :(得分:2)

'断管'表示您已写入已被另一端关闭的连接。由于缓冲,它在某种程度上是异步检测的。它基本上意味着您的应用程序协议中存在错误。