内存爆满一键清理缓存释放资源脚本
为什么服务器内存会爆满?认识 PageCache 与 Buffer
很多新手看到 free -h 输出中 used 接近 100% 就慌了,其实大部分是被 PageCache(页面缓存) 和 buffer(缓冲区) 占用的。
Linux 会尽可能把空闲内存用来缓存读写过的文件,加速后续访问。
当内存紧张时,系统会自动回收这些缓存,但某些场景下(比如刚读写大量小文件),缓存会长时间积累,导致可用内存过低、应用响应变慢。
这时我们可以手动执行清理脚本,释放被缓存占住的内存,让系统恢复“呼吸”。
编写一键清理脚本:从基础命令到完整脚本
清理缓存的核心是 Linux 内核提供的接口文件 /proc/sys/vm/drop_caches,写入不同数字能释放不同层级的缓存:
1:释放页缓存2:释放目录项和索引节点缓存3:释放全部缓存(PageCache、dentries 和 inodes)
推荐使用 echo 3 之前先执行 sync 强制把未写入磁盘的数据刷进去,避免数据丢失。
步骤 1:手动测试清理效果
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches
运行成功后查看内存变化:
free -h
步骤 2:把命令写成可复用的脚本
切换到 root 或具有 sudo 权限的用户,创建脚本文件:
sudo nano /usr/local/bin/cleanmem.sh
粘贴以下内容:
#!/bin/bash
# 一键清理缓存释放内存脚本
sync
echo 3 > /proc/sys/vm/drop_caches
echo "缓存已清理,当前内存使用情况:"
free -h
保存后赋予执行权限:
sudo chmod +x /usr/local/bin/cleanmem.sh
以后只要执行 sudo /usr/local/bin/cleanmem.sh 就能一键释放。
避坑提醒:什么时候不该执行清理?
虽然清理缓存本身安全,但以下情况请谨慎操作:
- 数据库(MySQL、PostgreSQL)或 Web 应用正在密集写入数据:强制释放缓存可能导致后续读取性能短暂下降,直到重新缓存。建议优先用
sync刷盘,再考虑清理。 - 不要设置定时任务(crontab)频繁执行:每天执行 1-2 次足够,频繁清理会让缓存失去加速意义,反而加重磁盘 I/O。
- 清理后内存不会降到极低值:系统会立即把刚释放的内存重新用于缓存或应用,使用
free -h看到available值大幅上升就说明成功。
运行脚本并验证清理效果
执行脚本:
sudo /usr/local/bin/cleanmem.sh
输出示例:
缓存已清理,当前内存使用情况:
total used free shared buff/cache available
Mem: 3.8G 1.2G 1.0G 120M 1.6G 2.3G
注意 used 值下降、available 值上升。
你也可以用 htop 或 vmstat 1 观察负载变化。
常见问题解答(FAQ)
Q1:清理后内存很快又满了,怎么办?
这是正常现象,只要 available 剩余多就不用担心。如果确实想降低缓存占用,可以检查是否有程序长期占用大量缓存(如大型日志处理),考虑优化应用逻辑或增加物理内存。
Q2:脚本需要 root 权限吗?
写入 /proc/sys/vm/drop_caches 需要 root 或 sudo 提权,否则会提示权限拒绝。建议用 sudo 执行脚本。
Q3:能用 echo 2 代替 echo 3 吗?
可以,但只释放目录和 inode 缓存,效果不如 3 全面。日常场景推荐直接用 3。
写在最后
当你遇到内存爆满导致网站或服务响应缓慢时,一键清理缓存脚本能快速帮你腾出可用内存。
但请把脚本当作“紧急工具”而非常规手段——保持合理的系统资源配置才是根本。
如果你觉得手动执行脚本还不够便捷,可以把它加入每天的 systemd timer 或简单 cron 作业,仅在低频下运行。
遇到异常时优先回顾避坑部分,多观察 available 指标而非 used 数值。