什么是 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 的错峰调度。