【发布时间】:2012-04-15 16:17:12
【问题描述】:
我有一个服务器应用程序,它接收请求并在 Unix 域套接字上转发它们。这在合理使用下完美运行,但是当我对几千个请求进行一些负载测试时,我收到了 Broken Pipe 错误。
我正在使用带有junixsocket 的Java 7 来发送请求。我有很多并发请求,但是我有一个包含 20 个工作线程的线程池正在写入 unix 域套接字,因此不存在并发打开连接过多的问题。
对于我打开、发送和关闭与 Unix 域套接字的连接的每个请求。
在 Unix Domain Sockets 上可能导致 Broken Pipe 的原因是什么?
更新:
如果需要,放一个代码示例:
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 套接字。
【问题讨论】:
-
查看(导致断管错误的原因)[stackoverflow.com/questions/4584904/…
-
@jbx 我也从
AFUNIXSocket客户端看到了这种行为。你找到根本原因了吗? -
@tjdett 它有点太长了,我记不住。但是,我认为我增加了文件限制,例如打开文件和打开套接字的数量。
标签: java unix broken-pipe unix-socket