技術分享 | 你通常選用什麼工具在 Linux 中進行資料傳輸?

愛可生雲資料庫發表於2022-04-20

作者:劉開洋

愛可生交付服務團隊北京 DBA,對資料庫及周邊技術有濃厚的學習興趣,喜歡看書,追求技術。

本文來源:原創投稿

*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


1、問題

前幾天跟客戶聊天,抱怨伺服器之前的資料傳輸工具不好用,問我哪種傳輸工具效率高?還真被問住了,畢竟沒經過實踐嘛,今天就測試下。

有點草率得搜尋了下,不過工具還不少。

資料傳輸工具: ftp sftp scp rsync tftp

2、準備工作

刨除網路頻寬等其他因素,我們就 Linux 伺服器之間傳輸檔案做個對比,看看到底什麼工具才是最快、最適合我的場景的。

我們就上面這些傳輸工具在檔案實際大小和檔案數量多少的層次上分別做個對比速度和簡便性對比:

首先準備環境,配置兩個機器ssh互信,建立兩個資料夾,以不同的方式建立一個50G左右的大檔案和51200個1M的小檔案:

# 製造50G大檔案
[root@yang-01 big]# fallocate -l 50G 50g_file
[root@yang-01 big]# ll
total 52428856
-rw-r--r-- 1 root root 53687091200 Apr 10 17:55 50g_file
[root@yang-01 big]# du -sh *
51G 50g_file
 
# 製造51200個1M檔案
[root@yang-01 many]# seq 51200 | xargs -i dd if=/dev/zero of=1m_file{} bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00468854 s, 224 MB/s
······
[root@yang-01 many]# ls | wc -l
51200
[root@yang-01 test]# du -sh many
51G many

小提示:這裡採用了兩種方式製造大檔案,大家可以參考使用,生成檔案確實是50G,位元組數與之對應,至於為什麼du工具計算出來是51G,這裡並不是計算機1024與1000的數值換算的原因,而是因為du命令計算的是該檔案累計使用到檔案系統的總塊數,可能出現使用的部分塊空間佔用並不完整的情況,導致數值偏大。

#### 2.1、測試 SCP

第一個測試的是scp,這是作者使用頻率最多的一個遠端傳輸工具,通常Linux系統會安裝有該工具。

####### 1 * 50G 檔案測試
[root@yang-02 big]# scp /opt/test/big/50g_file root@yang-01:/opt/test/re/
50g_file                                                                                     100%   50GB 135.5MB/s   06:17
  
####### 51200 * 1M 檔案測試
[root@yang-02 many]# time scp /opt/test/many/1m_file* root@yang-01:/opt/test/re/
1m_file1                                                       100% 1024KB  22.5MB/s   00:00
1m_file10                                                       100% 1024KB  35.8MB/s   00:00
1m_file100                                                     100% 1024KB  14.8MB/s   00:00
1m_file1000                                                     100% 1024KB  32.9MB/s   00:00
1m_file10000                                                   100% 1024KB  35.7MB/s   00:00
······
1m_file9998                                                     100% 1024KB 113.4MB/s   00:00
1m_file9999                                                     100% 1024KB  96.5MB/s   00:00
 
real    20m43.875s
user    4m2.448s
sys     2m52.604s
[root@yang-01 re]# ls | wc -l
51200

說明:

  • 類似於cp命令,由於跨機器檔案加密傳輸導致其速度稍慢於copy操作;
  • 如果存在生產環境中無法使用ssh協議的情況,可以採用nc 檔案傳輸;
  • 優點:該工具對於機器的系統資源佔用少、影響較小,使用方便;

2.2、測試 FTP

下面測一下 ftp,看看效果如何。

