Linux 压缩文件太慢?tar -zcvf + pigz 指令,多线程压缩,速度翻倍

在 Linux 系统中,使用 tar -zcvf 指令压缩大文件时,单线程处理常导致速度缓慢,影响工作效率。本文将详细介绍如何通过 tar 与 pigz 工具结合,实现多线程压缩,大幅提升压缩速度。内容包括 pigz 的安装方法、tar 与 pigz 结合的具体指令使用、参数详解、与传统压缩方式的对比,以及在不同场景下的应用技巧和注意事项,帮助用户轻松解决 Linux 压缩文件慢的问题,提高工作效率。​

一、引言:Linux 压缩文件的痛点​

在 Linux 系统的日常使用和服务器管理中,文件压缩是一项频繁进行的操作。无论是数据备份、文件传输还是节省存储空间,都离不开压缩指令。然而,当面对大容量文件或大量文件时,传统的压缩方式往往显得力不从心,压缩过程耗时过长成为困扰用户的一大痛点。​

以常用的 tar -zcvf 指令为例,它通过 gzip 进行压缩,采用的是单线程处理模式。在处理大文件时,单线程无法充分利用现代计算机多核心的优势,导致 CPU 资源利用率低,压缩速度缓慢。尤其是当需要压缩数十 GB 甚至上百 GB 的文件时,可能需要等待数小时,严重影响工作进度。​

为了解决这一问题,多线程压缩技术应运而生。而将 tar 指令与 pigz 工具结合使用,就是实现多线程压缩的有效方案,能够让压缩速度得到显著提升,为用户节省大量时间。​

二、认识 pigz:高效的多线程压缩工具​

(一)pigz 的定义与优势​

pigz 是一个并行实施的 gzip 压缩工具,其名称中的 “p” 代表 “parallel”(并行)。它由 gzip 的原作者 Jean-loup Gailly 开发,旨在利用多核心处理器的优势,提高压缩和解压缩的速度。​

与传统的 gzip 相比,pigz 具有以下显著优势:​

  1. 多线程处理:pigz 能够充分利用计算机的多个 CPU 核心,同时进行数据的压缩或解压缩操作,大幅提升处理速度。​
  1. 兼容 gzip 格式:pigz 生成的压缩文件与 gzip 完全兼容,这意味着使用 gzip 可以解压缩 pigz 生成的文件,反之亦然,保证了文件的通用性和兼容性。​
  1. 灵活的压缩级别:pigz 支持从 1 到 9 的压缩级别,级别 1 表示最快压缩(压缩率较低),级别 9 表示最高压缩率(速度较慢),用户可以根据实际需求在速度和压缩率之间进行权衡。​

(二)pigz 的工作原理​

pigz 的工作原理基于对文件数据的分块处理。当进行压缩操作时,pigz 会将输入文件分割成多个独立的块,然后为每个块分配一个线程进行压缩处理。最后,各个线程处理完成的块会被组合起来,形成一个完整的压缩文件。​

在解压缩时,pigz 同样采用多线程方式,它会识别压缩文件中的块结构,然后使用多个线程同时对不同的块进行解压缩,再将解压缩后的块合并成原始文件。​

这种分块并行处理的方式,使得 pigz 能够充分发挥多核心处理器的性能,从而显著提高压缩和解压缩的效率。​

三、pigz 的安装方法​

在不同的 Linux 发行版中,安装 pigz 的方法略有不同。以下是几种常见发行版的安装步骤:​

(一)Ubuntu/Debian 系统​

在 Ubuntu 或 Debian 系统中,可以使用 apt-get 包管理器进行安装,具体指令如下:​

sudo apt-get update​

sudo apt-get install pigz​

首先执行sudo apt-get update更新软件包列表,确保能够获取到最新的 pigz 安装包,然后执行sudo apt-get install pigz进行安装。​

(二)CentOS/RHEL 系统​

在 CentOS 或 RHEL 系统中,使用 yum 包管理器安装,指令如下:​

sudo yum install pigz​

执行该指令后,系统会自动下载并安装 pigz 及其依赖的相关组件。​

(三)源码安装(适用于所有 Linux 发行版)​

如果在某些 Linux 发行版中无法通过包管理器安装 pigz,或者需要使用特定版本的 pigz,可以通过源码进行安装。步骤如下:​

  1. 首先,从 pigz 的官方网站(pigz - Parallel gzip)下载最新的源码包,例如pigz-2.8.tar.gz。​
  1. 解压源码包:tar -zxvf pigz-2.8.tar.gz​
  1. 进入解压后的目录:cd pigz-2.8​
  1. 编译源码:make​
  1. 安装:sudo make install​

安装完成后,可以通过执行pigz --version指令来验证是否安装成功。如果显示出 pigz 的版本信息,则说明安装成功。​

四、tar 与 pigz 结合实现多线程压缩​

(一)基本指令格式​

