——写 1 个大文件 vs 写多个小文件,差距到底有多大?
在做磁盘性能分析、日志设计、数据落盘或者存储选型时,经常会遇到这样的问题:
在总写入数据量相同的情况下:
- 写 1 个 1GB 文件
- 写 2 个 500MB 文件
- 写 5 个 200MB 文件
- 写 10 个 100MB 文件
性能差距到底大不大?
答案是:有差距,而且跟存储介质关系非常大。
这篇文章从 IOPS、吞吐量、文件系统行为 三个角度,系统梳理这个问题。
一、先明确几个核心概念
1️⃣ IOPS 是什么?
IOPS(I/O Operations Per Second) 表示磁盘每秒能完成多少次 I/O 操作。
- 一次
write()→ 一次 I/O - 一次
fsync()→ 也是一次 I/O - 小 I/O 次数多 → 更容易被 IOPS 限制
2️⃣ 吞吐量是什么?
吞吐量(Throughput) 表示每秒写入的数据量,例如 MB/s、GB/s。
二者关系可以近似理解为:
吞吐量 ≈ IOPS × 单次 I/O 大小
二、写文件时,系统到底在干什么?
写一个文件并不是“把数据写进去”这么简单,它至少包含:
- 分配 inode
- 更新目录项
- 分配数据块
- 写文件内容
- 更新文件大小、时间戳
- 关闭文件(可能触发 metadata flush)
👉 文件越多,这些步骤就会被重复越多次。
三、写 1 个大文件 vs 写多个小文件的本质区别
假设:
- 总写入量 = 1GB
- 单次写入 = 1MB
- 顺序写、单线程
写 1 个 1GB 文件
- I/O 次数 ≈ 1024 次
- 元数据操作:1 次 inode + 1 次目录项
- 数据布局:高度顺序
- I/O 调度友好
写 N 个文件(2 / 5 / 10)
- I/O 次数 ≈ 1024 次(数据本身差不多)
- 元数据操作:N 倍
- 数据更容易分散
- 写回更频繁
👉 差别主要来自:元数据 + 顺序性下降
四、不同存储介质下,差距有多大?
1️⃣ 机械硬盘(HDD)
差距:非常大
| 文件数 | 实际写速 | 耗时(1GB) |
|---|---|---|
| 1 个 | ~150 MB/s | ~6.7 s |
| 2 个 | ~130 MB/s | ~7.7 s |
| 5 个 | ~100 MB/s | ~10 s |
📌 原因:
- 寻道是毫秒级
- 文件越多,随机 I/O 越多
- 元数据更新频繁
👉 2 个 vs 5 个文件,差距可达 30~50%
2️⃣ SATA SSD
差距:中等
| 文件数 | 实际写速 | 耗时 |
|---|---|---|
| 1 个 | ~450 MB/s | ~2.2 s |
| 2 个 | ~430 MB/s | ~2.3 s |
| 5 个 | ~380 MB/s | ~2.6 s |
📌 原因:
- SSD 随机 I/O 能力强
- 但写放大、GC、metadata 仍然存在
👉 2 个 vs 5 个文件,差距约 10~20%
3️⃣ NVMe SSD
差距:很小
| 文件数 | 实际写速 | 耗时 |
|---|---|---|
| 1 个 | ~2800 MB/s | ~0.36 s |
| 2 个 | ~2750 MB/s | ~0.37 s |
| 5 个 | ~2600 MB/s | ~0.39 s |
📌 原因:
- 高 IOPS
- 多队列
- 控制器合并写请求
👉 2 个 vs 5 个文件,通常 <10%
4️⃣ tmpfs / 内存盘
几乎没差别
- 不涉及真实磁盘 I/O
- 文件系统开销极小
五、结论汇总
📊 文件数量 vs 性能影响总结
| 存储类型 | 2 个 vs 5 个文件差距 |
|---|---|
| HDD | 大(30~50%) |
| SATA SSD | 中(10~20%) |
| NVMe SSD | 小(<10%) |
| RAM Disk | 几乎无差 |
六、一句话总结
在总写入量相同的情况下:
文件越多,性能一定越差;
但文件数少时(2 vs 5),是否明显,取决于存储介质。
- HDD:差距非常明显
- 普通 SSD:有感知
- NVMe:基本可忽略
七、工程实践建议
- ✅ 能合并就合并(日志、批量数据)
- ✅ 大文件顺序写优于多小文件
- ⚠️ HDD 场景尤其要避免文件碎片化
- ⚠️ 高频落盘要关注 IOPS,不只是 MB/s
