У меня есть серверное приложение, которое получает запросы и пересылает их в сокет домена Unix. Это прекрасно работает при разумном использовании, но когда я выполняю нагрузочные тесты с несколькими тысячами запросов, я получаю ошибку Broken Pipe.
Я использую Java 7 с junixsocket для отправки запросов. У меня есть много одновременных запросов, но у меня есть пул потоков из 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.
AFUNIXSocket
. Вы когда-нибудь находили основную причину? - person tjdett   schedule 16.10.2015