一键清理缓存脚本缓解服务器内存爆满

核心答案:当Linux服务器内存被大量缓存占用导致可用内存不足时,可以通过执行 sync && echo 3 > /proc/sys/vm/drop_caches 手动释放缓存的页缓存、dentries和inodes。
但为避免每次手动操作,推荐编写一键清理脚本,配合crontab定时自动执行,从而持续缓解内存爆满问题。
本教程使用最简代码和步骤,新手只需复制粘贴即可完成部署。

什么时候需要清理缓存

  • 使用 free -hhtop 看到 used 不高但 available 很低,cached 占用数GB甚至十几GB。
  • 应用(如数据库、Web服务)出现 OOM 或被系统 kill,但物理内存总量足够。
  • 服务器长时间运行(7天以上)而未释放文件缓存,导致新进程分配内存延迟变高。

注意:清缓存只是临时释放,如果内存还在被持续占满,应检查是否有内存泄漏或需要增加物理内存。

前置准备

  1. 一台Linux服务器(CentOS 7+/Ubuntu 18+/Debian 10+ 均可)。
  2. root权限或sudo权限(清理缓存必须写/proc/sys/vm/drop_caches)。
  3. SSH客户端(如Xshell、FinalShell、Windows Terminal)。
  4. 确认系统当前内存状态:free -h 查看 cached 和 available 列。

编写一键清理脚本

在任意目录(例如 /usr/local/bin/)创建脚本文件:

sudo touch /usr/local/bin/clear_cache.sh
sudo chmod +x /usr/local/bin/clear_cache.sh

用vim或nano编辑脚本内容:

#!/bin/bash
sync
echo 3 > /proc/sys/vm/drop_caches
echo "$(date): 缓存已清理,当前内存状态:" >> /var/log/clear_cache.log
free -h >> /var/log/clear_cache.log
  • sync:先将磁盘缓存写回,避免数据丢失。
  • echo 3:释放页缓存、目录项和索引节点缓存。如果你只需要清理页缓存,可用 echo 1
  • 日志记录:方便后续查看清理时间和内存变化。

保存后测试执行:

sudo /usr/local/bin/clear_cache.sh

若无报错,检查 /var/log/clear_cache.log 内容是否正确。

设置定时自动执行

使用crontab让脚本每天凌晨3点自动运行(避开业务高峰期):

sudo crontab -e

在文件末尾添加一行:

0 3 * * * /usr/local/bin/clear_cache.sh

保存退出。
查看定时任务是否生效:

sudo crontab -l | grep clear_cache

如果需要每4小时清理一次,可改为:0 */4 * * * /usr/local/bin/clear_cache.sh

验证效果

  • 立即执行脚本后,运行 free -h,观察 cached 数值是否明显下降,available 是否上升。
  • 查看日志文件:tail -5 /var/log/clear_cache.log,可以看到每次清理的时间点和内存状态。
  • 连续监控一两天,确认内存不再快速占满。如果仍在缓慢增长,说明应用本身需要优化。

避坑指南

  1. 不要在高频读写磁盘时频繁清理(如数据库批量导出、大文件拷贝),会导致缓存重建瞬间IO压力增大。
  2. echo 3 会同时释放 dentries 和 inodes 缓存,对文件系统性能有短暂影响。纯页缓存场景可用 echo 1
  3. 生产环境建议先测试:在低峰期手动执行一次,观察应用响应和系统负载。
  4. 如果服务器安装了宝塔面板,也可在面板「终端」中直接执行上述命令,但脚本权限需给足。
  5. 长期方案:根本解决是排查是否存在内存泄漏、调整内核参数(如vm.vfs_cache_pressure)或增加物理内存。

常见问题

Q1:执行脚本后内存反而升高了是怎么回事?

因为清理后,系统会重新缓存正在使用的文件,可能会导致cached短暂上升再回落;
一般几分钟内稳定。
若持续升高且可用内存越来越少,说明应用或系统存在内存泄漏。

Q2:脚本提示“Permission denied”怎么办?

请用sudo执行脚本,或确认脚本拥有者是否为root,并赋予执行权限:chmod +x /path/to/clear_cache.sh

Q3:定时任务不执行如何排查?

检查crond服务是否运行:systemctl status crond(CentOS)或 systemctl status cron(Ubuntu)。
查看crontab日志(通常位于 /var/log/cron),确认任务是否被触发。
确保脚本路径为绝对路径。

Q4:我可以用echo 2或echo 0来清理吗?

echo 2 只清理dentries和inodes,不清页缓存;echo 0 表示关闭清理功能(实际上无效)。
日常推荐 echo 3echo 1,具体含义可查看内核文档 Documentation/sysctl/vm.txt

如果你正在处理服务器内存爆满问题,建议先按本文步骤部署一键清理脚本,再结合应用日志排查根因。
需要稳定合规的云服务器,可了解泽御云(官网:https://www.zeyuyun.com)提供的Linux云主机,预装常用运维工具,售后响应及时。

分享到:
上一篇
磁盘IO过高存储扩容优化站点响应延迟
下一篇
数据库缺失索引批量添加提升商品检索
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意