在我的使用java nio的程序中,當它試圖連續寫入10 KB消息時,socketchannel.write()變得非常慢。測量寫完整10 KB消息的時間在160 ms和200 ms之間。但編寫完整的5 KB消息的時間僅需要0.8 ms。當消息大小很大時,socketchannel.write()變得非常慢
在選擇器中,我只有Selection.OP_READ並且不處理Selection.OP_WRITE。當收到一個大的完整消息時,它將被寫入另一個接收器4次。
有人遇到同樣的問題嗎?有一個關於socketchannel.write()緩慢的文章。我的問題是如何替換OP_READ和OP_WRITE之間的變化?
如果我添加一個inerval,例如150毫秒,響應時間會縮短。有什麼辦法可以找到緩衝區已滿的時間,這樣我可以讓程序等待。我的操作系統是Windows XP。
謝謝。
我按照EPJ建議通過檢查寫入的字節數。但是響應時間依然很高。我在這裏發佈我的部分代碼,並希望檢查我的代碼是否有問題。
//這是使用NIO的寫數據()部分:
while (buffer.hasRemaining()) {
try {
buffer.flip();
n = socket.write(buffer);
if(n == 0) {
key.interestOps(SelectionKey.OP_WRITE);
key.attach(buffer);
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
buffer.compact();
}
}
if(buffer.position()==0) {
key.interestOps(SelectionKey.OP_READ);
}
我想它正試圖永久發送10KB的一個單一的TCP數據包,它失敗了很多。 –
消息連續發佈。拓撲結構是一系列節點。消息間隔爲100毫秒 – susan
@MartijnCourteaux號TCP分組發生在較低級別。它不會嘗試發送IP包>路徑MTU。 – EJP