####### 1 * 50G 檔案測試
[root@yang-01 re]# ftp yang-02
Connected to yang-02 (192.168.88.72).
220 (vsFTPd 3.0.2)
Name (yang-02:root): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> get /opt/test/big/50g_file /opt/test/re/50g_file
local: /opt/test/re/50g_file remote: /opt/test/big/50g_file
227 Entering Passive Mode (192,168,88,72,38,232).
150 Opening BINARY mode data connection for /opt/test/big/50g_file (53687091200 bytes).
226 Transfer complete.
53687091200 bytes received in 150 secs (359091.49 Kbytes/sec)
ftp> quit
221 Goodbye.
 
####### 51200 * 1M 檔案測試
[root@yang-01 re]# time ftp yang-02
Connected to yang-02 (192.168.88.72).
220 (vsFTPd 3.0.2)
Name (yang-02:root):
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> prompt off
Interactive mode off.
ftp> cd /opt/test/many
250 Directory successfully changed.
ftp> mget * .*
local: 1m_file1 remote: 1m_file1
227 Entering Passive Mode (192,168,88,72,156,228).
150 Opening BINARY mode data connection for 1m_file1 (1048576 bytes).
226 Transfer complete.
······
1048576 bytes received in 0.00337 secs (311057.86 Kbytes/sec)
local: . remote: .
227 Entering Passive Mode (192,168,88,72,213,4).
550 Failed to open file.
Warning: embedded .. in .. (changing to !!)
local: !! remote: !!
227 Entering Passive Mode (192,168,88,72,223,91).
550 Failed to open file.
ftp> quit
221 Goodbye.
 
real    14m32.032s
user    0m12.857s
sys     3m21.131s
[root@yang-01 re]# ls | wc -l
51200

說明:

  • 基於TCP 傳輸協議,ftp客戶端發出命令到服務端進行檔案下載、上傳或者變更目錄;
  • 適用於內網的檔案歸集以及公共檔案的調閱。
  • 偶發性的檔案傳輸,為了保障各主機之間的安全性,一般不會使用這種方式進行資料傳輸。

2.3、測試 SFTP

sftp 就是在 ftp 的基礎上補充了 加密/解密 的技術,我們也一起看下和 ftp 的傳輸速度差異:

####### 1 * 50G 檔案測試
[root@yang-01 re]# sftp root@yang-02
Connected to yang-02.
sftp> get ./big/50g_file /opt/test/re/50g_file
Fetching /./big/50g_file to /opt/test/re/50g_file
/./big/50g_file                                                      100%   50GB 128.7MB/s   06:37
sftp> quit
 
####### 51200 * 1M 檔案測試
[root@yang-01 re]# time sftp root@yang-02
Connected to yang-02.
sftp> get ./many/1m_file* /opt/test/re/
Fetching /./many/1m_file1 to /opt/test/re/1m_file1
/./many/1m_file1                                                     100% 1024KB  77.3MB/s   00:00
······
Fetching /./many/1m_file9999 to /opt/test/re/1m_file9999
/./many/1m_file9999                                                   100% 1024KB 118.0MB/s   00:00
sftp>
sftp> quit
 
real    19m43.154s
user    4m52.309s
sys     4m47.476s
 
[root@yang-01 re]# ls | wc -l
51200

說明:

  • 相較於ftp工具,在提升安全等級的基礎上對ssh傳輸進行加密,sftp 的傳輸速率降低了70%左右;
  • 使用 sftp 和 ftp 的使用需要搭建服務,使用麻煩,且 sftp 的傳輸速率類似於 scp。

2.4、測試 RSYNC

再看看 rsync 工具的測試:

####### 1 * 50G 檔案測試
[root@yang-02 big]# time rsync -av ./50g_file root@yang-01:/opt/test/re/50g_file
sending incremental file list
50g_file
 
sent 53,700,198,488 bytes  received 35 bytes  107,940,097.53 bytes/sec
total size is 53,687,091,200  speedup is 1.00
 
real    8m17.039s
user    5m36.160s
sys     2m41.196s
 
 
####### 51200 * 1M 檔案測試
[root@yang-02 many]# time rsync -av ./1m_file* root@yang-01:/opt/test/re/
sending incremental file list
1m_file1
1m_file10
1m_file100
······
1m_file9998
1m_file9999
 
