——写 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 大小

二、写文件时,系统到底在干什么?

写一个文件并不是“把数据写进去”这么简单,它至少包含:

  1. 分配 inode
  2. 更新目录项
  3. 分配数据块
  4. 写文件内容
  5. 更新文件大小、时间戳
  6. 关闭文件(可能触发 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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注