Administrator
发布于 2023-03-08 / 21 阅读
0
0

Linux 大文件传输优化

序言

记录大文件跨网络传输的优化过程。

  • 环境:CentOS 7
  • 文件:1.8G test.txt
  • gzip默认选项压缩:117M test.gz
  • 网络:500k/s左右
  • 源服务器:server1
  • 接收服务器:server2

一、不使用压缩,使用SCP传输

执行如下命令:

server1$ scp test.txt root@server2:~/

完成时间:1小时2分钟。
结论:最原始的方法,速度极慢,除非有千兆、万兆的网络不然不考虑。

二、使用压缩,使用SCP传输

server1压缩、传输

server1 gzip -c test.txt > test.gz server1 scp test.txt root@server2:~/

server2解压

server2$ gunzip -c test.gz > test.txt

完成时间:共花费近5分钟;压缩花费41s,传输花费4m4s,解压花费11s。
结论:这大概是最简单的实现方法了,但效率并不高。因为压缩、传输、解压这三个步骤都需要读/写磁盘,具体操作是:在server1上gzip既要读又要写,scp在server1上读而在server2上写,gunzip在server2既要读又要写。

三、使用压缩,使用SSH传输

server1$ gzip -c test.txt | ssh root@server2 "gunzip -c - > ~/test.txt"

参数解释:-c表示处理过的内容写到标准输出,- 作为解压文件表示从标准输入读入(read stdin)。SCP也是基于SSH的安全协议。
完成时间:4m7s
结论:这个方法会更有效率,因为这能极大地降低了磁盘I/O:磁盘活动被减少到只要在server1上读,在server2上写。
扩展-打包目录:

server1$ tar cvzf - * | ssh root@server2 "tar xvzf - -C /tmp/tmp"

四、使用压缩,使用netcat传输

SSH不是跨网传输数据的最快方法,因为它增加了加解密的系统开销。如果不需要加密,可以使用netcat把"裸"数据进行跨网复制。

首先在server2上监听12345端口(闲置端口就行)上的文件,把收到的文件进行解压。注意:端口必须要放行(云服务安全组、iptables)。命令如下:

server2$ nc -l 12345 | gunzip -c - > ~/test.txt

或者

server2$ nc -l 12345 | tar xvzf -

然后在server1上开启另一个netcat实例,发送数据到目标端口上。-N表示到达文件末尾就关闭socket关闭连接,-v日志输出。

server1$ gzip -c test.txt | nc -Nv server2 12345

或者(压缩当前文件夹所有文件,-表示 write stdout)

server2$ tar cvzf - * | nc -Nv server2 12345

完成时间:3m46s
结论:简单测试的结果是比SSH传输快20s左右。但是有一点要注意,netcat要开放端口,对于没有操作服务器端口权限的用户来说不太适合。

五、使用压缩,使用rsync传输(断点续传)

  • -P:"–partial –progress",表示部分传输和进度显示
  • -z:使用压缩

server1$ rsync -P -z --rsh=ssh test.txt root@server2:/root/test.txt

常用命令:

  • ctrl + c 终止当前任务(前台运行的)
  • ctrl + z 暂停前台运行的任务,放入 jobs 列表
  • jobs -l 查询所有任务
  • fg [num] 回到前台,并继续执行任务
  • bg [num] 后台继续执行任务
  • kill [pid] 通过 pid 终止 jobs 的任务

完成时间:4m22s

总结

方法时间
不使用压缩1小时2分钟
gzip,scp 和 gunzip5分钟
ssh,使用压缩4m7s
nc,使用压缩3m46
rsync,使用压缩(-z)4m22

评论