内存爆满一键缓存清理脚本快速恢复站点
服务器内存被占满,网站打开慢得像蜗牛,甚至直接报 502 或连接超时——这个问题很多站长都遇到过。
原因往往是系统缓存(如页面缓存、目录项缓存)积累过多,或者某些进程异常吃内存。
本文提供一套安全的一键缓存清理脚本,适合 CentOS 7/8、Ubuntu 18+ 等主流 Linux 系统,包含宝塔面板环境,零基础也能直接照做。
准备:确认内存状态与连接方式
在执行清理前,先确认两点:
- 你有服务器的 SSH 权限(或宝塔面板的终端)。如果没打开 SSH,直接用宝塔面板的“文件”模块也可以创建脚本,但推荐用终端。
- 当前内存占用确实过高。登录后执行以下命令查看:
free -h
重点关注“available”列,如果低于 200MB 且网站卡顿,就值得清理。
同时运行 top 看有没有异常进程(如挖矿程序),如果有,先杀进程,再清理缓存。
创建一键缓存清理脚本
新建一个脚本文件,比如 clean_cache.sh,复制以下内容:
#!/bin/bash
# 内存缓存清理脚本 - 适用于生产环境
# 注意:不会清理正在运行的进程占用的内存
# 同步磁盘数据,防止数据丢失
echo "Syncing disks..."
sync
sync
sync
# 清理 page cache、dentries 和 inodes
echo "Dropping caches..."
echo 3 > /proc/sys/vm/drop_caches
# 重置 swap(如果开启了 swap,可选)
# swapoff -a && swapon -a
echo "Cache dropped successfully. Current memory:"
free -h
保存后赋予执行权限:
chmod +x clean_cache.sh
重点:echo 3会清理 pagecache、dentries 和 inodes,这是最彻底的缓存清理方式。如果只清理 pagecache,可以改成echo 1。对于绝大多数网站、数据库场景,echo 3是安全的,不影响运行的程序。
执行脚本与常见报错处理
运行脚本:
sudo ./clean_cache.sh
如果提示 Permission denied,先切换到 root 或加 sudo。
如果提示 /proc/sys/vm/drop_caches 只读,检查内核参数:
sysctl vm.drop_caches
确认值为 0 或 1,直接运行脚本即可。
常见问题:
- 清理后内存变化不大? 说明内存主要被进程占用(如 MySQL、PHP-FPM),不是缓存占满。这时应检查进程,重启或优化。
- 清理后网站短暂变慢? 因为缓存被清空,数据库查询需要重新缓存,几秒后恢复,属于正常现象。
避坑指南:别让脚本变成“催命符”
- 不要在生产业务高峰期直接清理。如果站点流量大,建议在低峰期执行。
- 不要频繁执行。每次清理后系统重建缓存需要时间,每 5-10 分钟跑一次反而增加 IO 压力。一般内存占用超过 80% 且可用内存低于 300MB 时才需要。
- 宝塔面板用户注意:宝塔自带“内存释放”功能(在面板首页的“内存”旁边),本质上也是同样的操作,可以直接使用。如果手动跑脚本,记得先关闭面板的自动释放,避免冲突。
- 如果服务器内存经常爆满,说明缓存只是表象,根本原因可能是 PHP 进程太多、MySQL 内存分配不合理、或者安装了过多插件。建议后续检查
ps aux --sort=-%mem找出内存大户。
效果验证:前后对比看结果
执行脚本后再次运行 free -h,观察“available”列是否明显增加(通常能增长几百 MB 到 1-2GB)。
同时用浏览器访问网站,确认页面加载速度恢复。
也可以用 vmstat 1 3 观察 swap 使用情况。
如果之前 swap used 很高,清理后应该下降。
如果清理后内存依然很快占满,建议继续排查是否存在内存泄漏或恶意进程。本站也有《Linux内存占用过高排查教程》可对照操作。
高频问题解答
Q:清理缓存会导致数据库数据丢失吗?
不会。缓存只是磁盘数据的副本,不会影响 MySQL、Redis、文件内容。
Q:脚本需要开机自启吗?
不需要。缓存清理是临时手段,不能依赖它解决根本问题。检查系统日志 dmesg | tail -20 看看是否有 OOM(内存溢出)记录。
Q:Windows 服务器怎么办?
本文针对 Linux。Windows 可使用任务管理器结束非必要进程,或重启服务。
以上就是内存爆满一键缓存清理脚本的完整教程。
建议先按步骤完整执行一次,再根据自己环境调整。
如果遇到任何异常,优先回看避坑和高频问题部分,大部分情况都能自行解决。