bzip2 太慢了。多核可用

gue*_*tli 37 postgresql performance gzip

我正在运行这个命令:

pg_dumpall | bzip2 > cluster-$(date --iso).sql.bz2
Run Code Online (Sandbox Code Playgroud)

这需要太长时间。我用top. bzip2 进程占用一个内核的大约 95% 和 postgres 的 5%。该wa条目是低的。这意味着磁盘不是瓶颈。

我可以做些什么来提高性能?

也许让 bzip2 使用更多的内核。服务器有 16 个内核。

或者使用 bzip2 的替代品?

我可以做些什么来提高性能?

mar*_*elm 64

有许多压缩算法,并且bzip2是较慢的算法之一。平原gzip往往要快得多,通常压缩不会差很多。当速度最重要时,lzop是我的最爱。压缩很差,但是太快了。

我决定找点乐子,比较一些算法,包括它们的并行实现。输入文件是pg_dumpall我工作站上命令的输出,一个 1913 MB 的 SQL 文件。硬件是较旧的四核 i5。时间只是压缩的挂钟时间。并行实现设置为使用所有 4 个内核。按压缩速度排序的表。

Algorithm     Compressed size        Compression          Decompression

lzop           398MB    20.8%      4.2s    455.6MB/s     3.1s    617.3MB/s
lz4            416MB    21.7%      4.5s    424.2MB/s     1.6s   1181.3MB/s
brotli (q0)    307MB    16.1%      7.3s    262.1MB/s     4.9s    390.5MB/s
brotli (q1)    234MB    12.2%      8.7s    220.0MB/s     4.9s    390.5MB/s
zstd           266MB    13.9%     11.9s    161.1MB/s     3.5s    539.5MB/s
pigz (x4)      232MB    12.1%     13.1s    146.1MB/s     4.2s    455.6MB/s
gzip           232MB    12.1%     39.1s     48.9MB/s     9.2s    208.0MB/s
lbzip2 (x4)    188MB     9.9%     42.0s     45.6MB/s    13.2s    144.9MB/s
pbzip2 (x4)    189MB     9.9%    117.5s     16.3MB/s    20.1s     95.2MB/s
bzip2          189MB     9.9%    273.4s      7.0MB/s    42.8s     44.7MB/s
pixz (x4)      132MB     6.9%    456.3s      4.2MB/s     7.9s    242.2MB/s
xz             132MB     6.9%   1027.8s      1.9MB/s    17.3s    110.6MB/s
brotli (q11)   141MB     7.4%   4979.2s      0.4MB/s     3.6s    531.6MB/s
Run Code Online (Sandbox Code Playgroud)

如果您的服务器的 16 个内核足够空闲,所有内核都可以用于压缩,pbzip2则可能会给您带来非常显着的加速。但是您仍然需要更高的速度,并且您可以容忍大约 20% 的文件,gzip这可能是您最好的选择。

更新:brotli在表格中添加了(参见 TOOGAMs 答案)结果。brotli小号压缩质量设置对压缩率和速度非常大的影响,所以我添加三个设置(q0q1,和q11)。默认是q11,但它非常慢,而且仍然比xz. q1不过看起来很不错;与 相同的压缩比gzip,但速度是 4-5 倍!

更新:新增lbzip2(见gmathts评论)和zstd(约翰尼的评论)表中,并通过压缩速度来分类的。以高压缩比压缩三倍,lbzip2bzip2家人重新投入使用pbzip2zstd看起来也很合理,但brotli (q1)在比率和速度上都被击败了。

我最初的结论是简单gzip是最好的选择,这开始看起来几乎是愚蠢的。虽然无处不在,但它仍然无法被击败;)

  • 有关具有更多算法的类似表,请参阅 http://mattmahoney.net/dc/text.html。 (2认同)
  • 如果你愿意测试多线程版本,你也可以尝试`zstd -T4`。对于非常快的设置,您可以尝试 `zstd -T4 -1`,因为 `zstd` 默认为 `-3`,这可能是您测试的设置。 (2认同)

Tho*_*mBR 40

使用 pbzip2。

手册说:

pbzip2 是 bzip2 块排序文件压缩器的并行实现,它使用 pthreads 并在 SMP 机器上实现接近线性的加速。此版本的输出与 bzip2 v1.0.2 或更新版本完全兼容(即:任何用 pbzip2 压缩的东西都可以用 bzip2 解压)。

它会自动检测您拥有的处理器数量并相应地创建线程。

  • bzip2 可以使用相当多的内存,因此一次运行 16 个 bzip 工作程序可能会消耗超过 1GB 的非平凡内存。顺便说一句,`lbzip2` 似乎比 `pbzip2` 提供了更好的速度、内存使用和稍微更好的压缩。这里有基准测试:http://vbtechsupport.com/1614/ (5认同)

TOO*_*GAM 8

你没有提到操作系统。如果是 Windows,带有 ZStandard (Releases)的 7-Zip 是 7-Zip 的一个版本,它经过修改以提供对使用所有这些算法的支持。