服务公告

服务公告 > 常见问题 > 内存一直高位但没崩:缓存与泄漏的区分

内存一直高位但没崩:缓存与泄漏的区分

发布时间:2026-01-25 18:19
## 概念 free 命令输出的内存占用常年百分之八九十,很多人一看就紧张,急着重启或扩容。但 Linux 的内存管理与直觉不同:空闲内存在内核眼里是浪费的内存,它会主动拿去当文件缓存,加速后续读写。判断内存健康与否,看的不是占用率,而是可用内存与换页活动的形态。区分缓存占用与真正的泄漏,是这项判断的基本功。 ## 原理:可用内存才是关键 关键在 free 输出的 available 一列:它等于真正空闲的内存加上可以随时回收的缓存,代表应用还能申请到的量。占用率九成、可用还有两成,系统完全健康。真正需要警惕的信号有两个:available 持续下滑逼近零;换入换出速率持续非零。验证缓存归属有个经典动作:向内核申请释放缓存后看内存数字的变化,被释放回来的就是缓存,纹丝不动的才是进程实占。 ``` sync; echo 3 > /proc/sys/vm/drop_caches ``` 泄漏的指纹则是另一种形态:特定进程的驻留内存随时间单调爬升,回收缓存、重启业务之外的手段都无法让它回落,几天周期画成曲线是一条只升不降的斜线。 ## 最小实操 持续观察单个进程的内存曲线。 ``` while true; do ps -o rss -p 2517 --no-headers >> mem.log; sleep 300; done ``` 攒几天的数据画图,平坦波动是正常形态,持续爬升才指向泄漏,配合版本变更的时间点还能锁定引入版本。曲线之外再对照服务的请求量:内存增长与业务量同涨同落属于正常伸缩,业务量回落而内存不回落,泄漏的嫌疑就重了几分。 ## 常见错误 一是见占用率高就重启,缓存重建反而造成一段时间的服务变慢;二是把缓存当泄漏治,反复清缓存除了损失性能毫无意义;三是真泄漏时只靠定时重启续命,不报给开发定位,窗口越拖越长。顺云云服务器上把 available 与换页速率配进告警,占用率仅作参考曲线,告警响了再动手,不响就让缓存安心干活。