簡體   English   中英

Tcp 往返時間計算使用 java

[英]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.

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