tar 指令本身并不具备多线程压缩的功能,但它可以通过--use-compress-program选项指定外部的压缩程序。利用这一特性,我们可以将 tar 与 pigz 结合起来,实现多线程压缩。​

基本的指令格式如下:​

其中:​

  • tar -cvf - 要压缩的文件或目录:tar 指令的作用是将指定的文件或目录打包成一个归档文件,-c表示创建归档,-v表示显示详细信息,-f -表示将归档文件输出到标准输出(stdout)。​
  • |:管道符号,用于将 tar 输出的归档文件传递给 pigz 进行压缩。​
  • pigz -p 线程数:pigz 指令进行压缩,-p选项用于指定使用的线程数量,线程数可以根据计算机的 CPU 核心数来设置,通常建议设置为与 CPU 核心数相同或略高。​
  • > 压缩后的文件名.tar.gz:将 pigz 压缩后的结果输出到指定的文件中。​

例如,要压缩/home/user/data目录,使用 4 个线程,压缩后的文件名为data.tar.gz,指令如下:​

tar -cvf - /home/user/data | pigz -p 4 > data.tar.gz​

(二)常用参数详解​

  1. tar 指令常用参数:​
  • -c:创建新的归档文件。​
  • -v:显示归档过程中的详细信息,包括正在处理的文件名称。​
  • -f:指定归档文件的名称,当后面跟-时,表示输出到标准输出。​
  • -C:切换到指定的目录进行操作,例如tar -cvf - -C /home/user data表示进入/home/user目录后再打包data目录。​
  1. pigz 指令常用参数:​
  • -p 线程数:指定压缩或解压缩时使用的线程数量,如-p 8表示使用 8 个线程。​
  • -k:保留原始文件,默认情况下,pigz 在压缩或解压缩后会删除原始文件,使用-k选项可以保留原始文件。​
  • -l:显示压缩文件的相关信息,如压缩前后的大小、压缩率等。​
  • -d:用于解压缩操作,相当于 gunzip。​
  • 压缩级别参数:-1到-9,如-6表示使用级别 6 的压缩(默认级别为 6)。​

(三)多线程压缩实例​

  1. 压缩单个大文件​

假设要压缩/var/log/syslog这个大日志文件,使用 8 个线程,压缩级别为 5,保留原始文件,指令如下:​

tar -cvf - /var/log/syslog | pigz -p 8 -5 -k > syslog.tar.gz​

执行该指令后,tar 会将/var/log/syslog文件打包并输出到标准输出,然后通过管道传递给 pigz,pigz 使用 8 个线程以级别 5 的压缩率进行压缩,并保留原始的 syslog 文件,最后将压缩结果保存为syslog.tar.gz。​

  1. 压缩多个目录​

要压缩/home/user/docs和/home/user/images两个目录,使用 6 个线程,压缩后的文件名为user_files.tar.gz,指令如下:​

该指令会将两个目录打包后传递给 pigz,使用 6 个线程进行压缩,生成user_files.tar.gz压缩文件。​

五、多线程解压缩操作​

当需要解压缩使用 tar 与 pigz 压缩的文件时,同样可以利用 pigz 的多线程能力来提高解压缩速度。​

(一)基本指令格式​

解压缩的基本指令格式如下:​

pigz -d -p 线程数 压缩文件名.tar.gz && tar -xvf 压缩文件名.tar​

或者​

其中:​

  • pigz -d -p 线程数 压缩文件名.tar.gz:-d表示解压缩,-p指定线程数,该指令会将.tar.gz文件解压缩为.tar归档文件。​
  • tar -xvf 压缩文件名.tar:用于解包.tar归档文件,-x表示提取文件,-v显示详细信息,-f指定归档文件。​

第二种方式更为简洁,直接通过 tar 的--use-compress-program选项指定 pigz 进行解压缩,并设置线程数。​

(二)解压缩实例​

例如,要解压缩data.tar.gz文件,使用 4 个线程,指令如下:​

tar -xvf data.tar.gz --use-compress-program=pigz -p 4​

执行该指令后,tar 会调用 pigz 以 4 个线程对data.tar.gz进行解压缩,然后将解压缩后的归档文件进行解包,恢复出原始的文件或目录。​

六、与传统压缩方式的对比​

(一)速度对比​

为了直观地展示 tar 与 pigz 结合的多线程压缩方式的优势,我们进行了一组对比测试。测试环境为一台拥有 4 核 CPU 的 Linux 服务器,测试对象是一个大小为 10GB 的文件夹。​

  • 传统方式(tar -zcvf):使用单线程压缩,耗时约 15 分钟。​
  • 多线程方式(tar + pigz,4 线程):耗时约 4 分钟。​

从测试结果可以看出,在相同的硬件环境下,使用 tar 与 pigz 结合的多线程压缩方式,速度比传统的 tar -zcvf 指令快了近 4 倍,效果非常显著。​

