内存爆满一键缓存清理脚本快速恢复站点访问
服务器内存爆满时,最典型的反应是网站响应变慢、数据库连接失败,甚至直接显示 502 或 504。
这时候先别急着重启机器,先用一键缓存清理脚本释放内核页缓存、目录项缓存和 inode 缓存,往往能在几十秒内腾出可用内存。
本文给出一个适合零基础用户的清理脚本,并说明在哪里执行、如何验证、哪些情况不能只靠清缓存。
哪些情况适合用这个脚本
内存爆满不一定都是进程占用过高,Linux 系统会把空闲内存用作文件缓存,这本身是好事。
但当缓存占用过多、加上其他业务进程一起挤压可用内存时,站点就会变卡。
适合用一键缓存清理脚本的场景有:
- 执行
free -h看到available值很小,但直接杀掉进程又怕影响业务。 - 网站突然打开变慢,SSH 登录后操作卡顿,疑似内存不足。
- 重启过一次服务后内存短暂恢复,没过多久又持续走高。
如果你的服务器内存是被单个进程吃满,比如 PHP-FPM、MySQL 或其他 Java 进程异常占用,单纯清缓存不会释放多少内存,需要结合进程排查处理。
准备:确认系统状态和权限
操作前先登录服务器。
可以使用宝塔面板的“终端”功能,也可以用 Xshell、Termius 等 SSH 工具连接。
登录后执行以下命令查看当前内存占用:
free -h
重点关注 available 这一列。
如果数值很低,同时 used 接近总内存,就适合继续操作。
还需要确认当前用户有 root 权限,因为清理系统缓存需要写 /proc/sys/vm/drop_caches 文件。
一键缓存清理脚本的创建与执行
下面是一段安全的内核内存缓存清理脚本,不会删除任何业务数据:
#!/bin/bash
sync
echo 3 > /proc/sys/vm/drop_caches
echo "内存缓存已清理,当前内存状态:"
free -h
将内容保存为 clean_mem.sh,然后依次执行:
chmod +x clean_mem.sh
./clean_mem.sh
简单解释一下:sync 会把内存中的脏数据写回磁盘,避免强制清理造成数据丢失;echo 3 表示同时释放页缓存、目录项和 inode 缓存。
执行后可以看到可用内存明显增加。
如果你用的是宝塔面板,也可以把脚本内容粘贴到“计划任务”里,设置每两小时自动执行一次。
执行后如何验证恢复效果
清理完成后,先看 free -h 中 available 是否回升,再通过浏览器访问网站测试响应速度。
如果站点能正常打开,说明内存压力已经缓解。
若内存仍然吃紧,需要进一步定位:
top -b -o %MEM | head -20
这条命令会显示当前内存占用最高的进程。
如果发现某个进程异常,比如 PHP-FPM 占用过高,可以重启对应服务:
systemctl restart php-fpm
systemctl restart mysql
实际服务名以你系统里安装的版本为准,不确定时可以用 systemctl list-units | grep php 搜索。
避坑:这些情况别只靠清缓存
drop_caches 只能回收内核文件缓存,不能回收应用进程占用的内存。
以下几点需要特别注意:
- 如果内存爆满是因为进程泄漏,清理后几十分钟又涨回来,这时应该升级服务配置或重启相关进程,脚本只是临时止血。
- 不要在生产业务高峰反复执行清理,频繁释放缓存会增加磁盘 I/O 压力,反而让站点更慢。
- 部分云服务器控制台有内存监控,如果你发现内存曲线一直缓慢上升,建议排查慢查询、连接数或日志文件大小。
- 如果站点使用了 Redis、Memcached 等独立缓存服务,它们占用的内存不受该脚本控制,需要单独配置淘汰策略。
关于清理频率,不建议设置为每几分钟跑一次,更合理的做法是配合监控,在内存使用率超过 85% 时自动触发。
这样既能快速恢复站点访问,又不会干扰正常业务。
你现在就可以把脚本保存到服务器上,遇到类似问题时先跑一次,再根据验证结果决定下一步。