sent 53,702,886,375 bytes  received 972,872 bytes  58,278,740.37 bytes/sec
total size is 53,687,091,200  speedup is 1.00
 
real    15m21.548s
user    5m46.497s
sys     2m38.581s

說明:

  • rsync從比scp稍微快一點,Centos 中預設安裝;
  • 佔用頻寬少,因為 rsync 在兩端伺服器之間傳輸資料塊時會進行解壓縮處理。
  • 優勢: rsync 只會同步發生變化的檔案,如果沒有變更, rsync 不會進行覆蓋處理,即 rsync 適合增量同步(由於場景原因,這裡沒有過多演示);
  • 如果傳輸檔案數量多的時候,rsync 工具可能會導致磁碟的 I/O 偏高,如果檔案系統中存在資料庫會產生一定影響。

2.5、測試 TFTP

類似於 sftp,測一下tftp的速度怎麼樣:

####### 1 * 50G 檔案測試
[root@yang-01 re]# time tftp yang-02
tftp> get ./big/50g_file
 
real    10m30.114s
user    0m6.029s
sys 1m16.888s
[root@yang-01 re]# ll
total 1805832
-rw-r--r-- 1 root root 1849168384 Apr 11 17:54 50g_file
[root@yang-01 re]# du -sh *
1.8G    50g_file
  
####### 1 * 1G 檔案測試
[root@yang-01 re]# time tftp yang-02
tftp> get ./many/1g_file1
tftp> quit
 
real    5m54.090s
user    0m29.190s
sys     2m58.866s
[root@yang-01 re]# ll
total 1048576
-rw-r--r-- 1 root root 1073741824 Apr 11 18:09 1g_file1

說明:

  • tftp 工具是基於UDP協議進行資料傳輸,同樣需要配置相關服務,使用過於麻煩;
  • 測試50G大檔案傳輸僅僅1.8G,發生超時中斷,fail,且時間較長;
  • 測試1個1G檔案傳輸時間為354s,推測50倍時間較長,放棄該工具的測試。

2.6、補充 NC

小編補充 nc 工具肯定是遇到了上述工具無法完成資料傳輸的場景,我們測下速度:

####### 1 * 50G 檔案測試
[root@yang-02 big]# nc 192.168.88.71 10086 < /opt/test/big/50g_file
[root@yang-01 re]# time nc -l 10086 > 50G_file
 
real    2m30.663s
user    0m9.232s
sys     2m16.370s
 
####### 51200 * 1M 檔案測試
[root@yang-01 many]# tar cfz - *|nc 192.168.88.71 10086
[root@yang-01 re]# time nc -l 10086|tar xfvz -
1m_file1
1m_file10
1m_file100
···
1m_file9997
1m_file9998
1m_file9999
 
real    11m38.400s
user    3m47.051s
sys     2m33.923s

說明:

  • 這個工具的功能很是強大,可以實現任意TCP/UDP埠的監聽與掃描;
  • 優勢:速度相比於 scp 快很多,幾乎沒有網路協議的開銷;
  • 跨機器傳輸檔案只是它的功能之一,其他功能等待大家探索,據說可以網路測速哦。

2.7、補充 python 工具

如果還有nc無法解決的場景,我們再試下使用 python 的 SimpleHTTPServer 模組吧:

####### 1 * 50G 檔案測試
[root@yang-02 big]# python -m SimpleHTTPServer 10086
Serving HTTP on 0.0.0.0 port 10086 ...
192.168.88.71 - - [13/Apr/2022 16:02:15] "GET /50g_file HTTP/1.1" 200 -
 
 
[root@yang-01 re]# wget http://192.168.88.72:10086/50g_file
--2022-04-13 16:02:15--  http://192.168.88.72:10086/50g_file
Connecting to 192.168.88.72:10086... connected.
HTTP request sent, awaiting response... 200 OK
Length: 53687091200 (50G) [application/octet-stream]
Saving to: ‘50g_file’
 
100%[==================================================================================>] 53,687,091,200  358MB/s   in 2m 35s
 
