序言
记录大文件跨网络传输的优化过程。
- 环境: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 和 gunzip | 5分钟 |
ssh,使用压缩 | 4m7s |
nc,使用压缩 | 3m46 |
rsync,使用压缩(-z) | 4m22 |