压缩工具对比

作者:Kingsley G. Morse Jr.

数据压缩效果非常好,以至于流行的备份和网络工具都内置了一些压缩功能。Linux 提供了十几种压缩工具可供选择,而且大多数工具还允许您选择压缩级别。为了找出哪些工具性能最佳,我基准测试了 87 种工具和级别的组合。阅读本文,了解哪种压缩器比其他压缩器快一百倍,以及哪种压缩器压缩率最高。

Linux 最流行的数据压缩工具是 gzip,它允许您选择从 1 到 9 的压缩级别。级别 1 速度快,级别 9 压缩效果好。当处理千兆字节的数据需要数小时时,在速度和压缩率之间选择一个好的权衡变得非常重要。您可以从图 1 所示的图中了解您的选择。最快的选择在左侧,压缩率最高的选择在顶部。最佳的综合性能者在图的左上角呈现。

Compression Tools Compared

图 1. 增加 gzip 中的压缩级别会增加压缩率和完成所需的时间。

但是 Linux 中还有许多其他数据压缩工具可供选择。请参阅图 2 和图 3 中全面的压缩和解压缩基准测试。与 gzip 一样,性能最佳的工具位于左上角,但这些图表的时间轴是对数刻度,以适应它们工作速度的巨大差异。

Compression Tools Compared

图 2. 多种实用程序的性能,压缩

Compression Tools Compared

图 3. 多种实用程序的性能,解压缩

基准测试

数据可以压缩到多紧凑的程度取决于数据的类型。不要期望从已经压缩的数据(例如 Ogg Vorbis、MP3 或 JPEG 格式的文件)中获得大的性能提升。另一方面,我见过一些数据允许性能提升 1,000%!

本文中的所有基准测试都使用了相同的 45MB 典型 Linux 数据,其中包含

  • 24% ELF 32 位 LSB

  • 15% ASCII C 程序

  • 11% gzip 压缩数据

  • 8% ASCII 英文文本

  • 7% 二进制包

  • 4% 目录

  • 2% 当前 ar 存档

  • 2% Texinfo 源代码文本

  • 2% PostScript 文档文本

  • 2% Bourne shell 脚本

  • 2% ASCII 文本

  • 21% 各种其他数据类型

选择此数据集是因为它比传统的 Canterbury 和 Calgary 测试数据更能代表当今 Linux 系统的需求,因为此数据集更大并且包含 Linux 二进制文件。

所有测试都使用了相同的轻负载 AMD Athlon XP 1700+ CPU,配备 1GB RAM 和 Linux 内核版本 2.4.27-1-k7。通过将数据预加载到 RAM 中,最大限度地减少了不可预测的磁盘驱动器延迟。经过时间以千分之一秒为单位测量。我与任何工具都没有关联,并且我努力做到客观和准确。

更好的备份

图 4 和图 5 所示的图中突出了压缩更多 更快的工具。将这些用于备份到磁盘驱动器。请记住,它们的时间轴是对数刻度。红线显示性能最佳的工具,绿线显示也可以充当过滤器的顶级性能者。

Compression Tools Compared

图 4. 最佳备份实用程序,压缩

Compression Tools Compared

图 5. 最佳备份实用程序,解压缩

过滤器

过滤器是可以命令行链接在一起的工具,以便一个工具的输出可以优雅地管道传输到下一个工具的输入。一个常见的例子是

$ ls | more

过滤对于加速网络传输至关重要。没有它,您必须等待所有数据被压缩后才能传输任何数据,并且您需要等待整个传输完成才能开始解压缩。过滤器通过允许数据同时压缩、传输和解压缩来加速网络传输。如果您发送足够的数据,这会以可忽略的延迟发生。过滤器还消除了对文件中间存档的需求。

检查您想要的数据压缩工具是否安装在两台计算机上。如果未安装,您可以在本文的在线资源中查看在哪里获取它。请记住替换a/dir在以下示例中使用要备份的数据的真实路径。

除非您的数据已经在一个大文件中,否则请明智地使用 tar 等工具将其整合。聚合数据具有更多冗余可以消除,因此最终更易于压缩。

