我正在运行这个命令:
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
的压缩质量设置对压缩率和速度有很大影响,因此我添加了三个设置(q0
、q1
和q11
)。默认值为q11
,但它非常慢,并且仍然比更差xz
。q1
看起来非常好;压缩率与相同gzip
,但速度是 4-5 倍!
更新:已将lbzip2
(参见 gmathts 的评论)和zstd
(Johnny 的评论)添加到表中,并按压缩速度对其进行排序。通过以极高的压缩率压缩三倍的速度使lbzip2
该bzip2
系列重新回到运行状态!看起来也很合理,但在比率和速度上都被击败了。pbzip2
zstd
brotli (q1)
我最初的结论是简单gzip
是最好的选择,但现在看起来几乎有点愚蠢。不过就普遍性而言,它仍然无可匹敌 ;)
答案2
使用 pbzip2。
这手动的说:
pbzip2 是 bzip2 块排序文件压缩器的并行实现,它使用 pthreads 并在 SMP 机器上实现近乎线性的加速。此版本的输出与 bzip2 v1.0.2 或更新版本完全兼容(即:使用 pbzip2 压缩的任何内容都可以使用 bzip2 解压)。
它会自动检测您拥有的处理器数量并相应地创建线程。
答案3
-
Google 的 brotli 是一种较新的格式,最近在浏览器中获得了广泛的支持,因为它具有令人印象深刻的压缩率、令人印象深刻的速度,以及这两种特性最令人印象深刻的组合/平衡。
一些数据:
Brotli、Deflate、Zopfli、LZMA、LZHAM 和 Bzip2 压缩算法的比较
- 例如,这张图表报告数据显示 Brotli 比 Bzip2 快大约 6-14。
CanIUse.com:功能:brotli显示支持 Microsoft Edge、Mozilla Firefox、Google Chrome、Apple Safari、Opera(但不支持 Opera Mini 或 Microsoft Internet Explorer)。
比较:Brotli、deflate、zopfli、lzma、lzham、bzip2
- 如果您要寻找的是压缩速度,那么您要寻找的是图表上哪些线更靠右。(图表顶部的条目显示压缩率很紧。越高=越紧。但是,如果压缩速度是您的首要任务,那么您将需要更加关注图表上哪些线更靠右。)
- Facebook 的 ZStandard 是另一种选择,它致力于减少位数,但也高度注重以减少预测失误的方式存储数据,从而提高速度。它的主页位于: 使用 ZStandard 实现更小、更快的数据压缩
- 蜥蜴压缩率不如 Brotli 或 ZStandard 高,但压缩率可能比较接近,而且速度要快得多(至少根据这张图表这是关于速度的,尽管这是报告减压)
你没有提到操作系统。如果是 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
这是一个有点令人惊讶的发现,考虑到文档中说:
压缩和解压缩速度几乎不受块大小的影响