ext4调优需按负载选参:data=ordered保一致性,data=writeback提性能但有丢数风险;barrier=1必开;小文件场景格式化时用mke2fs -i 4096增inode;SSD必加noatime,nodiratime,TRIM慎用discard;journal大小依吞吐调整,512MB起;一切以iostat和dmesg监控为依据。
默认挂载的 ext4 在多数场景下够用,但一旦有数据库写入、日志轮转或高并发小文件操作,就容易出现延迟抖动或意外断电后文件系统损坏。关键不是堆参数,而是按负载类型做取舍。
data=ordered(默认)平衡性最好:元数据强制日志,数据页异步刷盘,既保一致性又不严重拖慢吞吐data=writeback 提升写性能,但断电可能丢失未刷盘的数据页barrier=1 必须保留(除非你关了磁盘写缓存且确认硬件无电池保护),否则日志屏障失效会导致日志与数据不一致commit=60:延长提交间隔虽降低日志 IO 频次,但会增加崩溃后回滚量和恢复时间df -h显示还有空间
这是典型 inode 耗尽,常见于大量小文件(如容器镜像层、npm/node_modules、日志切片)。df -i 一看便知。格式化时没预留足够 inode,后期无法扩容。
mke2fs -i 4096(每 4KB 分配一个 inode),比默认的 -i 16384 更适合小文件密集型场景rsync -aHAX 备份,重新 mke2fs,再恢复tune2fs -l /dev/sdX1 | grep "Inode count" 查当前总量,再 find /path -xdev -type f | wc -l 看是否接近上限禁用 atime 几乎零成本且必开;TRIM 则需确认路径全栈支持(固件、驱动、RAID卡、文件系统挂载选项),否则不仅无效还可能引发异常。
noatime,nodiratime:避免每次读都触发磁盘写,对频繁 stat 的服务(如 Web 服务器、打包工具)明显降低 IO 压力discard 挂载选项只建议用于直连 NVMe/SATA SSD;若走 RAID 卡或虚拟化层,应改用定期 fstrim -v /(加入 cron)lsblk -D 看 DISC-GRAN 和 DISC-MAX 是否非零;再运行 sudo hdparm -I /dev/sdX | grep TRIM
ext4 日志默认 128MB,对机械盘够用,但对高吞吐 SSD 或大内存机器,过小会导致频繁日志循环覆盖、阻塞事务;过大则占用过多连续空间且恢复慢。
dmesg | grep -i "ext4.*journal" 若频繁出现 journal too small 或 journal full,说明需要调大tune2fs -J size=512M /dev/sdX1(最大建议不超过 2GB)-J device=/dev/sdY1,但会引入额外 IO 路径依赖tune2fs -l /dev/sda1 | grep -E "(Journal|Inode size|Block count)"实际调优永远从监控出发:先看
iostat -x 1 的 %util、await、svctm,再结合 cat /proc/mounts 和 dmesg 找线索。没有通用最优解,只有当前 workload 下最不坏的选择。
# linux
# postgresql
# 数据库
# 文件系统
# 新和
# 时用
# 这是
# 放在
# 已有
# 不超过
# 镜像
# 又不
# 异步
# 并发
# 切片
# node
# npm
# 工具
# 栈
# ai
# ios
# 虚拟化
# red
# count
# 循环
# 堆
# 但对