三种拷贝命令性能对比:50GB 场景下大文件 vs 海量小文件
本文对比 cp -a、tar 管道、rsync -av 三种方式在 50GB 总数据量下,处理少量大文件与海量小文件时的性能差异与优势。
所有命令均将 /data/a/ 下所有文件(含隐藏文件)完整拷贝至 /data/b/。
命令示例
bash
# 1. cp -a
cp -a /data/a/. /data/b/
# 2. tar 管道
tar -C /data/a -cf - . | tar -C /data/b -xpf -
# 3. rsync -av
rsync -av /data/a/ /data/b/性能与速度对比(50GB 总数据量)
少量大文件(例如 5 个文件,每个 10GB)
| 命令 | 耗时 | 特点 |
|---|---|---|
| cp -a | 基准最快 | 直接内核拷贝,顺序 I/O 效率最高,内存开销极低 |
| tar 管道 | 慢 5–10% | 打包→管道→解包增加额外 CPU 开销,但仍是顺序读写,差距不大 |
| rsync -av | 慢 10–20% | 首次拷贝需分块校验与计算 checksum,略慢;后续增量同步优势明显 |
结论:大文件场景下,cp -a 速度最佳,rsync 首次稍慢但适合重复同步。
海量小文件(例如 50 万个文件,平均 100KB)
| 命令 | 耗时 | 特点 |
|---|---|---|
| cp -a | 慢 | 每个文件都要单独 open/close、更新元数据,频繁系统调用成为瓶颈 |
| tar 管道 | 快 30–50% | 一次性读取目录树并打包为流,减少元数据操作次数,管道直接解包 |
| rsync -av | 中等 | 首次拷贝比 tar 慢(需对比每个文件),但增量同步时可跳过未改文件 |
结论:小文件海量时,tar 管道由于合并了元数据操作,速度显著优于 cp;rsync 首次略慢,但若目录有大量未变化文件则后续极快。
各自优势
| 命令 | 优势 |
|---|---|
| cp -a | 简单、无需依赖;大文件场景速度最快;适合一次性本地全量拷贝 |
| tar 管道 | 小文件场景性能最优;不依赖额外工具;可通过 SSH 无缝转为远程传输(ssh host tar ... | tar ...) |
| rsync -av | 增量传输(节省时间与带宽);支持排除规则、断点续传、进度显示;本地/远程通用 |
使用建议
- 一次性拷贝,且为大文件 →
cp -a - 一次性拷贝,海量小文件 →
tar管道 - 重复同步或需远程传输 →
rsync -av
三种方式均能完整保留文件属性(权限、时间戳等)及隐藏文件。