я теперь строю сервер управляемых событий, с помощью Java NIOРазбитой ошибка трубы Java NIO под одновременным испытанием
Когда я ab -n 100 -c 100 localhost:8080/
, все нормально. Но когда я сделал ab -n 10000 -c 1000 localhost:8080/
, произошла ошибка !!
Часть кода:
resHeader.append("Host: MyServer" + CRLF);
resHeader.append("Connection: close" + CRLF + CRLF);
ByteBuffer temp = ByteBuffer.wrap(resHeader.toString().getBytes());--(ClientHandler.java:372)
while(temp.hasRemaining()) {
client.write(temp);
}
Определение клиента: client = (SocketChannel) key.channel();
java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcher.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:69)
at sun.nio.ch.IOUtil.write(IOUtil.java:40)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:336)
at ClientHandler.sendResponse(ClientHandler.java:372)
at ClientHandler.parseRequest(ClientHandler.java:218)
at ClientHandler.writeKey(ClientHandler.java:136)
at ClientHandler.execute(ClientHandler.java:51)
at TcpServer.main(TcpServer.java:33)
После ошибки, добавить это к коду:
ByteBuffer temp = null;
try {
temp = ByteBuffer.wrap(resHeader.toString().getBytes());
while(temp.hasRemaining()) {
client.write(temp);
}
} catch (IOException e) {
System.err.println("TEST: " + temp.hasRemaining());
System.out.println("connect:" + client.isConnected()
// TODO Auto-generated catch block
e.printStackTrace();
}
И когда ошибки появляются снова, он печатает "TEST: true"
и "connect:true"
, что означает что он не заканчивает писать. Почему это произошло?
Кроме того, я использовал ab -c 1000 -n 10000 -r http://localhost:8080/
-r : Don't exit on socket receive errors.
Concurrency Level: 1000
Time taken for tests: 18.700 seconds
Complete requests: 10000
Failed requests: 1878
(Connect: 0, Receive: 626, Length: 626, Exceptions: 626)
(PS: С помощью этого -r
я не получил ошибки: java.io.IOException: Broken pipe
)
это Предусматривает ли какую-то полезную информацию?
Какое максимальное количество открытых сокетов вы можете получить за каждый процесс для вашей ОС? Кроме того, возможно ли преждевременно закрыть розетку? –