ext4 仍是大多数业务的默认安全选择,因其稳定性高、工具链成熟、内核支持完善;XFS 适合大文件和高并发元数据操作;Btrfs 仅在需内建快照/压缩/校验时才值得引入。

ext4 仍是大多数业务的默认安全选择
除非有明确需求推动更换,ext4 在稳定性、工具链成熟度和内核支持上仍是最稳妥的起点。它支持最大 1EB 文件系统、日志功能默认开启、e2fsck 工具多年打磨,修复成功率高。
常见误判是认为“新就一定好”,结果在生产环境遇到 btrfs 的快照回滚失败或 xfs 的小文件性能抖动。对 Web 服务、数据库(MySQL/PostgreSQL 单实例)、CI/CD 构建节点等通用场景,ext4 配合合理挂载选项(如 noatime,data=ordered)已足够。
- 避免在 ext4 上启用
journal=journal(默认是data=ordered),写放大明显 - SSD 部署时务必加
discard或定期跑fstrim,否则长期运行后 I/O 性能衰减 -
tune2fs -o journal_data_writeback /dev/sdX1可提升吞吐,但断电可能丢数据——仅限日志类临时盘
XFS 适合大文件、高并发元数据操作场景
当业务涉及视频转码、基因测序数据存储、虚拟机镜像池或大型备份归档时,XFS 的优势会凸显:延迟稳定的分配策略、并行 inode 分配、原生支持 reflink 和大于 16TB 的单文件。
但它对小文件(xfs_repair 必须在文件系统未挂载时运行,故障恢复窗口比 e2fsck 更长。
- 必须用
xfs_info检查agcount和agsize,RAID10 上建议agcount >= CPU 核数 × 2,否则元数据锁争用明显 -
mkfs.xfs -d agcount=32 -l size=128m /dev/sdX是万兆网存+NVMe 常见调优起点 - 禁用
inode64挂载选项(默认开启),否则 32 位应用(如旧版 Java)可能因 inode 号溢出报ENOSPC
Btrfs 在需要内建快照/压缩/校验的场景才值得引入
btrfs 不是“下一代 ext4”,它是为特定运维模式设计的:比如需要每小时自动快照 + 异地同步的备份系统、容器镜像层共享、或要求端到端数据校验的科研存储。它的写时复制(CoW)机制天然适配这些需求。
但代价是内存占用高(btrfs filesystem usage 常显示大量 “chunk” 碎片)、随机小文件写入延迟波动大、以及内核主线虽支持但部分高级特性(如跨设备平衡)仍存在 race condition。
- 生产环境禁用
compress=zstd(v5.15+ 才稳定),优先用compress=lzo或干脆关压缩 - 必须定期执行
btrfs balance start -dusage=50 /mnt防止 chunk 碎片化导致ENOSPC -
raid1模式下写入性能≈单盘,别指望吞吐翻倍;真正需要性能冗余请选raid10(需 ≥4 块盘)
不要忽略挂载参数与硬件栈的协同影响
文件系统表现不仅取决于类型,更取决于它如何与 I/O 调度器、块设备队列深度、甚至 NVMe namespace 设置交互。例如:deadline 调度器在机械盘上优于 cfq,但在 NVMe 上应强制设为 none;而 XFS 在 blk-mq 队列下必须配 logbsize=256k 才能避免日志瓶颈。
- SSD/NVMe 盘统一加
noatime,nodiratime,commit=60,减少不必要的元数据更新 -
ext4在 RAID 卡上要禁用barrier=1(现代 RAID 固件已处理),否则写入卡顿 - 用
lsblk -D确认Rotational值:值为 1 却挂载成 SSD 参数,或值为 0 却用机械盘调度策略,都会引发反效果
真正难的不是选哪个文件系统,而是确认你的 workload 是否真的触发了某个 FS 的瓶颈边界——比如 perf record -e block:block_rq_issue 能直接看出 I/O 请求是否在文件系统层堆积。多数所谓“性能问题”,最后发现是应用层反复 open/close 小文件,换啥 FS 都救不了。










