你的云服务器(基于虚拟化技术的弹性服务器)用了大半年后,有没有发现磁盘写入越来越慢:数据库导入耗时翻倍、备份打包比以前久、面板监控里磁盘 I/O 等待悄悄升高?很多人第一反应是升级配置,但真正的根源往往更简单——SSD 长期运行后没有做 TRIM(固态硬盘垃圾回收指令),文件系统里大量”逻辑上已删除、物理上仍占用”的数据块没有被回收,主控要花更多时间做整理,性能自然一路下滑。本文教你如何判断 TRIM 是否缺失、如何配置 fstrim 定期维护计划,并配合磁盘瘦身让 SSD 恢复到接近出厂的写入速度。整个过程只需要几条命令,不需要停机,也不会动到你的业务数据。
为什么 SSD 不做 TRIM 会越用越慢
要理解 fstrim 的价值,得先弄清 SSD 的写入机制。SSD(固态硬盘)不能像机械硬盘那样直接覆盖旧数据:写入必须以”块”为单位先擦除再写,主控完全不知道文件系统里哪些数据块已经被删除了。你在服务器上执行 rm 或者应用滚动清理日志后,文件系统只是把对应块标记为”可用”,物理层面这些块仍被旧数据占着。没有 TRIM 的情况下,SSD 主控始终认为这些块是有效数据,每次写入都要先搬移再擦除,这就是写入放大(Write Amplification)被推高的直接原因。
实测数据能说明差距:在一块持续运行一年、从未做过 TRIM 的 240GB 系统盘上,顺序写入速度可能从标称的 500MB/s 掉到 150MB/s 左右,衰减超过一半;而做过一次完整 TRIM 并等待垃圾回收后,同样的测试通常能恢复到 400MB/s 以上。对跑数据库、WordPress 站点或频繁写日志的业务来说,这种差距会直接体现在查询耗时和页面响应上。
判断服务器有没有做 TRIM,可以用两条命令快速确认:
# 查看 SSD 是否支持 TRIM(输出中非零表示支持)
cat /sys/block/sda/queue/discard_granularity
# 查看文件系统挂载时是否启用了 discard 选项
findmnt -no OPTIONS /
多数云服务器的 SSD 支持 TRIM,但默认并没有一个持续生效的回收机制,这正是需要 fstrim 出场的原因。

如何配置 fstrim 定期维护任务
主流发行版(Debian/Ubuntu、RHEL 系列)已经自带 fstrim.timer,但不少镜像为了兼容性默认关闭了它。配置的第一步是确认计时器状态:
# 查看定时器是否启用以及上次运行时间
systemctl status fstrim.timer
systemctl list-timers fstrim.timer
如果显示 inactive 或 disabled,两条命令开启并立即启动:
sudo systemctl enable --now fstrim.timer
fstrim.timer 默认每周执行一次 fstrim -av,对所有支持的文件系统做全量回收。周中凌晨执行对你的业务几乎没有感知,不需要额外调整。如果你想验证它真的在工作,可以手动跑一次并观察输出:
sudo fstrim -av
# 典型输出:/: 18.5 GiB (19854237696 bytes) trimmed
第一次执行时,这个数字往往会大到吓人——几十 GB 都很常见,这正是长期未回收的”僵尸数据块”。跑完后等待几分钟让主控完成垃圾回收,再做一次写入测试,对比 fstrim 前后的差异。建议把这次输出记下来,后续巡检时如果每次 trimmed 的量长期维持在几 GB 以上,说明写入删除频繁,可以适当把执行频率调高到每天(修改计时器的 OnCalendar 即可)。
这类回收机制和TTFB 与主机优化的思路是一体的:存储层做 TRIM,应用层做缓存与传输优化,两者叠加才能让整机保持流畅。有两种情况要特别注意。其一是 RAID(独立冗余磁盘阵列)阵列或 LVM 卷:TRIM 指令要逐层透传,任何一层没启用 discard 支持都会让回收静默失效,可以用 lsblk --discard 核对每层的 DISC-GRAN/DISC-MAX 是否为非零。其二是极少数仍使用 ext4 之外旧文件系统的数据盘,XFS 从内核 4.18 起才稳定支持在线 discard,老内核建议直接依赖 fstrim 批量回收而不是挂载 discard 选项。
配合磁盘瘦身:把空间真正还给 SSD
TRIM 回收的是”文件系统已经标记删除”的块,如果磁盘本身已经被数据填满,TRIM 能做的也有限。SSD 的写入性能和空闲空间比例直接相关:当可用空间低于 20% 时,主控没有足够的预留块做磨损均衡,性能衰减会明显加速。所以 TRIM 定期维护要和磁盘瘦身配合做,才能维持长期稳定。
瘦身先从最能”藏东西”的几个位置入手。日志文件经常是第一名:journalctl --disk-usage 先看看 systemd 日志占了多少,超过 1GB 就用 sudo journalctl --vacuum-size=500M 收缩;应用日志(Nginx、PHP-FPM、应用框架)检查是否有轮转配置,没配的用 logrotate 补上。旧内核和软件包缓存排第二:sudo apt autoremove --purge 一次能清掉几百 MB 到几 GB 的旧内核,sudo apt clean 再释放包缓存。Docker 用户还要多看一眼:docker system df 列出悬空镜像、停止的容器和构建缓存,docker system prune -af 通常能意外回收 10GB 以上,清理后再对挂载的 overlay 文件系统跑一次 fstrim。

瘦身的另一个作用是给 TRIM”递刀子”:fstrim -av 输出的 trimmed 数量,本质上就是文件系统里已删除但未回收的空间。定期清理让这个数字保持健康水平,TRIM 每次执行的时间也从几十秒缩短到几秒,对共享同一物理存储的邻居租户也更友好。如果你在评估服务器配置选型,可以参考这篇云服务器选购指南,把磁盘类型、IOPS 指标和预留空间比例一起纳入比较维度。

验证 TRIM 真的生效了
配置完不等于生效,最后要用数据闭环验证。三步就够:
systemctl list-timers fstrim.timer确认下次触发时间存在,且Last trigger显示最近确实跑过一次- 手动执行
fstrim -av,输出的 trimmed 字节数应为非零;连续两次执行,第二次接近零是正常的(说明上一次已经回收干净) - 用
dd或fio做一次写入基准测试,对比维护前后的顺序写入速度,正常应能恢复 30% 以上
这三个动作建议直接写进现有的巡检脚本。TRIM 依赖的 discard 支持链条上任何一环变动(比如换镜像、扩容磁盘重建阵列),都可能让回收静默失效,定期输出能第一时间发现异常。
总结与行动建议
SSD 越用越慢不是玄学,而是缺少定期回收的必然结果。核心结论是:确认 SSD 支持 discard → 启用 fstrim.timer → 手动跑一次 fstrim -av 并记录输出 → 配合日志清理与磁盘瘦身保持 20% 以上空闲空间 → 每次巡检核对 trimmed 数量。整套动作加起来不到半小时,换来的是磁盘性能的长期稳定。
如果你需要一台开箱即维护好的云服务器,Hostease 的方案在系统层面预置了常规维护任务,同时提供服务器性能优化方面的系列教程。建议把本文的 TRIM 检查步骤加入你的服务器交接清单——每一台新接手的服务器,都值得先跑一次 fstrim -av 看看它欠了多少”维护债”。