关于大量小文件拷贝的那些事儿(一)
因为公司项目涉及到了从不同服务器拷贝大量小图片的工作,所以做了个测试来测拷贝小文件的性能。
测试了76000个小文件,每个大小200K-300K左右,一共87250M
两台都是linux centos7.5 内存140G ,cpu 为intel E5-2620,千兆网卡。
磁盘大小为500G,型号是Seagate Constellation ES的ST500nm0011
为排除系统缓存的影响,每次测试前,都执行
sync
echo 3 > /proc/sys/vm/drop_caches
这两条命令清除缓存
不同的传递方式性能如下:
| 方式 | 耗时 | 平均速率 |命令 |
| ------------- |:----------------:| -----------------:|---------------------------------------------------------------------:|
| scp | 00:59:38 |24.2M/S |scp -r srcDir destIp:destDir |
| rsync | 00:14:59 |96.9M/S |rsync -aW -e ssh srcDir destIp:destDir |
| tar | 00:14:58 |96.9M/S | ssh destIp `tar -xf - -C destDir` |
有同事指出,先打包(由于是图片,再次压缩没有多大的意义,不压缩只打包,大小增大为91075M),再scp是不是会快一些。我也测试了一下这种方案的性能,数据如下:
| 过程 | 耗时 | 平均速率 |命令 |
| ------------- |:------------------:| --------------:|--------------------------------------------------------------------:|
| 打包 | 00:50:56 | |tar -cf srcDir.tgz srcDir |
| 传输(scp) | 00:15:32 |97.1M/s |scp srcDir.tgz destIp:destDir |
| 解包 | 00:28:04 | |tar -xf destIp:destDir/destDir.tgz -C destIp:destDir |
网上有很多资料都说ftp的方式很慢,多线程下载小文件的方式我没有(如果以后有时间,我会测的),但下载打包后的整个大文件我测了一下,性能如下:
| 传输(ftp) | 00:13:54 |108.4M/s |ftp get dstDir.tgz |
结论:
1.linux系统跨网络拷贝小文件,打包后再传递的方式很不可取,因为要来回写磁盘,打包落盘的时间比传输长。
2.rsync和tar的方式都比较快,差距不大。scp的方式慢。
参考链接