必须先运行sync,因为drop_caches只丢弃干净缓存,而sync可确保脏数据(未写入磁盘的修改)全部落盘,避免数据丢失。

Linux 使用 drop_caches 释放内存缓存,本质是让内核主动丢弃干净的缓存(clean caches),把这部分内存腾出来供其他进程使用。它不杀进程、不删数据,但必须配合 sync 提前刷盘,否则可能丢失未写入磁盘的修改。
为什么要先运行 sync?
Linux 会把待写入磁盘的文件数据暂存在内存缓冲区(buffer)和页缓存(pagecache)中,提升 I/O 效率。这些“脏数据”(dirty pages)不能被 drop_caches 清掉——只有“干净”的缓存才能释放。所以执行前必须用 sync 把所有待写数据强制落盘:
-
sync命令会阻塞直到所有缓冲区数据写入磁盘 - 建议加
sudo确保权限,尤其在系统负载高时 - 执行后可观察磁盘灯闪烁或用
iostat -x 1查看写入活动是否平息
三种 drop_caches 模式怎么选?
/proc/sys/vm/drop_caches 接收 0~3 的整数值,对应不同清理粒度:
-
echo 1 > /proc/sys/vm/drop_caches:只清页缓存(pagecache),影响文件内容读取缓存,对频繁读大文件的场景最常用 -
echo 2 > /proc/sys/vm/drop_caches:只清 dentries 和 inodes 缓存,影响路径查找和文件元数据访问,适合大量小文件操作后 -
echo 3 > /proc/sys/vm/drop_caches:清全部(1+2),覆盖最广,测试、压测或排查缓存干扰时推荐
注意:echo 0 是关闭清理动作,不是“清零”,仅作占位或重置用途。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
用 sysctl 还是直接写 proc?
两种方式等效,但习惯和场景略有差异:
- 临时执行推荐
sudo sysctl -w vm.drop_caches=3,语法统一、易记,且自动校验参数有效性 - 脚本中或需精确控制时,用
echo 3 | sudo tee /proc/sys/vm/drop_caches更直观,避免 sysctl 解析失败 - 两者都只作用于当前会话,重启即失效;如需开机自动清缓存(极少必要),才需写入
/etc/sysctl.conf并执行sysctl -p
清理后怎么看效果?
别只盯着 free -h 的 buff/cache 行——它包含 buffer(块设备缓冲)和 cache(文件缓存),而 drop_caches 主要影响后者。更准的观察方式是:
- 对比
free -h执行前后buff/cache的下降量,重点关注available是否明显上升 - 用
cat /proc/meminfo | grep -E "^(Cached|Buffers|SReclaimable)"查看各缓存项原始值变化 - 如果
drop_caches=3后Cached几乎归零但available没涨,说明内存被 active 进程占用,不是缓存问题
缓存释放是安全操作,但频繁手动清理通常意味着应用设计或系统配置有优化空间,比如调整 vm.vfs_cache_pressure 或检查是否有内存泄漏进程。

















