怎么安全清理 Linux 页缓存做冷读测试?
更新时间:2026-09-19。短答页。做磁盘/数据库冷读基准时,希望排除页缓存命中的影响,需要主动释放 page cache。
一句话回答
先 sync 把脏页落盘,再向 /proc/sys/vm/drop_caches 写入 1(页缓存)、2(dentry/inode slab)或 3(两者都清),这是非破坏性操作,只释放「干净、可重建」的缓存,不丢数据;随后第一次读即真实冷读。
命令
bash
sync; echo 1 | sudo tee /proc/sys/vm/drop_caches # 清页缓存(page cache)
sync; echo 2 | sudo tee /proc/sys/vm/drop_caches # 清 dentry/inode 缓存
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches # 清上面两者(最常用)为什么先 sync:缓存里可能有尚未写回的脏页(dirty pages),先 sync 强制落盘,确保被丢弃的只是已与磁盘一致的干净页。内核绝不会因为 drop_caches 而丢弃未保存的数据。
它到底做了什么
- 释放的是内核拿来做文件读缓存、目录项/inode 缓存的空闲可用内存;数据仍在磁盘上。
- 清完后用 free 会看到 buff/cache 骤降、available 上升。
- 之后读取会真实走磁盘/文件系统,适合对比冷/热读、验证 iostat 的磁盘延迟、给 fio/数据库压测造冷启动条件。
生产慎用(不是危险,是有性能副作用)
- 清缓存后短时间内大量读会真正打到磁盘,可能引发延迟尖刺、拖慢在线服务,只在测试机或低峰维护窗口操作。
- 它不是内存优化手段:缓存是为性能服务的,被清掉后内核会随访问重新填充,对长期可用内存没有帮助——available 低才是真的内存紧张。
- 对数据库做冷缓存测试要留意:DB 自身还有 buffer pool(如 InnoDB Buffer Pool),drop_caches 只清 OS 页缓存,不清 DB 内部缓存,需要时另用 DB 的冷启动/预热命令。
坑
- 不 sync 直接清:脏页要先写回,结果不可控。
- 把 drop_caches 当常规「内存清理」定时任务,反而周期性制造冷读、降低性能。
- 以为清了 OS 缓存就等于冷数据库,忽略数据库自己的缓冲池和预读。
- 在高负载生产环境执行,冷读瞬间把磁盘打满导致抖动。
总结
释放页缓存做冷读的标准做法是先 sync 再向 /proc/sys/vm/drop_caches 写 1(页缓存)、2(目录项/inode)或 3(全部),它只丢弃干净、可重建的缓存而不影响数据安全,适合冷启动和磁盘基准;但清理后读请求会直达磁盘造成短期延迟,生产环境只应在维护窗口使用,也不能拿它当内存优化,且要注意数据库自有 buffer pool 不受它影响。