操作是什么
向 /proc/sys/vm/drop_caches 写入 1、2、3,可以分别清理页缓存、可回收的 slab 对象(dentry、inode 等)以及两者全部。它是一次性的显式操作,主要用于测试与演示(例如测量磁盘的真实读性能),而不是常规运维手段——缓存本来就会在内存紧张时被自动回收,主动清掉只会让后续访问重新变慢,还会破坏排查现场。
基本信息
| 接口 | /proc/sys/vm/drop_caches |
|---|---|
| 取值 | 1=页缓存,2=可回收 slab,3=两者 |
| 权限要求 | root |
| 执行前建议 | 先执行 sync 把脏页写回磁盘 |
| 作用范围 | 全局,无法只清理某个进程或某个文件 |
| 清理不到 | 不可回收的 slab、tmpfs/Shmem 页、仍被引用的对象 |
典型使用场景
- 磁盘基准测试前清缓存,避免测到内存命中而不是真实磁盘性能
- 对比「有缓存 / 无缓存」下的应用响应,判断它对 IO 延迟的敏感程度
- 验证应用的 IO 路径是否脆弱:清后性能骤降说明严重依赖缓存预热
- 演示或培训时展示缓存对 free 输出的影响
- 复现首次启动或冷启动场景,评估预热策略是否必要
执行示例
执行示例
sync # 先把脏页写回磁盘,避免影响后续测量
free -h # 记录清理前的缓存与可用内存
awk '/^(Cached|Buffers|SReclaimable)/{print}' /proc/meminfo # 看缓存构成
echo 3 | sudo tee /proc/sys/vm/drop_caches # 1=页缓存 2=可回收 slab 3=全部
free -h # 观察 Cached 是否明显下降
awk '/^Shmem/{print}' /proc/meminfo # tmpfs 占用不会被清理,清完仍然保留写入值对照
| 写入值 | 清理对象 | 说明 |
|---|---|---|
| 1 | 页缓存(PageCache) | 最常见用法,测磁盘性能前执行 |
| 2 | 可回收 slab(dentry、inode 等) | 检查目录遍历与文件查找的性能 |
| 3 | 页缓存与可回收 slab | 最彻底的一次性清理 |
| 0 或其他值 | 无效 | 默认值,写入无实际动作 |
清理不会释放全部内存:不可回收的 slab、tmpfs 页与正在使用的对象都会保留,因此执行后 free 不会显示「内存被清空」。把它当作解决内存不足的手段属于方向错误。
清理会抹掉缓存命中分布、dentry 与 inode 缓存状态等线索。故障分析或性能定位期间不要执行,否则后续数据无法与历史对比。