Networking

為什麼我的 TCP 吞吐量遠大於 UDP 吞吐量?

  • March 31, 2014

我沒有對我的硬體或核心配置做任何不尋常的事情(所有預設設置、全新作業系統安裝、Linux 核心 3.11 TCP/IP 堆棧),我平均每秒通過 TCP 發送約 383 萬條消息,而我平均只有 0.75每秒通過 UDP 發送百萬條消息。這似乎完全違背了我對這兩個協議的期望。

造成這種巨大差異的最可能原因是什麼?如何在 Ubuntu 13.10 上診斷它?

#TCP RESULTS
Recv   Send    Send                          Utilization       Service Demand
Socket Socket  Message  Elapsed              Send     Recv     Send    Recv
Size   Size    Size     Time     Throughput  local    remote   local   remote
bytes  bytes   bytes    secs.    10^6bits/s  % S      % S      us/KB   us/KB

87380  65536     64    10.00      1963.43   32.96    17.09    5.500   2.852

#UDP RESULTS
Socket  Message  Elapsed      Messages                   CPU      Service
Size    Size     Time         Okay Errors   Throughput   Util     Demand
bytes   bytes    secs            #      #   10^6bits/sec % SS     us/KB

4194304      64   10.00     7491010      0      383.5     28.97    24.751
212992            10.00     1404941              71.9     25.03    21.381

對於這個測試,我有兩個相同的測試伺服器,它們通過 10G 交叉電纜直接連接。在這種情況下使用的 NIC 是具有開箱即用配置的 Intel X520 並連接到主機板上的 PCIe 3.0 x8 插槽,該插槽通過 NUMA 控制器與 CPU 通信。

除了沒有獲得有關您的測試設置的詳細資訊之外,主要問題似乎是您使用了 64 字節的消息大小。這與通常的 1500 字節的 MTU 相差甚遠,並且使 UDP 效率非常低:雖然 TCP 將多次發送合併為一個線上數據包(除非設置了 TCP_NODELAY)以有效利用鏈路,但每個 UDP 消息將導致一個單獨的數據包。在數量上:大約 23 個 64 字節的消息將組合成一個 MTU 大小的 TCP 數據包,而對於相同數量的數據,UDP 需要 23 個單個數據包。這些數據包中的每一個都意味著從主機發送、線上傳輸和對等方接收的成本。正如您所見,大約 80% 的 UDP 封包遺失,因為您的硬體速度不夠快,無法傳輸和接收所有這些數據包。

所以你可以從這個基準中學到的是:

  • UDP 不可靠(80% 丟包)
  • 如果使用遠低於 MTU 的數據包大小,UDP 效率低下
  • TCP經過高度優化以充分利用鏈路

至於您的期望,UDP 應該更好:您有沒有想過為什麼所有主要的文件傳輸(ftp、http、…)都是使用基於 TCP 的協議完成的?基準測試向您展示了原因。

那麼人們為什麼要使用UDP呢?

  • 對於實時數據(例如 IP 語音),您不需要關心較舊的消息,因此您不希望發送者將消息組合成更大的數據包以有效利用鏈路。你寧願接受一個封包遺失而不是讓它來得太晚。
  • 對於高延遲連結(如衛星),TCP 的預設行為對於有效利用連結並不是最佳的。所以有些人在這種情況下切換到 UDP 並重新實現 TCP 的可靠性層並針對高延遲鏈路對其進行優化,而另一些人則調整現有的 TCP 堆棧以更好地利用鏈路。
  • “丟棄”數據:有時更重要的是發送數據而不關心封包遺失,例如日誌消息(syslog)
  • 短互動:使用 TCP,您需要建立連接並維護狀態,這會花費客戶端和伺服器的時間和資源。對於簡短的互動(例如簡短的請求和回复),這可能會產生過多的成本。因此,DNS 通常使用 UDP 完成,但在 UDP 之上建構了重試。

引用自:https://unix.stackexchange.com/questions/122281