在强大的集群上压缩(即归档到单个文件)数百万个小文件以加快文件传输的最快方法

viv*_*oru 3 unix zip tar 7-zip

重要说明:压缩不是目标,归档/录音(将所有文件打包到一个档案中)才是目标。

我想备份一个目录,其中包含数百个子目录和数百万个小文件 (< 800 KB)。当使用rsync将这些文件从一台机器复制到另一台远程机器时,我注意到传输速度非常低,只有大约 1 MB/秒,而当我复制大文件(例如 500 GB)时,传输速度在事实上大约 120 MB/秒。所以网络连接不是问题。

在这种情况下,仅移动 200 GB 这样的小文件就花了我大约 40 个小时。所以我想压缩包含这些文件的整个目录,然后将压缩的存档传输到远程机器,然后在远程机器上解压缩。我不希望这种方法能将 40 小时减少到 5 小时,但我怀疑它肯定会花费不到 40 小时。

我可以访问具有14 个 CPU 内核(56 个线程——Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz)和 128 GB RAM 的集群。因此,CPU/RAM 功率不是问题。

但是,从这么多文件中创建单个存档的最快和最有效的方法是什么?我目前只知道这些方法:

但是,我不知道哪个更快,以及应该如何调整参数以达到最大速度?(例如,使用 7zip 的所有 CPU 内核还是仅使用一个内核更好?)

NB文件大小和压缩率根本不重要。我根本不想节省空间。我只是想从这么多文件中创建一个存档,以便传输速率为 120 MB/s 而不是 1 MB/s。

相关如何使 7-Zip 更快

dav*_*dgo 6

使用tar,但放弃 gzipping 部分。TAR 的全部意义在于将文件转换为单个流(它代表磁带存档)。根据您的进程,您可以将流写入磁盘并复制它,但更有效的是,您可以将它(例如通过 SSH)通过管道传输到另一台机器 - 可能同时解压缩它。

因为该过程是 IO 密集型而不是 CPU 密集型,所以并行化该过程不会有太大帮助,如果有的话。您将减少文件传输的大小(如果文件不能被块大小完全整除),并且由于没有前后协商每个文件,您将节省很多

要创建未压缩的 tar 文件:

tar -cf file.name /path/to/files
Run Code Online (Sandbox Code Playgroud)

要通过网络进行流式传输:

tar -c /path/to/files | ssh user@dest.domain 'cd /dest/dir && tar -x'
Run Code Online (Sandbox Code Playgroud)

注意:如果按照示例 1 将中间文件写入硬盘驱动器,如果压缩量足够大,实际上 gzip 文件可能会更快,因为它会减少写入磁盘的数量,这是过程。