[英]Tcp round trip time calculation using java
當我使用 10 gig 網絡接口從一個 solaris m/c 到另一個進行跟蹤路由時,40 個字節的數據包需要 0.073 毫秒。
當我在 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 微秒。 2. 同樣在接收和回寫的另一端TCPReceiver端,只需要6微秒。
解決方案:感謝您對此查詢的所有回復。 我發現這是由於套接字緩沖區大小:
在 solaris m/c 上設置的默認緩沖區大小。
接收緩沖區大小 49152。
發送緩沖區大小 7552。
我增加了套接字緩沖區大小,性能幾乎與 traceRoute 匹配。
你不是在比較喜歡和喜歡。 ICMP 和 TCP 是完全不同的協議。
如果您想確定延遲是否存在於您的代碼中,JVM、Solaris TCP 堆棧或您必須從 tcpdump / wireshark 等開始的網絡。
這可能是由多種因素造成的。 對於初學者,建立 TCP 通道需要時間。 為了建立可靠的介質,必須在兩個端點之間發送幾個數據包。 ICMP 消息並非如此,它們只是單個數據包。 事實上,因為無論大小如何,傳輸數據所需的時間都沒有差異,所以您可以假設實際傳輸數據所需的時間量(您談論的是非常少量的數據)在任何一種情況下,在 10gig 連接上)與建立通道所需的時間相比可以忽略不計。 此外,您使用 Java (一種字節碼語言)而不是像 C 或 ZF6F87C9FDCF8B3C3F07ZF93F1EE8712C9 這樣在硬件上運行的東西,完全有可能會產生一些開銷。
連接所需的時間可能約為 20 毫秒。 您需要使用現有連接進行測試。
TCP 堆棧通過 kernel 非常慢。 在許多機器上大約需要 50-100 我們。 您可以使用 kernel 旁路驅動程序/支持來大幅減少這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.