快速压缩大量大文件

anu*_*anu 16 tar shell-script bzip2 optimization

我每天生成大约 200 GB 的日志数据,分布在大约 150 个不同的日志文件中。

我有一个脚本将文件移动到一个临时位置,并在临时目录上执行 tar-bz2。

我得到了很好的结果,因为 200 GB 的日志被压缩到大约 12-15 GB。

问题是压缩文件需要很长时间。该cron的工作上午2:30每天运行,并继续运行,直到5:00-6:00 PM。

有没有办法提高压缩速度,更快地完成工作?有任何想法吗?

不要担心其他进程和所有,压缩发生的位置在NAS 上,我可以在专用VM上运行挂载 NAS并从那里运行压缩脚本。

以下是top的输出供参考:

top - 15:53:50 up 1093 days,  6:36,  1 user,  load average: 1.00, 1.05, 1.07
Tasks: 101 total,   3 running,  98 sleeping,   0 stopped,   0 zombie
Cpu(s): 25.1%us,  0.7%sy,  0.0%ni, 74.1%id,  0.0%wa,  0.0%hi,  0.1%si,  0.1%st
Mem:   8388608k total,  8334844k used,    53764k free,     9800k buffers
Swap: 12550136k total,      488k used, 12549648k free,  4936168k cached
 PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7086 appmon    18   0 13256 7880  440 R 96.7  0.1 791:16.83 bzip2
7085  appmon    18   0 19452 1148  856 S  0.0  0.0   1:45.41 tar cjvf /nwk_storelogs/compressed_logs/compressed_logs_2016_30_04.tar.bz2 /nwk_storelogs/temp/ASPEN-GC-32459:nkp-aspn-1014.log /nwk_stor
30756 appmon    15   0 85952 1944 1000 S  0.0  0.0   0:00.00 sshd: appmon@pts/0
30757 appmon    15   0 64884 1816 1032 S  0.0  0.0   0:00.01 -tcsh
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 25

第一步是找出瓶颈是什么:是磁盘 I/O、网络 I/O 还是 CPU?

如果瓶颈是磁盘 I/O,那么您无能为力。确保磁盘不会处理许多并行请求,因为这只会降低性能。

如果瓶颈是网络 I/O,则在存储文件的机器上运行压缩过程:在具有更强大 CPU 的机器上运行它只有在 CPU 是瓶颈时才有帮助。

如果瓶颈是 CPU,那么首先要考虑的是使用更快的压缩算法。Bzip2 不一定是一个糟糕的选择——它的主要弱点是解压速度——但是你可以使用 gzip 并牺牲一些大小来提高压缩速度,或者尝试其他格式,例如 lzop 或 lzma。您还可以调整压缩级别:bzip2 默认为-9(最大块大小,因此最大压缩,但也是最长压缩时间);将环境变量设置BZIP2为一个值,比如-3尝试压缩级别 3。这个线程这个线程讨论了常见的压缩算法;特别是 derobert 引用的这篇博客文章给出了一些基准,表明gzip -9bzip2bzip2 -9. 另一个基准测试也包括 lzma(7zip 的算法,因此您可以使用7z代替tar --lzma)表明lzma在低级别可以更快地达到 bzip2 压缩率。几乎除了 bzip2 之外的任何选择都会缩短解压时间。请记住,压缩率取决于数据,压缩速度取决于压缩程序的版本、编译方式以及执行程序的 CPU。

如果瓶颈是 CPU 并且您有多个内核,则另一个选择是并行压缩。有两种方法可以做到这一点。一种适用于任何压缩算法的方法是单独压缩文件(单独或成组)并用于parallel并行运行存档/压缩命令。这可能会降低压缩率,但会提高单个文件的检索速度并适用于任何工具。另一种方法是使用压缩工具的并行实现;这个线程列出了几个。

  • “如果瓶颈是磁盘 I/O,那么你无能为力。” 这在这里可能是正确的,因为压缩率已经很好,但一般来说,当 I/O 是瓶颈时,值得考虑使用更多的 CPU 以获得更好的压缩率(使用不同的压缩设置或不同的算法)。 ..你不能真正减少“I”(因为你需要读入所有数据)但有时你可以显着减少“O”:-) (4认同)

maz*_*azs 17

您可以安装pigz、并行 gzip,并将 tar 与多线程压缩一起使用。喜欢:

tar -I pigz -cf file.tar.gz *
Run Code Online (Sandbox Code Playgroud)

-I选项在哪里:

-I, --use-compress-program PROG
  filter through PROG
Run Code Online (Sandbox Code Playgroud)

当然,如果您的 NAS 没有多核/强大的 CPU,那么您无论如何都会受到 CPU 能力的限制。

运行虚拟机和压缩的硬盘/阵列的速度也可能是一个瓶颈。

  • 这是你最好的答案。但首先,请确保您的第一步是移动到与原始文件位于同一文件系统上的位置。否则,您的“移动”实际上是一个字节复制然后删除。在同一个文件系统上,移动是文件系统链接的重新排列。这要快几个数量级。对于数百 GB 大的日志文件,pigz 发挥了重要作用。您可以告诉它要运行多少个并行线程。只要你的cpu有多个核心,我就不会花很多时间调查。在任何情况下,您都可能想要 pigz;您可以立即获得加速。 (2认同)

Emi*_* L. 9

到目前为止,压缩数据的最快和最有效的方法是生成更少的数据。

你生成什么类型​​的日志?每天 200GB 听起来很多(除非你是 google 或某些 ISP...),考虑到 1MB 的文本大约是 500 页,所以你每天生成相当于 1 亿页的文本,你会在一周内填满国会图书馆。

查看您的日志数据,如果您可以以某种方式减少它并仍然从日志中获得您需要的内容。例如,通过降低日志级别或使用更简洁的日志格式。或者,如果您使用日志进行统计,请即时处理统计信息并转储带有摘要的文件,然后在压缩存储之前过滤日志。

  • 这是一个有趣的哲学解决方案。大多数生活问题的解决方案是完全避免出现问题,不是吗。直到有人仔细检查该建议并意识到要实现这一目标必须经过数百人和数以千计的批准。 (3认同)
  • 好吧.. 现在我不再在那里工作了,我至少可以透露这是 Apple 的一个问题。更具体地说,在为在线应用程序商店提供服务的服务堆栈上......所以是的,1000 次批准几乎是现实,因为他们有 1000 次微服务,并且每个微服务都生成需要压缩的日志,并且必须在更改它们时签字日志级别等......无论如何......我们为这个内部btw找到了一个解决方案......这几乎相当于并行gzip被卸载到另一个微服务。 (2认同)