但请注意,削弱您性能的冗余也可能使您更容易从损坏中恢复。如果您担心损坏,您可能需要考虑使用 cksum 命令对其进行测试,或者使用 parchive 或 ras 等工具将少量冗余添加回您的压缩数据中。

lzop 通常是最快的工具。它比 gzip 快大约三倍,但仍然压缩几乎相同量的数据。它比 lzma 和 7za 快大约一百倍。此外,lzop 偶尔解压缩数据的速度甚至比简单地复制它还快!在命令行上将 lzop 用作过滤器,与名为 tar 的备份工具一起使用

$ tar c a/dir | lzop - > backup.tar.lzo

tar 的 c 选项告诉它从 a/dir 中的文件创建一个大存档。| 是一个 shell 命令,它自动将 tar 的输出管道传输到 lzop 的输入。- 告诉 lzop 从其标准输入读取,> 是一个 shell 命令,它将 lzop 的输出重定向到名为 backup.tar.lzo 的文件。

您可以使用以下命令恢复:

$ lzop -dc backup.tar.lzo | tar x

d 和 c 选项告诉 lzop 解压缩并写入标准输出。tar 的 x 选项告诉它从存档中提取原始文件。

虽然 lzop 令人印象深刻,但您可以获得更高的压缩率——高得多!方法如下。将一种鲜为人知的数据压缩工具 lzma 与 tar 结合使用,可有效增加 400% 的存储空间。以下是您如何使用它来备份

$ tar c a/dir | lzma -x -s26 > backup.tar.lzma

lzma 的 -x 选项告诉它压缩更多,其 -s 选项告诉它使用多大的字典。

您可以使用以下命令恢复:

$ cat backup.tar.lzma | lzma -d | tar x

-d 选项告诉 lzma 解压缩。您需要耐心才能将存储空间增加 400%;lzma 花费的时间大约是 gzip 的 40 倍。换句话说,一个小时的 gzip 备份可能需要 lzma 整整一天的时间。

这个版本的 lzma 是最难找到的压缩器。确保您获得充当过滤器的那个。请参阅资源以了解其两个位置。

在速度和压缩率之间权衡取舍的最佳数据压缩工具是 rzip。在压缩级别 0 时,rzip 比 gzip 快大约 400% 并且 将数据压缩了 70% 以上。rzip 通过使用更多工作内存来实现这一壮举。gzip 在压缩期间仅使用 32KB 的工作内存,而 rzip 最多可以使用 900MB,但这没关系,因为内存越来越便宜。

这是很大的但是:rzip 还不能作为过滤器工作。除非您的数据已经在一个文件中,否则您暂时需要一些额外的磁盘空间来存储 tar 存档。如果您想从事一个能够震撼 Linux 世界的好项目,请增强 rzip 以使其可以作为过滤器工作。在那之前,rzip 是将大量数据压缩到 CD 或 DVD 上的一个特别好的选择,因为它性能良好,并且您可以使用硬盘驱动器来存储临时 tar 文件。

以下是如何使用 rzip 进行备份

$ tar cf dir.tar a/dir
$ rzip -0 dir.tar

-0 选项表示使用压缩级别 0。除非您使用 rzip 的 -k 选项,否则它会自动删除输入文件,在本例中为 tar 存档。如果您想保留原始文件,请确保使用 -k。

rzip 压缩的 tar 存档可以使用以下命令恢复:

$ rzip -d dir.tar.rz
$ tar xf dir.tar

rzip 的默认压缩级别是另一个顶级性能者。它可以将您的有效磁盘空间增加 375%,但仅需 lzma 所需时间的五分之一左右。使用它几乎与上面的示例完全相同;只需省略压缩级别 -0 即可。

更好的带宽

数据压缩还可以加速网络传输。加速多少取决于您的 CPU 和网络的速度。具有快速 CPU 的慢速网络可以通过彻底压缩数据来最大程度地加速。或者,具有快速连接的慢速 CPU 最适合不进行压缩。

在图 6 所示的图中找到最适合您硬件的压缩器和压缩级别。此图的 CPU 和网络速度轴也是对数刻度。查看图中 CPU 和网络速度相交的位置,并尝试该点的数据压缩工具和压缩级别。它还应该让您了解您的带宽可能会增加多少。

Compression Tools Compared

