凌晨收到告警时,VPS内存占用已经达到93%,但应用请求仍然正常,系统也没有明显卡顿。直接重启服务后,数值很快又涨回去,值班人员于是陷入疑惑:究竟是哪个进程吃掉了内存,还是监控统计本身失真?排查这类问题,不能只看一个百分比,还要把VPS内存水位拆成进程、内核和缓存三部分,才能找到真正的风险点。
如果你正在选机器,或者想先把线路和配置跑通再谈长期方案,可以先看看这几家的线路说明和技术参数:野草云(全球云服务器),先看清带宽线路、流量策略和退款条款,再决定要不要迁。
大多数监控面板展示的是系统或cgroup的内存总量,包含匿名页、文件映射、Page Cache、交换分区相关开销以及部分内核结构。以VPS为例,读取配置、编译文件或跑数据库时,文件内容会暂时留在缓存中,监控数值会立刻上升,但这些页面在压力到来时可以回收,并不等于业务进程永久占用了同等大小的内存。

进程列表中的RSS也不能直接当作独占内存。多个进程可能共享同一份动态库或内存页,进程内存拆解还要结合PSS、Private Dirty、Private Clean、Swap等指标观察。PSS会按共享页使用者数量分摊,Private Dirty更接近进程独有的脏数据;如果只有缓存和可回收文件持续增长,而Private Dirty稳定,通常优先考虑缓存膨胀,而不是内存泄漏。
可以先按RSS、PSS或Private Dirty排序,再用smaps、pmap等工具核对单个进程的映射明细。数据库、Java、Node.js等服务要同时查看堆内存、线程栈、共享库和连接数,不能只盯住进程总数。另一个常见误区是把容器宿主机的总内存和容器限额混在一起;应同时查看cgroup当前用量、限制值、memory.events,以及宿主机和容器各自的swap使用情况。

判断缓存回收机制是否正常,可在低峰期读取缓存、申请内存或施加可控压力,观察使用量下降后是否能再次回升。可回收缓存下降、进程Private Dirty不升,通常说明内核正在正常回收;若数值只涨不回,就要检查是否存在频繁分配的内存泄漏。连续采样时,应关注趋势、增长速率和重启后的基线,而不是某一秒的尖峰。
内存泄漏识别的关键不是“内存变高”本身,而是进程长期增长、重启后基线抬升,且缓存回收无法解释。OOM Killer也不是看到99%就一定触发:只有分配请求无法满足,或cgroup触及限额并触发回收失败时,才可能杀掉进程。因此要查看内核日志、cgroup事件和被杀进程记录,确认究竟是全局OOM、memcg限制,还是应用自身申请内存失败。排查期间使用随身服务器留存命令输出和监控快照,也能避免数据在重启后丢失。
判断VPS内存水位,不要只看free,还要看available、PSI 压力与回收速率。Linux 会把空闲页用于文件缓存;内存紧张时,干净的缓存回收机制会先回收页缓存,脏页则写回后释放。若available稳定且业务延迟正常,高 RSS 通常不是故障。
进程内存拆解要看 RSS、PSS、USS 及 Anon/File/Shmem。RSS 含匿名页、文件映射和共享页,PSS 按比例分摊共享内存,USS 更接近独占成本;RssAnon 增长常指向堆或栈,RssFile 增长则可能来自映射、日志或页缓存。排查时按进程树统计,避免重复计算。
别把所有buff/cache都视为可立即释放,也不要看到 swap 写入就判定 OOM。前者忽略脏页回写和 cgroup 限额,后者还可能由冷数据换页造成,应结合磁盘延迟与 PSI 判断。
先连续采样free -m、vmstat 1、pidstat -r和smem,确定异常来自单进程、cgroup 还是整机。容器环境同时查看memory.current、memory.stat、memory.high;宿主机有余量,不代表容器未触顶。

内存泄漏识别的关键,是稳定负载下私有匿名内存随时间单调增长。用pmap -x或smaps_rollup定位增长段,再结合 heap dump 确认对象类型。若增长来自RssFile,优先查日志轮转、mmap 和 page cache;若来自 kernel slab、cgroup cache 或 dentry,则不属于应用堆泄漏。
OOM Killer触发条件取决于分配路径与限制层级。全局 OOM 常在整机无可回收内存时发生;cgroup OOM 可能在组内触及memory.max时直接触发,未必先耗尽宿主机。核对dmesg、memory.events里的oom_kill及high/max计数,再用被杀进程日志验证原因。
可执行检查清单:①看available与 PSI;②按 RSS→PSS/USS→Anon/File 拆解;③连续采样;④对照memory.events与 OOM 日志;⑤验证增长是否随时间或请求量单调;⑥核对容器限额、swap 及磁盘延迟;⑦复压观察回收水位和尾延迟。只有证据指向私有匿名内存持续增长,才进入泄漏分析或重启止损。