bzip2 太慢。有多个核心可用

bzip2 太慢。有多个核心可用

我正在运行这个命令:

pg_dumpall | bzip2 > cluster-$(date --iso).sql.bz2

耗时太长了。我用 查看进程top。bzip2 进程占用一个核心的 95% 左右,postgres 占用 5%。入口wa较低。这意味着磁盘不是瓶颈。

我该怎么做才能提高性能?

也许可以让 bzip2 使用更多核心。服务器有 16 个核心。

或者使用 bzip2 的替代品?

我该怎么做才能提高性能?

答案1

压缩算法有很多种,Plainbzip2是其中一种较慢的算法。Plain 的gzip速度明显更快,压缩效果通常不会差很多。当速度最重要时, Plainlzop是我的最爱。压缩效果较差,但速度非常快。

我决定找点乐子,比较几种算法,包括它们的并行实现。输入文件是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

如果您的服务器的 16 个核心空闲足够多,可以全部用于压缩,那么pbzip2可能会给您带来非常显著的速度提升。但是如果您仍然需要更快的速度,并且您可以容忍大约 20% 更大的文件,那么gzip这可能是您最好的选择。

更新:我将brotli结果添加到表中(参见 TOOGAMs 的答案)。brotli的压缩质量设置对压缩率和速度有很大影响,因此我添加了三个设置(q0q1q11)。默认值为q11,但它非常慢,并且仍然比更差xzq1看起来非常好;压缩率与相同gzip,但速度是 4-5 倍!

更新:已将lbzip2(参见 gmathts 的评论)和zstd(Johnny 的评论)添加到表中,并按压缩速度对其进行排序。通过以极高的压缩率压缩三倍的速度使lbzip2bzip2系列重新回到运行状态!看起来也很合理,但在比率和速度上都被击败了。pbzip2zstdbrotli (q1)

我最初的结论是简单gzip是最好的选择,但现在看起来几乎有点愚蠢。不过就普遍性而言,它仍然无可匹敌 ;)

答案2

使用 pbzip2。

手动的说:

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

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

答案3

你没有提到操作系统。如果是 Windows,7-Zip 与 ZStandard(发布)是经过修改的 7-Zip 版本,可支持使用所有这些算法。

答案4

看起来调整(降低)块大小会对压缩时间产生重大影响。

以下是我在自己的机器上进行的实验的一些结果。我使用该time命令来测量执行时间。input.txt是一个包含任意 json 记录的 ~250mb 文本文件。

使用默认(最大)块大小(--best仅选择默认行为):

# time cat input.txt | bzip2 --best > input-compressed-best.txt.bz

real    0m48.918s
user    0m48.397s
sys     0m0.767s

使用最小的块大小(--fast参数):

# time cat input.txt | bzip2 --fast > input-compressed-fast.txt.bz

real    0m33.859s
user    0m33.571s
sys     0m0.741s

这是一个有点令人惊讶的发现,考虑到文档中说:

压缩和解压缩速度几乎不受块大小的影响

相关内容