图 6. 提高各种硬件带宽的最佳压缩器

网络传输估算

为了找到适用于各种 CPU 和网络速度的最佳压缩器,我考虑了压缩数据、发送数据和解压缩数据所需的时间。我通过简单地缩放我的 1.7GHz CPU 的实际测试结果,预测了在各种速度的计算机上压缩和解压缩应该花费的时间。例如,3.4GHz CPU 应该将数据压缩速度提高大约两倍。同样,我通过将压缩数据的大小除以网络的实际速度来估算传输时间。

对于非过滤数据压缩工具(例如 rzip),总传输时间应该大约是估计的压缩、发送和解压缩数据时间的总和。

但是,可以充当过滤器的压缩器(例如 gzip)具有优势。它们可以同时压缩、传输和解压缩。我假设它们的总传输时间受三个步骤中最慢的步骤支配。我通过定时实际传输来验证了一些估计。

例如,如果您有一个 56Kbps 的拨号调制解调器和一个 3GHz 的 CPU,它们的速度在图顶部标记为 lzma 26 的浅黄色区域相交。这对应于使用带有 226 大小字典的 lzma。该图预测有效带宽增加 430%。

另一方面,如果您有一个 1GHz 的网络,但只有一个 100MHz 的 CPU,那么简单地发送原始未压缩的数据应该更快。这在图底部的黑色平坦区域中描述。

但是,不要认为您总是应该通过使用 lzma 来最大程度地提高性能。数据传输的最佳压缩工具取决于您的特定 CPU 速度与您的特定网络速度的比率。

如果发送和接收计算机具有不同的 CPU 速度,请尝试在图中查找发送计算机的速度。压缩可能更占用 CPU。检查数据压缩工具和 scp 是否安装在两台计算机上。请记住将 user@box.com 和 file 替换为真实名称。

对于落在图表浅黄色区域中的最快 CPU 和/或最慢的网络连接,请像这样加速您的网络传输

$ cat file \
| lzma -x -s26 \
| ssh user@box.com "lzma -d > file"

ssh 代表安全外壳。这是一种在远程计算机上执行命令的安全方法。这可能会将您的网络传输速度提高 400% 以上。

对于落在图表深黄色区域中的快速 CPU 和/或慢速网络,请使用压缩级别为 1 的 rzip。由于 rzip 不能作为过滤器工作,因此您需要在源框上为压缩文件提供临时空间

$ rzip -1 -k file
$ scp file.rz user@box.com:
$ ssh user@box.com "rzip -d file.rz"

-1 告诉 rzip 使用压缩级别 1,-k 告诉它保留其输入文件。请记住在 scp 命令末尾使用 :。

rzip 压缩的网络传输速度可以提高 375%。一个小时的传输可能只需 16 分钟即可完成!

对于落在图表橙色区域中的稍慢的 CPU 和/或更快的网络,请尝试使用压缩级别为 1 的 gzip。方法如下

$ gzip -1c file | ssh user@box.com "gzip -d > file"

它可能会使您的有效带宽增加一倍。-1c 告诉 gzip 使用压缩级别 1 并写入标准输出,-d 告诉它解压缩。

对于落在图表蓝色区域中的快速网络连接和慢速 CPU,请使用压缩级别 1 的 lzop 快速压缩一点

$ lzop -1c file | ssh user@box.com "lzop -d > file"

-1c 告诉 lzop 使用压缩级别 1 并写入标准输出。-d 告诉它解压缩。即使使用这种最小的压缩,您仍然可以将硬件的有效带宽提高 75%。

对于落在图表黑色区域中的网络连接和 CPU,请完全不要压缩。直接发送即可。

C 库

如果您想要更高的性能,您可能需要尝试从您自己的程序中调用 C 压缩库。

表 1. C 库

工具
lzopliblzo1
gzip, zipzlib1g, zlibc, zlib, zziplib
bzip2libbzip2
7za, lzmalzma

本文资源: /article/8403

Kingsley G. Morse Jr. 使用计算机已有 29 年,而 Debian GNU/Linux 已在他的桌面上使用了 9 年。他曾在惠普工作,并倡导男性生殖权利。可以通过 change@nas.com 与他联系。

加载 Disqus 评论