2014-02-09 2 views
0

я теперь строю сервер управляемых событий, с помощью 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)

это Предусматривает ли какую-то полезную информацию?

+0

Какое максимальное количество открытых сокетов вы можете получить за каждый процесс для вашей ОС? Кроме того, возможно ли преждевременно закрыть розетку? –

ответ

0

«Сломанная труба» означает, что пэр закрыл соединение преждевременно. Он может делать это под нагрузкой по ряду причин, ни одна из которых не имеет никакого отношения к вашему коду.

 Смежные вопросы

  • Нет связанных вопросов^_^