Linux 文件系统与存储优化

1次阅读

要加 noatime,除非依赖 atime 做审计;默认 atime 每次读文件都触发磁盘写入,拖累 ssd 和高 i/o 场景;建议用 noatime 而非 relatime,备份工具需改用 mtime/ctime。

Linux 文件系统与存储优化

ext4 挂载时要不要加 noatime

要加,除非你真依赖文件访问时间(atime)做审计或监控。默认开启 atime 会导致每次读文件都触发一次磁盘写入,对 SSD 和高 I/O 场景是明显拖累。

实操建议:

  • mount -o remount,noatime / 可临时生效;长期生效需改 /etc/fstab 对应行,把 defaults 换成 defaults,noatime
  • 别用 relatime —— 它虽比 strictatime 轻量,但仍有写开销,且现代内核(5.0+)下 noatime 已足够安全
  • 某些备份工具(如 rsnapshot)靠 atime 判断文件是否被访问过,加了 noatime 后得改用 mtimectime 逻辑

tmpfs 大小设多少才不翻车

设太小会触发 Write failed: No space left on device,设太大又浪费内存——关键看实际用途,不是拍脑袋填一半 RAM。

实操建议:

  • df -h /dev/shm 查当前使用;find /dev/shm -type f -ls 2>/dev/NULL | head -20 看谁在占大文件
  • Web 服务器缓存(如 nginxfastcgi_cache_path)建议上限设为物理内存的 5%~10%,并配 max_size 限单个缓存区
  • 数据库临时表(mysqltmp_table_size)若跑在 tmpfs 上,必须确保 tmpfs 容量 ≥ 最大可能的单个临时表(比如 select ... GROUP BY 大字段)
  • 不要把 /tmp 整体挂成 tmpfs:很多程序(如 Java、gcc)会在里面放多 GB 的中间文件,一不小心就 OOM

dd 测磁盘写入速度为什么总不准

因为默认没绕过页缓存,测的是内存带宽,不是磁盘真实吞吐;而且块大小、是否 sync、是否清 cache 都极大影响结果。

实操建议:

  • 测裸盘写入必须加 oflag=direct 绕过缓存:dd if=/dev/zero of=/mnt/test bs=1M count=1024 oflag=direct
  • 避免被 ext4 日志干扰:临时关 journal(仅测试用)tune2fs -O ^has_journal /dev/sdX1,或加 conv=fdatasync 强制落盘
  • SSD 要先 hdparm --user-master u --security-set-pass p /dev/sdX--security-erase 清空,否则测出来是“写放大后”的假慢
  • NVMe 盘别用 dd 测:它单线程,压不出队列深度,改用 fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k --iodepth=32

lvm 逻辑卷扩容后 df 不更新

因为 lvextend 只扩了块设备大小,没通知文件系统——这是最常卡住人的一步,错误现象就是 lvdisplay 显示 LV 已变大,但 df -h 完全没反应。

实操建议:

  • ext4 用 resize2fs /dev/vg/lv(在线执行,不用 umount)
  • xfs 必须用 xfs_growfs /mount/point,且参数是挂载点,不是设备路径;传错会报 XFS Error: The Filesystem does not have a valid XFS superblock
  • LVM thin pool 扩容更麻烦:先 lvextend thin pool 本身,再 lvconvert --thinpool 更新元数据,最后才是逻辑卷 resize
  • 别跳过 pvs/vgs/lvs 三级检查:有时 PV 空间没真正释放(比如用了 --alloc anywhere 却没新 PV),lvextend 会静默失败

文件系统层和块设备层的边界,永远比看起来薄。一个 resize2fs 漏掉,前面所有扩容操作等于白干。

text=ZqhQzanResources