多线程tar压缩打包

182 阅读4分钟

多线程压缩效率提升指南:用 pigz 快速压缩文件

在日常工作中,我们经常需要压缩大文件或目录(比如备份数据、传输文件),但单线程压缩工具(如 tar)往往耗时较长,尤其面对 GB 级甚至 TB 级文件时,效率低下的问题更为明显。今天就来教大家如何利用pigz工具实现多线程压缩,充分利用服务器的多核 CPU 资源,大幅提升压缩速度。

一、为什么需要多线程压缩?

传统的tar是单线程工具,压缩时只能用到一个 CPU 核心,即使服务器有几十甚至上百个核心,也无法充分利用。而pigz(Parallel tar)是tar的并行实现,支持多线程处理,能同时调用多个 CPU 核心进行压缩,尤其对大文件或目录,速度提升非常显著(通常能快 5-10 倍,具体取决于核心数)。

二、准备工作:安装 pigz

pigz不是系统默认安装的工具,需要手动安装。以下是不同 Linux 发行版的安装方法:

1. CentOS/RHEL/Rocky Linux(基于 yum/dnf)

# 适用于CentOS 7/RHEL 7
sudo yum install -y pigz

# 适用于CentOS 8/RHEL 8/Rocky Linux 8+
sudo dnf install -y pigz

2. Debian/Ubuntu(基于 apt)

sudo apt update && sudo apt install -y pigz

3. 源码安装(适用于无包管理的系统)

如果上述方法无法安装,可以通过源码编译:

# 下载源码(版本号可替换为最新版)
wget https://zlib.net/pigz/pigz-2.8.tar.gz
# 解压
tar xzf pigz-2.8.tar.gz
cd pigz-2.8
# 编译安装
make
sudo make install

安装完成后,执行pigz --version,若输出版本信息,则表示安装成功。

三、多线程压缩实战:压缩 test 文件 / 目录

假设我们需要压缩名为test的文件或目录(可以是单个大文件,也可以是包含多个文件的目录),目标是生成test.tar.gz压缩包,并在后台运行以避免终端断开影响进程。

完整命令

nohup sh -c 'tar cf - test | pigz -p 线程数 > ./test.tar.gz' > backup.log 2>&1 &

命令解析

这个命令看似复杂,其实可以拆分为几个部分,逐一理解:

  1. nohup ... &:让命令在后台运行,即使关闭终端也不会中断。nohup会将输出重定向到默认的nohup.out,但这里我们手动指定了日志文件。

  2. sh -c '...':将单引号内的内容作为一个整体命令执行,确保管道(|)前后的命令能协同工作。

  3. tar cf - test

    • tar是打包工具,负责将test目录 / 文件打包成一个归档文件;
    • c:创建新归档;
    • f -:f指定输出文件,-表示输出到 “标准输出”(而非直接写入文件),方便通过管道传给后续工具。
  1. | pigz -p 线程数
    • |:管道,将tar的输出(打包后的数据流)传递给pigz处理;
    • pigz:多线程压缩工具;
    • -p 线程数:指定压缩时使用的线程数(核心数),这是提升速度的关键。
  1. > ./test.tar.gz:将pigz压缩后的结果写入test.tar.gz文件(最终的压缩包)。

  2. > backup.log 2>&1:将命令的所有输出(包括标准输出和错误信息)重定向到backup.log,方便后续查看压缩过程和结果。

核心参数:如何选择线程数?

-p后面的线程数不是越大越好,建议遵循以下原则:

  • 线程数不超过服务器的 CPU 核心数(过多会导致核心竞争,反而降低效率);

  • 可以用nproc命令查看服务器的 CPU 核心数(例如输出 64,表示有 64 个核心);

  • 推荐线程数:核心数的 80%-100%(例如 64 核服务器,可用-p 64或-p 56)。

示例(64 核服务器):

nohup sh -c 'tar cf - test | pigz -p 64 > ./test.tar.gz' > backup.log 2>&1 &

四、压缩过程监控与验证

1. 查看压缩进度

压缩在后台运行,可通过日志文件查看进度:

tail -f backup.log  # 实时查看日志输出

也可以通过ps命令查看进程是否在运行:

ps -ef | grep pigz  # 若能看到pigz进程,说明正在压缩

2. 验证压缩结果

压缩完成后(ps查看不到 pigz 进程),可以通过以下方式验证压缩包是否完整:

  • 检查文件大小:ls -lh test.tar.gz,确认生成了压缩包;

  • 解压测试(可选):pigz -d -p 线程数 test.tar.gz(解压后会生成test.tar,再用tar xf test.tar解开查看内容)。

五、总结

通过pigz的多线程压缩,我们能充分利用服务器的多核资源,大幅提升大文件 / 目录的压缩效率。核心步骤是:

  1. 安装pigz工具;

  2. 用tar打包目标文件 / 目录,通过管道传给pigz;

  3. 合理设置线程数(参考 CPU 核心数);

  4. 后台运行并记录日志,方便监控。

下次处理大文件压缩时,不妨试试这个方法,让效率提升一个档次!