2022-04-13 16:04:50 (330 MB/s) - ‘50g_file’ saved [53687091200/53687091200]
  
  
  
####### 51200 * 1M 檔案測試
[root@yang-02 many]# python -m SimpleHTTPServer 10086
Serving HTTP on 0.0.0.0 port 10086 ...
192.168.88.71 - - [13/Apr/2022 19:46:02] "GET /1m_file1 HTTP/1.1" 200 -
192.168.88.71 - - [13/Apr/2022 19:46:02] "GET /1m_file2 HTTP/1.1" 200 -
······
192.168.88.71 - - [13/Apr/2022 19:55:21] "GET /1m_file51200 HTTP/1.1" 200 -
 
  
[root@yang-01 re]# cat liu.sh
#!/bin/bash
for ((i=1;i<=51200;i++))
do
   echo "http://192.168.88.72:10086/1m_file$i"
done
[root@yang-01 re]# bash liu.sh > liu.list
[root@yang-01 re]# cat liu.list | wc -l
51200
[root@yang-01 re]# wget -i liu.list
--2022-04-13 19:46:02--  http://192.168.88.72:10086/1m_file1
Connecting to 192.168.88.72:10086... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1048576 (1.0M) [application/octet-stream]
Saving to: ‘1m_file1’
 
100%[=====================================================================================>] 1,048,576   --.-K/s   in 0.05s
 
2022-04-13 19:46:02 (19.9 MB/s) - ‘1m_file1’ saved [1048576/1048576]
·······
100%[=====================================================================================>] 1,048,576   --.-K/s   in 0.08s
 
2022-04-13 19:55:21 (11.9 MB/s) - ‘1m_file51200’ saved [1048576/1048576]
 
FINISHED --2022-04-13 19:55:21--
Total wall clock time: 9m 19s
Downloaded: 51200 files, 50G in 8m 11s (104 MB/s)

說明:

  • 使用python的 SimpleHTTPServer 模組或者 python3 的 http.server 模組實現了一個輕量級的HTTP協議的Web伺服器;
  • Linux發行版本幾乎都內建有 python,所以該工具使用也較為方便。
  • 正常情況下,多檔案傳輸有些麻煩,檔名可能無規律,需要單檔案挨個處理。

3、總結

  1. 大檔案傳輸速率:FTP > NC > python 工具 > SCP > SFTP > RSYNC 。
  2. 小檔案傳輸速率:python 工具 > NC > FTP > RSYNC > SFTP > SCP 。
  3. 不同工具具有不同的應用場景,RSYNC在增量同步或定期歸檔的情況下速度很快;FTP工具搭建部署麻煩,適用於內網的檔案歸集以及公共檔案的調閱,安全性低。
  4. 如果由於生產安全限制,關閉了SSH連線或22埠的使用,可以使用基於其他協議的連線訪問,推薦nc工具。
  5. 對比每個工具對於同容量的檔案數量測試,小檔案會導致CPU多次讀取匹配資訊,增加CPU負擔,IO的次數也會增多,存在一定的IO瓶頸,同容量的大檔案和多個小檔案傳輸對比會有一定的速度優勢。
  6. 如果是大量檔案傳輸,可根據檔名特點分批次設定多個傳輸程式,從而達到源端伺服器併發傳輸的效果,更好的利用網路頻寬。

4、備註

  • 由於操作限制,以上測試工具均忽略互動式登入的時間。
  • 測試為虛擬機器環境,無法保證變數絕對可控(網路頻寬、吞吐、磁碟效能等影響因素),因此文中給出的時間節點僅供參考。
  • 關於各個工具的使用說明及擴充,這裡並沒有給出,網上資料很多,各位老闆隨意爬取。

彩蛋:小編測試時發現各個工具 50 1G 的傳輸速度要快於 1 50G 檔案,所以在同一環境下,會不會存在一種情況的50G容量(單檔案容量和數量的交叉匹配)傳輸速度達到最快?有興趣的小夥伴可以繼續研究下。

相關文章