簡體   English   中英

在並發測試下Java NIO的管道錯誤

[英]Broken pipe error of Java NIO under concurrent test

我現在正在使用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();的定義: 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

這是否提供一些有用的信息?

“管道中斷”表示對等端過早關閉了連接。 出於多種原因,它可以在負載下執行此操作,而這些原因均與您的代碼無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM