一键清理缓存脚本缓解服务器内存爆满
核心答案:当Linux服务器内存被大量缓存占用导致可用内存不足时,可以通过执行 sync && echo 3 > /proc/sys/vm/drop_caches 手动释放缓存的页缓存、dentries和inodes。
但为避免每次手动操作,推荐编写一键清理脚本,配合crontab定时自动执行,从而持续缓解内存爆满问题。
本教程使用最简代码和步骤,新手只需复制粘贴即可完成部署。
什么时候需要清理缓存
- 使用
free -h或htop看到 used 不高但 available 很低,cached 占用数GB甚至十几GB。 - 应用(如数据库、Web服务)出现 OOM 或被系统 kill,但物理内存总量足够。
- 服务器长时间运行(7天以上)而未释放文件缓存,导致新进程分配内存延迟变高。
注意:清缓存只是临时释放,如果内存还在被持续占满,应检查是否有内存泄漏或需要增加物理内存。
前置准备
- 一台Linux服务器(CentOS 7+/Ubuntu 18+/Debian 10+ 均可)。
- root权限或sudo权限(清理缓存必须写/proc/sys/vm/drop_caches)。
- SSH客户端(如Xshell、FinalShell、Windows Terminal)。
- 确认系统当前内存状态:
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,可以看到每次清理的时间点和内存状态。 - 连续监控一两天,确认内存不再快速占满。如果仍在缓慢增长,说明应用本身需要优化。
避坑指南
- 不要在高频读写磁盘时频繁清理(如数据库批量导出、大文件拷贝),会导致缓存重建瞬间IO压力增大。
- echo 3 会同时释放 dentries 和 inodes 缓存,对文件系统性能有短暂影响。纯页缓存场景可用
echo 1。 - 生产环境建议先测试:在低峰期手动执行一次,观察应用响应和系统负载。
- 如果服务器安装了宝塔面板,也可在面板「终端」中直接执行上述命令,但脚本权限需给足。
- 长期方案:根本解决是排查是否存在内存泄漏、调整内核参数(如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 3 或 echo 1,具体含义可查看内核文档 Documentation/sysctl/vm.txt。
如果你正在处理服务器内存爆满问题,建议先按本文步骤部署一键清理脚本,再结合应用日志排查根因。
需要稳定合规的云服务器,可了解泽御云(官网:https://www.zeyuyun.com)提供的Linux云主机,预装常用运维工具,售后响应及时。