Linux 下使用 Tar 与 Pigz 进行多核压缩

实用命令汇总

任务命令
多核压缩目录`tar -cvf - /data
多核解压文件`pigz -dc -p 4 /backup/data.tar.gz
简写压缩命令tar --use-compress-program="pigz -p 4" -cvf data.tar.gz /data
简写解压命令tar --use-compress-program="pigz -dp 4" -xvf data.tar.gz
压缩命令tar -cvf - /data | pigz -p $(nproc)-2 > /backup/backup.tar.gz
解压pigz -dc -p $(nproc)-2 /backup/backup.tar.gz | tar -xvf -

-p $(nproc)-1

📘 Linux 下使用 tar 与 pigz 进行多核压缩

一、概述

在 Linux 系统中, tar 是最常用的归档(打包)工具之一,用于将多个文件或目录合并为一个文件。
gzip 是常用的压缩工具,用于对文件内容进行压缩。

targzip 常搭配使用形成命令:

1
tar -czf backup.tar.gz /data

但这种方式的一个明显限制是:

⚠️ targzip 均为单线程程序,只能使用一个 CPU 核心。

当系统 CPU 较多、文件较大时(如 10GB 以上),这种单线程压缩会成为性能瓶颈。

为解决这一问题,推荐使用 **pigz** (Parallel Implementation of GZip)
它是 gzip 的多线程版本,可以充分利用多核 CPU 进行压缩。


二、tar 与 pigz 的关系与工作方式

tarpigz 实际是两个独立程序:

程序功能是否多线程
tar负责打包(将多个文件合并为一个数据流)❌ 单线程
pigz负责压缩(将数据流压缩成 gzip 格式)✅ 多线程

1️⃣ tar 的职责

tar 的任务是读取文件系统中的数据,然后输出一个 未压缩的数据流
这个过程几乎不涉及复杂计算,主要是 I/O 操作。

示例:

1
tar -cvf - /data

这条命令不会生成文件,而是将归档内容输出到标准输出(stdout)。
- 表示“写到标准输出”。


2️⃣ pigz 的职责

pigz 从标准输入(stdin)接收数据流,并对其进行并行压缩。

示例:

1
pigz -p 4 > backup.tar.gz

-p 4 表示使用 4 个线程进行压缩。
它会根据 CPU 核心数量自动划分压缩块并并行计算。


3️⃣ 二者的组合:流式管道压缩

通过 Linux 管道( | )机制,可以让 tarpigz 同时工作:

1
tar -cvf - /data | pigz -p 4 > /backup/backup.tar.gz

执行时的并行流程如下:

1
2
3
4
┌────────────────────────┐       ┌────────────────────┐
│ tar: 读取文件并打包流式输出 │ ---> │ pigz: 多线程压缩数据流 │
└────────────────────────┘       └────────────────────┘
        (单线程)                          (多线程)1.2.3.4.

运行结果:

  • tar 依然是单线程;
  • pigz 使用 4 个 CPU 核;
  • 管道机制保证两者边读边压缩、无须中间文件;
  • 整体 CPU 利用率高、内存占用低、压缩速度显著提升。

三、为什么 tar 只能使用一个 CPU?

tar 是一种典型的“流式归档”工具,它顺序地遍历文件系统、读取文件并写入输出流。
这种顺序处理模式的核心特点是:

  • 每次只处理一个文件;
  • 不进行复杂运算;
  • 不具备数据块划分与并发处理机制;
  • 并发读取文件还可能破坏归档的顺序一致性。

因此:

🧠 结论: tar 的核心瓶颈不是 CPU,而是磁盘 I/O。

即使机器有 8 核、16 核, tar 自身仍然只使用 1 个核心。


四、如何使用多核进行压缩

✅ 方案一:tar + pigz(推荐)

1
tar -cvf - /data | pigz -p 4 > /backup/backup.tar.gz

说明:

参数含义
-cvf -打包并输出到标准输出
pigz -p 4使用 4 个线程压缩
>将压缩后的数据写入目标文件

性能特征:

  • tar 占用约 1 核;
  • pigz 占用 4 核;
  • 总共利用 5 核;
  • 压缩速度通常是单线程 gzip 的 3~5 倍。

✅ 方案二:tar 内置调用 pigz(更简洁)

许多 Linux 发行版的 tar 已支持直接使用 pigz 替代 gzip

1
tar --use-compress-program="pigz -p 4" -cvf /backup/backup.tar.gz /data

等价于:

1
tar -cvf - /data | pigz -p 4 > /backup/backup.tar.gz

优点:

  • 命令更简洁;
  • 归档和压缩由 tar 管理;
  • 同样支持多核。

✅ 方案三:解压时多核解压

同样,解压时也可以利用多核:

1
pigz -dc -p 4 /backup/backup.tar.gz | tar -xvf -

或者更简洁的形式:

1
tar --use-compress-program="pigz -dp 4" -xvf /backup/backup.tar.gz

五、性能对比示例(8 核 CPU)

工具压缩方式CPU使用压缩时间(18GB文件)
`targzip`单线程100% of 1 CPU
`tarpigz -p 4`多线程(4核)~400%
`tarpigz -p 8`多线程(8核)~800%

(实际速度取决于磁盘 I/O、文件类型、压缩比等因素)


六、在生产环境中的最佳实践

场景推荐命令说明
4 核机器`tar -cvf - /datapigz -p 3 > /backup/data.tar.gz`
8 核机器`tar -cvf - /datapigz -p 6 > /backup/data.tar.gz`
自动检测 CPUpigz -p $(($(nproc)-1))自动使用除 1 外的全部 CPU

七、总结

项目targzippigz
功能打包压缩多线程压缩
是否多线程
可替代 gzip
推荐用途打包文件兼容老系统压缩现代多核环境压缩
与 tar 配合方式输出到管道tar -czf`tar

九、结语

  • tar 的瓶颈是 I/O,而非 CPU;

  • pigz 能显著提高压缩性能;

  • tar + pigz 的组合是大文件备份的业界最佳实践;

  • 合理控制线程数量(如 -p 3-p $(nproc)-1 )可以在性能与系统稳定性间取得最佳平衡。

0%