當我使用10 Gig網絡接口從一個solaris m/c到另一個solaris m/c進行跟蹤路由時,它需要0.073 ms的40字節數據包。使用java計算Tcp往返時間
當我在java中做同樣的事情時間更長。即使經過10K迭代,時間也更長。可能是什麼原因 ?
的Java:發件人(摘錄)
Socket sendingSocket = new Socket(address, RECEIVER_PORT);
sendingSocket.setTcpNoDelay(true);
OutputStream outputStream = sendingSocket.getOutputStream();
byte[] msg = new byte[64]; // assume that it is populated.
for (int i = 0; i < 10000; i++) {
long start = System.nanoTime();
outputStream.write(msg,0,64);
outputStream.flush();
inputStream.read(msg,0,64); // inputStream is initialized like outputstream
long end = System.nanoTime();
}
它需要較長的方式米利斯69和它甚至不取決於字節大小。即使我減少它說1個字節的數組,它仍然需要69毫秒。有何評論/建議?
其他觀察: 1. OutputStream.write和flush只需要6個micros。 2.同樣在接收和寫回的另一端TCPReceiver端,它只需要6個micros。
解決方案: 謝謝大家,你迴應了這個查詢。 我發現這是由於套接字緩衝區大小造成的:
在solaris m/c上設置的默認緩衝區大小。
接收緩衝區大小49152
發送緩衝區的大小7552.
我增加了套接字緩衝區大小和性能幾乎一致的traceroute。
雖然我同意你的比較ICMP和TCP是兩種不同的東西,但65毫秒在TCP方面太過分了。 – 2sb
@ 2sb你也發送了更多的TCP數據,實際上幾乎是兩倍。 – EJP
@ 2sb:我同意 - 65毫米似乎不合理。這就是爲什麼我想從tcpdump開始,以幫助消除一些潛在的原因。 –