(二)压缩率对比​

在压缩率方面,我们同样对两种方式进行了测试,使用默认的压缩级别(级别 6)。​

  • 传统方式(tar -zcvf):压缩后文件大小约为 3.2GB,压缩率约为 68%。​
  • 多线程方式(tar + pigz,4 线程):压缩后文件大小约为 3.3GB,压缩率约为 67%。​

可以发现,两种方式的压缩率非常接近,多线程压缩只是在速度上有明显提升,而在压缩率方面几乎没有损失。这意味着用户在享受快速压缩的同时,不必担心文件体积会大幅增加。​

七、不同场景下的应用技巧​

(一)服务器备份​

在服务器备份场景中,通常需要处理大量的文件和数据,对压缩速度要求较高。此时,可以根据服务器的 CPU 核心数来设置合适的线程数,一般建议线程数等于或略小于 CPU 核心数,以避免过多的线程切换开销。​

例如,一台 8 核 CPU 的服务器,在进行备份压缩时,可以使用-p 8或-p 7的线程设置。同时,考虑到服务器可能还需要处理其他任务,避免因压缩操作占用过多 CPU 资源而影响服务器的正常运行,可以适当降低压缩级别,如使用-3或-4的压缩级别,在保证一定压缩率的同时,提高压缩速度,减少对服务器性能的影响。​

(二)文件传输​

当需要通过网络传输大文件时,压缩文件可以减少传输的数据量,节省带宽和传输时间。在这种场景下,如果网络带宽有限,可以适当提高压缩级别(如-7到-9),以获得更小的文件体积,从而缩短传输时间。​

如果网络带宽充足,而本地计算机的 CPU 资源有限,则可以选择较低的压缩级别(如-1到-3),以更快的速度完成压缩,尽快开始文件传输。​

(三)个人电脑日常使用​

在个人电脑的日常使用中,压缩文件的需求通常较为零散,文件大小也相对较小。此时,用户可以根据自己的需求灵活设置线程数和压缩级别。​

如果只是临时压缩一些文件用于分享,可以使用默认的线程数(通常为 CPU 核心数)和压缩级别,兼顾速度和压缩率。如果追求极致的压缩速度,可以使用-1的压缩级别和较多的线程数;如果希望文件体积更小,便于长期存储,则可以使用较高的压缩级别。​

八、注意事项​

(一)线程数的合理设置​

虽然增加线程数可以提高压缩速度,但并不是线程数越多越好。当线程数超过 CPU 核心数时,过多的线程会导致 CPU 进行频繁的线程切换,增加系统开销,反而可能降低压缩效率。​

因此,在设置线程数时,建议根据计算机的 CPU 核心数来确定,一般以 CPU 核心数为参考,设置线程数等于或略小于 CPU 核心数。例如,4 核 CPU 设置 4-6 个线程,8 核 CPU 设置 8-10 个线程。​

(二)系统资源占用​

多线程压缩会占用较多的 CPU 和内存资源。在进行压缩操作时,要注意避免影响其他重要程序的运行。尤其是在服务器等生产环境中,应选择在系统负载较低的时间段进行压缩操作,或者限制压缩过程中 CPU 的使用率。​

可以使用nice或renice指令调整压缩进程的优先级,降低其对系统资源的抢占。例如,nice -n 10 tar -cvf - data | pigz -p 4 > data.tar.gz,其中-n 10表示将进程优先级设置为 10(数值越大,优先级越低)。​

(三)文件完整性校验​

压缩完成后,建议对压缩文件进行完整性校验,以确保压缩过程中没有出现错误,避免在解压缩时出现文件损坏的情况。​

可以使用pigz -t指令对压缩文件进行校验,例如:​

pigz -t data.tar.gz​

如果校验通过,不会有任何输出;如果校验失败,会显示相应的错误信息。​

九、总结​

在 Linux 系统中,面对压缩大文件或大量文件时,传统的 tar -zcvf 指令由于单线程处理的限制,速度往往不尽如人意。而将 tar 与 pigz 工具结合使用,通过多线程处理的方式,能够充分利用多核心处理器的优势,显著提升压缩和解压缩的速度,同时保持与 gzip 格式的兼容性和相近的压缩率。​

本文详细介绍了 pigz 工具的优势、工作原理、安装方法,以及 tar 与 pigz 结合实现多线程压缩和解压缩的具体操作,包括指令格式、参数详解和实例演示。同时,通过与传统压缩方式的对比,展示了多线程压缩的速度优势,并提供了在不同场景下的应用技巧和注意事项。​

通过掌握 tar 与 pigz 结合的多线程压缩方法,用户可以有效解决 Linux 系统中压缩文件慢的问题,提高工作效率,无论是服务器备份、文件传输还是个人日常使用,都能从中受益。希望本文的内容能够帮助读者更好地利用 Linux 系统的工具,提升工作体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值