我每天生成大约 200 GB 的日志数据,分布在大约 150 个不同的日志文件中。
我有一个脚本将文件移动到临时位置并在临时目录上执行 tar-bz2 。
我得到了很好的结果,因为 200 GB 日志被压缩到大约 12-15 GB。
问题是压缩文件需要很长时间。这计划任务作业每天凌晨 2:30 运行,并持续运行到下午 5:00-6:00。
有没有办法提高压缩速度并更快地完成工作?有任何想法吗?
不用担心其他进程,压缩发生的位置是在NAS,我可以在专用的虚拟机并从那里运行压缩脚本。
这是输出顶部以供参考:
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
答案1
第一步是弄清楚瓶颈是什么:是磁盘 I/O、网络 I/O 还是 CPU?
如果瓶颈是磁盘 I/O,则您无能为力。确保磁盘不会处理许多并行请求,因为这只会降低性能。
如果瓶颈是网络 I/O,请在存储文件的计算机上运行压缩进程:仅当 CPU 是瓶颈时,在具有更强大 CPU 的计算机上运行压缩进程才会有帮助。
如果瓶颈是CPU,那么首先要考虑的是使用更快的压缩算法。 Bzip2 不一定是一个糟糕的选择 - 它的主要弱点是解压缩速度 - 但您可以使用 gzip 并牺牲一些大小来提高压缩速度,或者尝试其他格式,例如 lzop 或 lzma。您还可以调整压缩级别:bzip2 默认为-9
(最大块大小,因此最大压缩,但也是最长压缩时间);将环境变量设置BZIP2
为一个值,例如-3
尝试压缩级别 3。这个线程和这个线程讨论常见的压缩算法;尤其这篇博文derobert 引用的一些基准表明,与 相比,gzip -9
或具有较低的水平可能是一个很好的折衷方案。bzip2
bzip2 -9
这个另一个基准其中还包括 lzma(7zip 的算法,因此您可以使用7z
而不是tar --lzma
)表明lzma
在较低级别可以更快地达到 bzip2 压缩比。除了 bzip2 之外的任何选择都会缩短解压时间。请记住,压缩率取决于数据,压缩速度取决于压缩程序的版本、编译方式以及执行它的 CPU。
如果瓶颈是 CPU 并且您有多个内核,则另一种选择是并行压缩。有两种方法可以做到这一点。适用于任何压缩算法的一种方法是单独压缩文件(单独或分组)并使用parallel
并行运行归档/压缩命令。这可能会降低压缩率,但会提高单个文件的检索速度,并且可以与任何工具一起使用。另一种方法是使用压缩工具的并行实现;这个线程列举几个。
答案2
您可以安装pigz
并行 gzip,并将 tar 与多线程压缩结合使用。喜欢:
tar -I pigz -cf file.tar.gz *
其中-I
选项是:
-I, --use-compress-program PROG
filter through PROG
当然,如果您的 NAS 没有多核/强大的 CPU,那么您无论如何都会受到 CPU 功率的限制。
运行虚拟机和压缩的硬盘/阵列的速度也可能是一个瓶颈。
答案3
到目前为止,最快、最有效的压缩数据方法是生成更少的数据。
您生成什么类型的日志?每天 200GB 听起来相当多(除非您是 google 或某些 ISP...),考虑到 1MB 的文本约为 500 页,因此您每天生成的文本相当于 1 亿页文本,您将一周内填满国会图书馆。
检查您的日志数据是否可以以某种方式减少它并仍然从日志中获取您需要的内容。例如,通过降低日志级别或使用更简洁的日志格式。或者,如果您使用日志进行统计,请即时处理统计信息并转储包含摘要的文件,然后在压缩存储之前过滤日志。
答案4
您可以减少压缩量(就节省的空间而言)以使其更快。首先,bzip2 比 gzip 慢得多,尽管它压缩得更小。您还可以更改 bzip2、gzip 或大多数压缩程序的压缩级别,以牺牲大小换取速度。
如果您不愿意以速度大小为代价,您仍然可以获得相同的大小或更小,同时使用使用 LZMA 的压缩器(例如 xz)仍然获得速度改进。
如果您搜索,您会找到基准测试,但最好的选择是在目标硬件上使用您自己的文件进行一些测试。