常见的运维告警:某核心业务服务器内存使用率超过 95%!
登录主机后,没有哪个进程看起来“异常吃内存”,但 free -h 的输出却让人不安。
$ free -h total used free shared buff/cache availableMem: 62G 9.8G 864M 1.2G 51G 50GSwap: 4G 512K 4G
buff/cache 占用了 50 多 GB。这是不是内存泄漏?要不要清缓存?要不要重启?
这个问题,几乎每个 Linux 工程师应该都遇到过吧,不要慌,继续往下看,我们一起分析。
一、问题从哪里开始?
内存告警出现时,最容易产生两个误判:
把 free 很少,当成内存不足
把 buff/cache 当成“被占用的内存”
这两个判断,在 Linux 上都是不准确的。
Linux 的内存管理逻辑与很多人的直觉相反:它并不追求“空闲”,而是追求“高效利用”。
二、Page Cache 是什么?
Page Cache 是 Linux 用物理内存缓存文件数据的一套机制。
只要系统中存在空闲内存,Linux 就会把最近访问过的文件内容缓存在内存里,包括:
普通文件数据
目录项(dentry)
inode 元数据
mmap 映射的文件页
目的只有一个:减少磁盘 I/O。
一个最常见的读路径
当进程调用 read() 时,数据并不是直接从磁盘读到用户空间:
先检查 Page Cache
命中则直接从内存返回
未命中才触发磁盘 I/O
同时把数据放入 Page Cache
这意味着:
同一文件被多个进程访问,只会缓存一份
后续访问几乎是“零成本”的内存访问
三、为什么 Page Cache 会“占满内存”?
因为在 Linux 看来:
空闲内存没有任何价值
只要系统暂时不缺内存,Page Cache 就会持续增长,把所有“暂时不用的内存”变成缓存。
这也是为什么你经常会看到:
free 很少
buff/cache 很大
但系统运行完全正常
这不是问题,而是设计目标。
四、Page Cache 会不会被回收?
会,而且永远是最先被回收的对象。
Linux 的内存回收顺序非常明确:
不活跃的 Page Cache
Slab Cache
匿名页(进程堆栈)
最后才是 OOM
只要系统出现内存压力,Page Cache 会被立刻回收。
回收逻辑(简化)
for page in inactive_list: if page_clean: free(page) else: writeback(page)
这也是为什么:
Page Cache 不可能构成内存泄漏
它不会“赖着不走”
也不会挤占进程内存
五、available 才是真正该看的指标
free 输出中最容易被忽略的一列,其实是最重要的:
它表示:
在不回收进程匿名内存的前提下,系统可以立即提供的内存量。
也就是说:
buff/cache 很大
但 available 也很大
系统实际上并不缺内存
更精确的数据可以从这里看到:
重点关注:
MemAvailable
Cached
Dirty
Writeback
六、什么时候 Page Cache 会“带来问题”?
绝大多数情况下,不会。
真正可能引发性能波动的,是脏页写回。
当写入压力较大,脏页积累超过阈值时,内核会触发同步写回,可能导致:
这类问题,通常与以下参数有关:
vm.dirty_background_ratiovm.dirty_ratiovm.dirty_expire_centisecs
这属于写回策略调优的问题,不是 Page Cache 本身的问题。
七、手动 drop_caches 是不是“优化”?
不是。
echo 3 > /proc/sys/vm/drop_caches
这个操作只适合:
在生产环境频繁清缓存,通常只会带来:
Linux 对 Page Cache 的管理,比人为干预要聪明得多。
所以千万不能在生产环境使用,笔者在生产环境中用这个 echo 3 命令,设备遇到很多次间隔5个月左右就会hung住的异常问题,如果要使用这里要使用,1 2 也比直接3 要好!
echo 1 > /proc/sys/vm/drop_cachesecho 2 > /proc/sys/vm/drop_caches
八、Page Cache 和真正内存泄漏的区别
真正的内存泄漏,通常表现为:
某个进程 RSS 持续增长
anonymous memory 不回落
直到 OOM 或进程退出
Page Cache 则完全相反:
这两者不应混为一谈。
九、最后
Page Cache 不是“隐形内存泄漏”。
它是 Linux 内核用来把空闲内存变成性能的一种方式。
一个健康的 Linux 系统,往往表现为:
free 很少
buff/cache 很大
available 充足
业务稳定
真正需要警惕的,不是 Page Cache 占了多少内存,而是 在需要内存时,它能否被迅速回收。
在这一点上,Linux 已经被验证了二十多年。
如果一定要给 Page Cache 一个评价,那只能是:
它不是问题,而是 Linux 能跑得这么快的原因之一。