Networking

當文件大小大於 64KB 時,scp 傳輸變得非常慢

  • July 30, 2020

最初的問題是,當git clone通過 ssh 執行時,傳輸速率非常慢,然後它會暫停並最終失敗

connection reset via peer

背景

  • ssh 伺服器是執行 Raspbian 的 Raspberry Pi

  • ssh 客戶端我已經嘗試過使用 OSX 以及使用 Raspbian 的另一個 Raspberry,但有同樣的問題

  • git clone在 LAN 上從來都不是問題,但是當嘗試通過 WAN 顯示這個問題時,我確實有一個 openWrt 路由器,它具有埠轉發功能,可以將樹莓派的 ssh 埠暴露到路由器上以進行 WAN 訪問

  • 我確實在路由器上執行了一個從 Internet 可見的防火牆。

  • 正在使用 IPv4

  • RPi 通過有線連接連接到路由器

  • 使用了以下 ssh 客戶端:

    • 作業系統:OpenSSH_8.1p1, LibreSSL 2.7.3
    • 樹莓派:openssh-client/stable,now 1:7.9p1-10 armhf

我說的scp 觀察結果 讓我在查看之前嘗試scp確保它工作正常git clone。以下是我的觀察:

scp小於 64KB 的文件的速度非常快,可以在一秒鐘內完成。

scp -P 31415 user@host:/tmp/64KB /dev/null

64KB                 100%   64KB 310.4KB/s   00:00

scp大於 64KB 的文件非常慢,即使我只有 1 個額外的 KB,有時也會失敗

scp -P 31415 user@host:/tmp/65KB /dev/null

65KB                 100%   65KB 284.2KB/s   00:00
Connection to xxxxxxx closed by remote host.

我嘗試對scp -vvv兩次轉移進行比較並進行了比較,我看到了以下差異。

-64KB                                              100%   64KB 288.5KB/s   00:00
+65KB                                              100%   65KB 267.3KB/s   00:00
debug3: receive packet: type 96
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
@@ -190,6 +190,18 @@ debug2: channel 0: chan_shutdown_read (i0 o3 sock -1 wfd 4 efd 6 [write])
debug2: channel 0: input open -> closed
debug3: receive packet: type 97
debug2: channel 0: rcvd close
+debug3: receive packet: type 98
+debug1: client_input_channel_req: channel 0 rtype keepalive@openssh.com reply 1
+debug3: send packet: type 100
+debug3: receive packet: type 98
+debug1: client_input_channel_req: channel 0 rtype keepalive@openssh.com reply 1
+debug3: send packet: type 100
+debug3: receive packet: type 98
+debug1: client_input_channel_req: channel 0 rtype keepalive@openssh.com reply 1
+debug3: send packet: type 100
+debug3: receive packet: type 98
+debug1: client_input_channel_req: channel 0 rtype keepalive@openssh.com reply 1
+debug3: send packet: type 100
debug3: channel 0: will not send data after close
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user

我確實看到 65KB 我看到了一些添加+debug3: receive packet: type 98,但我缺乏理解來解釋這一點。

我已經經歷了一些解決方案,例如打開 TCPTimestamps、更改 MTU 大小等,但它們都沒有幫助。

將“IPQoS”設置為“none”解決了這個問題。太感謝了!我似乎需要在客戶端和伺服器上都設置選項。

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