我最近偶然發現了一個有趣的TCP性能問題,同時運行了一些比較網絡性能和環回性能的性能測試。在我的情況下,網絡性能超過了環回性能(1Gig網絡,相同的子網)。在我處理延遲很重要的情況下,TCP_NODELAY已啓用。我們提出的最好理論是TCP擁塞控制正在阻止數據包。我們做了一些數據包分析,我們可以確定地看到數據包正在被保留,但原因並不明顯。現在的問題...啓用TCP_NODELAY的Linux環回性能
1)在什麼情況下,以及爲什麼通過回送進行通信比通過網絡慢?
2)當儘可能快地發送時,爲什麼切換TCP_NODELAY對環回的最大吞吐量的影響要遠遠大於網絡?
3)如何檢測和分析TCP擁塞控制作爲性能差的潛在解釋?
4)有沒有人有任何其他理論來解釋這種現象?如果是的話,任何證明理論的方法?
下面是一個簡單的點產生了一些樣本數據指向C++應用程序:
Transport Message Size (bytes) TCP NoDelay Send Buffer (bytes) Sender Host Receiver Host Throughput (bytes/sec) Message Rate (msgs/sec) TCP 128 On 16777216 HostA HostB 118085994 922546 TCP 128 Off 16777216 HostA HostB 118072006 922437 TCP 128 On 4096 HostA HostB 11097417 86698 TCP 128 Off 4096 HostA HostB 62441935 487827 TCP 128 On 16777216 HostA HostA 20606417 160987 TCP 128 Off 16777216 HostA HostA 239580949 1871726 TCP 128 On 4096 HostA HostA 18053364 141041 TCP 128 Off 4096 HostA HostA 214148304 1673033 UnixStream 128 - 16777216 HostA HostA 89215454 696995 UnixDatagram 128 - 16777216 HostA HostA 41275468 322464 NamedPipe 128 - - HostA HostA 73488749 574130
這裏有一些更多的有用的信息:
- 我只看到這個問題與小 消息
- HostA和HostB都具有相同的 硬件套件(Xeon [email protected],共32個內核/ 128 Gig Mem/1Gig Nics)
- OS是RHEL 5.4內核2.6.18-164.2.1.el5)
謝謝
如果等待時間是至關重要的,我會切換到UNIX域套接字(非常類似於TCP套接字)或管道(更快,更復雜,你需要兩個管道的雙向連接)。他們攜帶的行李比TCP套接字少,並且延遲時間更短。 – 2011-04-29 13:04:00
這些可能不是相關的問題,但我很好奇。在兩種情況下你看到的實際結果是什麼?吞吐量和時間是多少?另外,測試主要是在一個方向上發送,還是更多地是在響應中發送相同數量的數據的回聲樣式測試? – 2011-04-29 13:13:35
@Mark我將我們的測試結果添加到主文章中。我還添加了一些其他相關細節。測試正在向一個方向發送。 – rns 2011-04-30 22:10:00