在没有 Gzip 的情况下制作 Tar 存档要快多少?

关于 Gzip 和 Tar

Linux 和 BSD 上的每个人似乎都在使用一个名为 gzip 的程序,该程序经常与另一个名为 tar 的程序结合使用。Tar 以 Tape ARchive 命名,是一种将文件和文件夹(“目录”)复制为最初设计用于在磁带上归档的格式的程序。但是 tar 存档也可以保存到磁带以外的许多其他文件系统。Tar 存档可以保存到普通硬盘、固态硬盘、NVMe 驱动器等。

在制作存档时,人们经常希望最小化存档的大小。这就是 gzip 发挥作用的地方。Gzip 减小了档案的大小,因此它们占用的存储空间更少。之后,可以“解压缩”gzip 压缩的 tar 档案。解压缩会将 tar 存档恢复到其原始大小。解压缩时,可以再次使用 tar 程序来“提取”或“解压缩”存档。提取有望恢复存档的原始文件,就像创建存档时一样。

除了用于长期存储的归档之外,许多人还经常使用 tar 和 gzip 进行短期备份。例如,在我的服务器 Darkstar 上,我编译并安装了很多程序。在编译之前,我使用 tar 对编译和安装之前的情况进行短期备份。

编译的三个好理由

首先,编译让我们得到程序的最新源代码。其次,一旦我们完成了几次编译,从最新的源代码编译一个程序比弄清楚如何使用我们的发行版的包管理器安装一个通常较旧的版本要容易得多。第三,我们自己编译导致程序源很容易获得。

我在 Darkstar 上编译的程序通常位于 /usr/local 中。在我将新程序放入 usr/local 之前,我喜欢(除了我对 Darkstar 的常规备份之外)制作 /usr/local 的存档,因为它在新软件添加之前就存在。有了一个方便的 /usr/local 存档,如果在我的新安装过程中出现了疯狂的错误,很容易恢复。

创建预编译备份可能需要很长时间

最近,随着 /usr/local 中加入的软件越来越多,制作预编译存档的时间太长了,大约有半个小时。

最近,我使用 top(1) 命令观察了正在形成的存档。我注意到 gzip 被报告为在整个存档形成过程中使用了一个 cpu 的 100%。

没有 Gzip 的普通 Tar 存档速度和容量有多大?

我想知道如果我不使用 gzip,制作预编译存档所需的总时间会有什么变化。我还想知道档案会有多大。下面显示了我发现的惊人的大创建时间差异的数据和分析。存档大小差异也很大,但远不及创建时间差异。

创建时间数据

我运行预编译存档两次,一次使用 gzip,一次不使用 gzip。 我为这两个测试制作了行编号的成绩单。

000023 root@darkstar:/usr# time tar cvzf local-revert.tgz local
000024 local/
[ . . . ]
401625 local/include/gforth/0.7.3/config.h
401626
401627 real 28m11.063s
401628 user 27m1.436s
401629 sys 1m21.425s
401630 root@darkstar:/usr# time tar cvf local-revert.tar local
401631 local/
[ . . . ]
803232 local/include/gforth/0.7.3/config.h
803233
803234 real 1m14.494s
803235 user 0m4.409s
803236 sys 0m46.376s
803237 root@darkstar:/usr#

这篇 Stack Overflow 帖子解释了 time(1) 命令报告的真实时间、用户时间和系统时间之间的差异。 “真实”时间是挂钟时间,因此“真实”时间显示了我们的命令完成所需的时间。

Gzip 花费了 22 倍的时间!

在这里,我们可以看到使用 gzip 制作存档大约需要 28 分钟。在没有 gzip 的情况下制作存档只用了 1.25 分钟。gzip 压缩文件的制作时间比解压压缩文件长 22 倍!

存档大小数据

现在让我们检查存档大小。

root@darkstar:/usr# ls -lh local-revert.t*
-rw-r--r-- 1 root root 22G Oct 4 05:22 local-revert.tar
-rw-r--r-- 1 root root 10G Oct 4 05:20 local-revert.tgz
root@darkstar:/usr#

gzipped 存档为 10 GB,而普通的未压缩 tar 存档为 22 GB。

Gzip 的压缩率为 55%

压缩档案压缩了 55%。 这是一个很大的压缩!

结论

在 Darkstar 上,有充足的额外磁盘空间。因此,拥有两倍大但创建速度快 22 倍的存档可能是最佳选择。展望未来,在编译之前,我将在备份 /usr/local 以启用恢复时完全跳过任何压缩。现在我再也不用等那半个小时了!

额外的思考

创建时间和存档大小结果预计会根据所涉及文件的类型而有所不同。例如,与 Darkstar 的 /usr/local 中的文件不同,许多图像文件格式已经被压缩,因此额外的压缩不会减少它们的大小。

在准备这篇文章时,我发现了 pigz。Pigz(发音为“pig-zee”)是 gzip w 的一个实现,其允许利用多核处理器。也许 pigz 很快就会成为 Darkstar 的 /usr/local 的新邻居。

另一种加速压缩的方法是使用不同于 gzip 的压缩程序。有很多流行的,例如 bzip2 和 xz。可以使用 tar 的 -I 选项调用这些其他压缩程序。

当然,用 tar 的 -I 选项改变压缩程序是一回事,让 tar 本身并行工作是另一回事。这是一篇关于并行处理 tarring 的 Stack Exchange 帖子。我将不得不尝试一下。

最后,与我们分别获取源代码和编译程序不同,我们自己编译的源代码是我们实际运行的程序的源代码,这一点似乎很清楚。然而,早在 1984 年,Ken Thompson 就意识到我们自己编译的程序有时可能与我们的预期大相径庭。


【AD】炭云:768元/年/1GB内存/20GB SSD空间/2TB流量/500Mbps-1Gbps端口/独立IPv4/KVM/广州移动

【AD】美国洛杉矶CN2 VPS/香港CN2 VPS/日本CN2 VPS推荐,延迟低、稳定性高、免费备份_搬瓦工vps