首页/系统/Linux 内核与性能调优速查/SSD TRIM 与 fstrim 定时任务

SSD TRIM 与 fstrim 定时任务

TRIM 让 SSD 感知已删除块以维持性能:可手动 fstrim、启用挂载选项 discard,或依赖 fstrim.timer 周期性执行。

什么是 TRIM 与 fstrim

SSD 需要知道哪些逻辑块已经不再被文件系统使用,才能提前擦除这些块、避免写入时先擦后写带来的延迟。TRIM(ATA 的 Data Set Management、NVMe 的 Deallocate、SCSI 的 UNMAP)就是通知机制。文件系统侧有三种做法:手动或定时跑 fstrim 批量下发、挂载时加 discard 在线实时下发、或者由存储平台在后台自行回收。多数生产环境选定时 fstrim,因为它的开销可预期。

基本信息

手动执行fstrim -av(-a 全部支持的文件系统,-v 显示明细)
在线丢弃mount -o discard(写入路径实时下发)
定时任务systemd 的 fstrim.timer / fstrim.service
适用对象SSD、NVMe、支持 UNMAP 的存储卷
不影响机械盘与不支持 TRIM 的虚拟盘,命令会报不支持

典型使用场景

  • SSD 长期使用后写入性能下降:手工跑一次 fstrim 观察是否恢复
  • 周期性维护:依赖发行版自带的 fstrim.timer,按周执行
  • 虚拟化环境:确认存储后端是否代管回收,避免双层下发
  • 上线前核对:检查挂载选项与 timer 状态,明确由谁负责 TRIM
  • 故障排查:写入放大异常时确认 TRIM 是否真的在生效

检查与执行

检查与执行
sudo fstrim -av                             # 对所有支持的文件系统执行
sudo fstrim -v /data                        # 只处理某个挂载点
cat /sys/block/nvme0n1/queue/discard_max_bytes   # 非 0 表示设备支持丢弃
mount | grep -i discard                     # 是否启用了在线丢弃
systemctl status fstrim.timer | head -5     # 定时任务状态
systemctl list-timers | grep fstrim         # 下次触发时间

三种方式对照

方式优点代价与风险
fstrim 定时开销集中可预期,通常秒级到分钟级需要规划执行窗口,期间 IO 有波动
mount -o discard实时回收,无需定时任务每次删除都额外下发,写入波动明显
平台后台回收应用侧零感知回收节奏不可控,需按平台文档确认
不做 TRIM无额外开销长期使用后写入放大、性能衰减
虚拟机磁盘通常是 qcow2/vmdk 稀疏文件,guest 内跑 fstrim 会触发镜像文件的 punch hole,宿主侧可用 du 看到占用下降;若宿主不支持则看不到变化。
在业务高峰执行全盘 fstrim 会造成明显的 IO 波动,建议放在维护窗口或依赖 timer 的错峰调度。

易错点

  • 在线 discard 可能带来写入波动,多数场景用定时 fstrim 更可控,两者也不要同时开启
  • 虚拟磁盘、云盘可能不支持 TRIM 或由平台代管,命令报不支持时先查平台文档而不是判定系统故障
  • 认为配好 fstrim.timer 就万事大吉:部分发行版默认未启用该 timer,需要 systemctl enable --now 确认
  • 把 fstrim 当成性能恢复的万能手段:如果容量接近写满,回收带来的收益会非常有限

数据来源与参考

  • util-linux 文档 fstrim(8)
  • Linux 内核 Documentation/admin-guide/blockdev/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