内存与 OOM58 条

手动清理页面缓存

向 /proc/sys/vm/drop_caches 写 1(页缓存)/2(dentry、inode)/3(两者)触发清理;用于测试或演示,生产需评估副作用。

操作是什么

向 /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 缓存状态等线索。故障分析或性能定位期间不要执行,否则后续数据无法与历史对比。

易错点

  • 把清理缓存当成常规内存运维手段:缓存可自动回收,手工清只会让后续访问重新变慢
  • 故障分析期间执行:现场证据被抹掉,之后的观测无法与历史数据对比
  • 不先执行 sync:脏页写回与新分配混在一起,影响测量结果的准确性
  • 以为能释放出大量内存:不可回收对象与 tmpfs 页不会被清理,预期容易落空
  • 在容器内执行:通常没有权限或只作用于特定命名空间,容易得到「无效」的结论

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