Linux 下使用 tar 与 pigz 进行多核压缩
📘 Linux 下使用 tar 与 pigz 进行多核压缩
一、概述
在 Linux 系统中,tar 是最常用的归档(打包)工具之一,用于将多个文件或目录合并为一个文件。
而 gzip 是常用的压缩工具,用于对文件内容进行压缩。
tar 与 gzip 常搭配使用形成命令:
tar -czf backup.tar.gz /data
但这种方式的一个明显限制是:
⚠️
tar与gzip均为单线程程序,只能使用一个 CPU 核心。
当系统 CPU 较多、文件较大时(如 10GB 以上),这种单线程压缩会成为性能瓶颈。
为解决这一问题,推荐使用 pigz(Parallel Implementation of GZip),
它是 gzip 的多线程版本,可以充分利用多核 CPU 进行压缩。
二、tar 与 pigz 的关系与工作方式
tar 与 pigz 实际是两个独立程序:
| 程序 | 功能 | 是否多线程 | 
|---|---|---|
| tar | 负责打包(将多个文件合并为一个数据流) | ❌ 单线程 | 
| pigz | 负责压缩(将数据流压缩成 gzip 格式) | ✅ 多线程 | 
1️⃣ tar 的职责
tar 的任务是读取文件系统中的数据,然后输出一个未压缩的数据流。
这个过程几乎不涉及复杂计算,主要是 I/O 操作。
示例:
tar -cvf - /data
这条命令不会生成文件,而是将归档内容输出到标准输出(stdout)。
- 表示“写到标准输出”。
2️⃣ pigz 的职责
pigz 从标准输入(stdin)接收数据流,并对其进行并行压缩。
示例:
pigz -p 4 > backup.tar.gz
-p 4 表示使用 4 个线程进行压缩。
它会根据 CPU 核心数量自动划分压缩块并并行计算。
3️⃣ 二者的组合:流式管道压缩
通过 Linux 管道(|)机制,可以让 tar 与 pigz 同时工作:
tar -cvf - /data | pigz -p 4 > /backup/backup.tar.gz
执行时的并行流程如下:
┌────────────────────────┐       ┌────────────────────┐
│ tar: 读取文件并打包流式输出 │ ---> │ pigz: 多线程压缩数据流 │
└────────────────────────┘       └────────────────────┘
        (单线程)                          (多线程)
运行结果:
- tar依然是单线程;
- pigz使用 4 个 CPU 核;
- 管道机制保证两者边读边压缩、无须中间文件;
- 整体 CPU 利用率高、内存占用低、压缩速度显著提升。
三、为什么 tar 只能使用一个 CPU?
tar 是一种典型的“流式归档”工具,它顺序地遍历文件系统、读取文件并写入输出流。
这种顺序处理模式的核心特点是:
- 每次只处理一个文件;
- 不进行复杂运算;
- 不具备数据块划分与并发处理机制;
- 并发读取文件还可能破坏归档的顺序一致性。
因此:
🧠 结论:
tar的核心瓶颈不是 CPU,而是磁盘 I/O。
即使机器有 8 核、16 核,tar 自身仍然只使用 1 个核心。
四、如何使用多核进行压缩
✅ 方案一:tar + pigz(推荐)
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:
tar --use-compress-program="pigz -p 4" -cvf /backup/backup.tar.gz /data
等价于:
tar -cvf - /data | pigz -p 4 > /backup/backup.tar.gz
优点:
- 命令更简洁;
- 归档和压缩由 tar 管理;
- 同样支持多核。
✅ 方案三:解压时多核解压
同样,解压时也可以利用多核:
pigz -dc -p 4 /backup/backup.tar.gz | tar -xvf -
或者更简洁的形式:
tar --use-compress-program="pigz -dp 4" -xvf /backup/backup.tar.gz
五、性能对比示例(8 核 CPU)
| 工具 | 压缩方式 | CPU使用 | 压缩时间(18GB文件) | 
|---|---|---|---|
| `tar | gzip` | 单线程 | 100% of 1 CPU | 
| `tar | pigz -p 4` | 多线程(4核) | ~400% | 
| `tar | pigz -p 8` | 多线程(8核) | ~800% | 
(实际速度取决于磁盘 I/O、文件类型、压缩比等因素)
六、在生产环境中的最佳实践
| 场景 | 推荐命令 | 说明 | 
|---|---|---|
| 4 核机器 | `tar -cvf - /data | pigz -p 3 > /backup/data.tar.gz` | 
| 8 核机器 | `tar -cvf - /data | pigz -p 6 > /backup/data.tar.gz` | 
| 自动检测 CPU | pigz -p $(($(nproc)-1)) | 自动使用除 1 外的全部 CPU | 
七、总结
| 项目 | tar | gzip | pigz | 
|---|---|---|---|
| 功能 | 打包 | 压缩 | 多线程压缩 | 
| 是否多线程 | ❌ | ❌ | ✅ | 
| 可替代 gzip | ❌ | ✅ | ✅ | 
| 推荐用途 | 打包文件 | 兼容老系统压缩 | 现代多核环境压缩 | 
| 与 tar 配合方式 | 输出到管道 | tar -czf | `tar | 
八、实用命令汇总
| 任务 | 命令 | 
|---|---|
| 多核压缩目录 | `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的瓶颈是 I/O,而非 CPU;
- pigz能显著提高压缩性能;
- tar + pigz的组合是大文件备份的业界最佳实践;
- 合理控制线程数量(如 -p 3或-p $(nproc)-1)可以在性能与系统稳定性间取得最佳平衡。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号