Tcp

如何調試為什麼 WAN TCP/IP 吞吐量低於預期?

  • February 27, 2015

我試圖弄清楚為什麼我控制的兩台主機之間的 tcp/ip 吞吐量遠低於預期。

主持人 A:Comcast(住宅)在波士頓地鐵提供的網際網路連接——可以從各種知名網站(例如下載 Google Chrome)持續實現 100Mbps 下載

主機 B:由 Cogent 提供的網際網路連接;可以始終達到接近 100Mbps 往返各個站點。

測試連接:主機 A 從 B 下載一個大文件,通過非標準埠 (22442) 上的 rsync/ssh (即rsync --progress -e 'ssh -p 22442' ...– 吞吐量僅為 2.5Mbps (292564 Bps) 左右

其他客戶端(例如臨時 EC2 實例)在嘗試從 B 進行相同下載時可以實現近 30 倍的吞吐量

我已經設法使用 tcptrace(附在下面)擷取 A 和 B 之間連接的統計資訊,但我不確定是否有任何問題。

我想我這邊有些東西需要調整,但我也有點懷疑康卡斯特會影響流量——所以在我開始四處遊蕩之前,我想我會尋求建議。我可以嘗試哪些好的後續步驟?提前致謝。

tcptrace -r -l -o1 dump.out
1 arg remaining, starting with 'dump.out'
Ostermann's tcptrace -- version 6.6.7 -- Thu Nov  4, 2004

5763 packets seen, 5763 TCP packets traced
elapsed wallclock time: 0:00:00.019828, 290649 pkts/sec analyzed
trace file elapsed time: 0:00:18.655110
TCP connection info:
1 TCP connection traced:
TCP connection 1:
   host a:        XXX.XXXX.XXX:41608
   host b:        XXX.XXXX.XXX:22442
   complete conn: RESET    (SYNs: 2)  (FINs: 1)
   first packet:  Sun May 26 14:48:52.923281 2013
   last packet:   Sun May 26 14:49:11.578391 2013
   elapsed time:  0:00:18.655110
   total packets: 5763
   filename:      dump.out
   a->b:                 b->a:
     total packets:          1946           total packets:          3817
     resets sent:              15           resets sent:               0
     ack pkts sent:          1930           ack pkts sent:          3817
     pure acks sent:         1874           pure acks sent:           35
     sack pkts sent:          228           sack pkts sent:            0
     dsack pkts sent:           0           dsack pkts sent:           0
     max sack blks/ack:         3           max sack blks/ack:         0
     unique bytes sent:      4100           unique bytes sent:   5457821
     actual data pkts:         55           actual data pkts:       3781
     actual data bytes:      4100           actual data bytes:   5457821
     rexmt data pkts:           0           rexmt data pkts:           0
     rexmt data bytes:          0           rexmt data bytes:          0
     zwnd probe pkts:           0           zwnd probe pkts:           0
     zwnd probe bytes:          0           zwnd probe bytes:          0
     outoforder pkts:           0           outoforder pkts:          23
     pushed data pkts:         55           pushed data pkts:         41
     SYN/FIN pkts sent:       1/1           SYN/FIN pkts sent:       1/0
     req 1323 ws/ts:          Y/Y           req 1323 ws/ts:          Y/Y
     adv wind scale:            7           adv wind scale:            7
     req sack:                  Y           req sack:                  Y
     sacks sent:              228           sacks sent:                0
     urgent data pkts:          0 pkts      urgent data pkts:          0 pkts
     urgent data bytes:         0 bytes     urgent data bytes:         0 bytes
     mss requested:          1460 bytes     mss requested:          1460 bytes
     max segm size:           712 bytes     max segm size:          1448 bytes
     min segm size:            16 bytes     min segm size:            21 bytes
     avg segm size:            74 bytes     avg segm size:          1443 bytes
     max win adv:          301184 bytes     max win adv:           21632 bytes
     min win adv:            5888 bytes     min win adv:           14592 bytes
     zero win adv:              0 times     zero win adv:              0 times
     avg win adv:          269168 bytes     avg win adv:           21615 bytes
     initial window:           20 bytes     initial window:           21 bytes
     initial window:            1 pkts      initial window:            1 pkts
     ttl stream length:      4101 bytes     ttl stream length:        NA
     missed data:               1 bytes     missed data:              NA
     truncated data:            0 bytes     truncated data:            0 bytes
     truncated packets:         0 pkts      truncated packets:         0 pkts
     data xmit time:       18.128 secs      data xmit time:       18.527 secs
     idletime max:         5206.5 ms        idletime max:         5285.9 ms
     throughput:              220 Bps       throughput:           292564 Bps

     RTT samples:              57           RTT samples:            1661
     RTT min:                59.0 ms        RTT min:                 0.0 ms
     RTT max:               106.1 ms        RTT max:                40.1 ms
     RTT avg:                77.2 ms        RTT avg:                 1.4 ms
     RTT stdev:              17.2 ms        RTT stdev:               7.1 ms

     RTT from 3WHS:          60.0 ms        RTT from 3WHS:           0.0 ms

     RTT full_sz smpls:         2           RTT full_sz smpls:         1
     RTT full_sz min:        60.0 ms        RTT full_sz min:         0.0 ms
     RTT full_sz max:        70.1 ms        RTT full_sz max:         0.0 ms
     RTT full_sz avg:        65.1 ms        RTT full_sz avg:         0.0 ms
     RTT full_sz stdev:       0.0 ms        RTT full_sz stdev:       0.0 ms

     post-loss acks:            0           post-loss acks:           16
     segs cum acked:            0           segs cum acked:         2090
     duplicate acks:            0           duplicate acks:          201
     triple dupacks:            0           triple dupacks:            8
     max # retrans:             0           max # retrans:             0
     min retr time:           0.0 ms        min retr time:           0.0 ms
     max retr time:           0.0 ms        max retr time:           0.0 ms
     avg retr time:           0.0 ms        avg retr time:           0.0 ms
     sdv retr time:           0.0 ms        sdv retr time:           0.0 ms

一些更新 我嘗試了其他一些東西。

  • 首先,我嘗試通過通過第三台主機隧道傳輸來“重新路由”流——我在大約 30 分鐘內實現了非常可觀的吞吐量,然後吞吐量衰減了 20 倍,以或多或少地與原始流匹配。
  • 其次,我使用大小為 1400b 的數據包從 B->A 執行 mtr,並看到以下內容:

XXX (0.0.0.0) 2013 年 5 月 27 日星期一 19:20:37
按鍵:幫助 顯示模式 重啟統計 欄位順序 退出
數據包 ping
Host Loss% Snt Last Avg Best Wrst StDev
1. XXX.XX 0.0% 173 0.1 0.1 0.1 0.2 0.0
2. XX.XX-XXatlas.cogentco.com 0.0% 173 0.9 0.9 0.8 4.2 0.3
3. XX.XX-XXatlas.cogentco.com 0.0% 173 0.7 12.7 0.7 211.8 38.3
4. te7-3.ccr01.ord07.atlas.cogentco.com 0.0% 173 1.1 12.8 0.7 196.8 39.9
5. te0-4-0-7.mpd21.ord01.atlas.cogentco.com 0.0% 173 1.0 1.0 0.9 1.5 0.1
6. be2006.ccr21.ord03.atlas.cogentco.com 0.0% 173 1.3 1.3 1.2 1.9 0.1
7. be-202-pe04.350ecermak.il.ibone.comcast.net 0.0% 172 39.7 41.6 36.3 156.7 15.4
8. he-3-2-0-0-cr01.350ecermak.il.ibone.comcast.net 2.3% 172 46.9 45.0 36.8 51.4 3.6
he-3-1-0-0-cr01.350ecermak.il.ibone.comcast.net
he-3-0-0-0-cr01.350ecermak.il.ibone.comcast.net
he-3-12-0-0-cr01.350ecermak.il.ibone.comcast.net
9. he-3-6-0-0-ar01.woburn.ma.boston.comcast.net 1.2% 172 68.7 67.9 64.8 72.4 1.6
10. XXXXboston.comcast.net 1.7% 172 67.6 66.8 64.2 70.4 1.0
11. XXXXboston.comcast.net 1.2% 172 67.5 66.4 64.0 69.2 1.0
12. XXXXcomcast.net 1.2% 172 75.7 75.2 72.0 85.8 1.9

鑑於我的第一次實驗的結果,以及康卡斯特在第三層設施(350 Cermak)中控制的兩個路由器之間發生如此多的封包遺失的事實——我開始更傾向於“康卡斯特 Boogeyman”的解釋。

我建議幾件事:

  • 使用 ping 檢查封包遺失。嘗試至少 100 次不同數據包大小的 ping,包括大約 1400 字節的較大數據包。
  • 大約 70 毫秒的往返時間 (RTT) 可能會非常高,具體取決於距離。也許一定要看看每條路的跟踪路由。在您粘貼的輸出中,來自 a -> b 的流量似乎受到延遲的影響,但反之則不然,這可能表明來自 a -> b 的路徑存在問題,但來自b -> a 很好。
  • 查看這篇舊論文中用於分析 TCP 吞吐量的技術。

這篇論文有點過時了(Ethereal 現在是 Wireshark),但技術仍然不錯。

5 秒的空閒時間與 18 秒的掛鐘時間相比可能表明當 TCP 視窗緩衝區(發送或接收)已滿時連接處於空閒狀態,這將導致吞吐量下降。然而,非常不對稱的延遲是最突出的,所以我會首先關注這一點。祝您好運,感謝您向我介紹 tcptrace;我以前沒見過。

引用自:https://serverfault.com/questions/511028