bzip2太慢了。 多核或替代品

我正在运行这个命令:

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

这需要太长时间。 我看着top的进程。 bzip2进程大约占95%,postgres占一个核心的5%。 wa入口很低。 这意味着磁盘不是瓶颈。

我能做些什么来提高性能

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

或使用替代bzip2?

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

周围有很多压缩algorithm,而bzip2是较慢的压缩algorithm之一。 平原gzip往往是明显更快,通常没有太多糟糕的压缩。 当速度是最重要的, lzop是我的最爱。 可怜的压缩,但哦,这么快。

我决定有一些乐趣,并比较一些algorithm,包括它们的并行实现。 input文件是我的工作站上的pg_dumpall命令的输出,一个1913 MB的SQL文件。 硬件是一个较旧的四核i5。 时间是压缩的时钟时间。 并行实现设置为使用全部4个内核。 按压缩速度sorting的表。

 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可能是你最好的select。

更新:我添加了brotli (请参阅TOOGAMs答案)结果到表中。 brotli的压缩质量设置对压缩比和速度有很大的影响,所以我增加了三个设置( q0q1q11 )。 默认是q11 ,但是速度非常慢,比xz还差。 q1看起来非常好, 与gzip相同的压缩比,但速度是4-5倍!

更新:添加lbzip2 (请参阅gmathts评论)和zstd (Johnny的评论)到表中,并按压缩速度sorting。 lbzip2bzip2系列的压缩比pbzip2了三倍, pbzip2的运行速度更快! zstd看起来也很合理,但是在比例和速度上都被brotli (q1)击败。

我原来的结论是,简单的gzip是最好的赌注开始看起来几乎愚蠢。 虽然无处不在,但还是不能被打败;)

使用pbzip2。

手册说:

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

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

  • 谷歌的brotli是一个新的格式,最近在浏览器中得到了广泛的支持,因为它有一些令人印象深刻的压缩,一些令人印象深刻的速度,也许这两个function的最令人印象深刻的组合/平衡。

一些数据:

Brotli,Deflate,Zopfli,LZMA,LZHAM和Bzip2压缩algorithm的比较

  • 例如, 这个图表显示Brotli的数字大约比Bzip2快6-14。

CanIUse.com:function:brotli显示了Microsoft Edge,Mozilla Firefox,Google Chrome,Apple Safari,Opera(但不包括Opera Mini或Microsoft Internet Explorer)的支持。

比较:Brotli vs deflate vs zopfli vs lzma vs lzham vs bzip2

  • 如果您正在寻找压缩速度,那么您要查找的是哪个线路在这个图表上更加正确。 (这个图表顶部的条目显示的是紧缩比率,越高=越紧,但是如果压缩速度是您的优先级,那么您将需要更多地关注哪些线路会在图表上更上一层楼。

比较:7-Zip ZStandard方法的压缩比与压缩速度

  • Facebook的ZStandard是另一种select,努力减less位数,同时也非常注重存储数据,减less错过的预测,从而提高速度。 它的主页是: 使用ZStandard进行更小更快的数据压缩
  • 蜥蜴没有像Brotli或ZStandard那么高的压缩率,但是压缩比可能稍微接近一些,并且速度要快得多(至less根据这张关于速度的图表 ,尽pipe这是报告的减压)
  • 你没有提到一个操作系统。 如果是Windows, 带有ZStandard(Releases)的7-Zip是7-Zip版本,已经被修改为支持使用所有这些algorithm。

    使用zstd 。 如果Facebook足够好,那么对于你来说也可能够好。

    更严重的一点是,这其实很不错 。 我现在用它来处理所有事情,因为它可以正常工作,而且它可以让你大规模交易速度(大多数情况下,因为存储价格便宜,速度比物理尺寸还重要,但速度是瓶颈)。
    在达到与bzip2类似的整体压缩的压缩级别下,它的速度要快得多,如果你愿意花费一些额外的CPU时间,你几乎可以获得与LZMA类似的结果(尽pipe这样会比bzip2慢)。 在压缩比极低的情况下,它比bzip2或其他主streamselect快得多。

    现在,你正在压缩一个SQL转储,而这个转储就像是尴尬的压缩一样。 即使是最差的压缩机在这种数据上也得分很高。
    因此,您可以使用较低的压缩级别运行zstd ,该级别的运行速度将提高几十倍 ,并且仍然可以在该数据上实现95-99%的相同压缩率。

    作为奖励,如果您经常这样做,并且想要投入一些额外的时间,则可以提前“训练” zstd压缩机,这将提高压缩比和速度。 请注意,为了使训练工作顺利,您将需要为其提供个人logging,而不是整个事情。 该工具的工作方式,它期望许多小的和有点相似的样本训练,而不是一个巨大的一滴。