我有一个服务器应用程序,它接收请求并将其转发到Unix域套接字。在合理使用时,这可以完美运行,但当我使用几千个请求进行负载测试时,会出现“Broken Pipe”错误。
我正在使用Java 7和junixsocket发送请求。我有许多并发请求,但我有一个20个工作线程的线程池,它正在写入Unix域套接字,因此不存在太多并发打开连接的问题。
对于每个请求,我都会打开、发送和关闭与Unix域套接字的连接。
什么原因会导致Unix域套接字出现“Broken Pipe”?
更新:
如果需要,放置代码示例:
我有一个由20个工作者组成的线程池,他们正在同时进行上述操作(因此最多有20个并发连接到同一个Unix域套接字),每个连接都会打开、发送和关闭。这对于10,000个请求的负载测试表现良好,但当我增加几千个请求时,突然出现了这个错误,所以我想知道它是否来自某些操作系统限制。
请注意,这是Unix域套接字,而不是网络TCP套接字。
我正在使用Java 7和junixsocket发送请求。我有许多并发请求,但我有一个20个工作线程的线程池,它正在写入Unix域套接字,因此不存在太多并发打开连接的问题。
对于每个请求,我都会打开、发送和关闭与Unix域套接字的连接。
什么原因会导致Unix域套接字出现“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套接字。
AFUNIXSocket
客户端中看到了这种行为。你最终找到了根本原因吗? - tjdett