近期检查设备时,我遇到一个很直观的现象:一台 16GB 内存的 Mac 显示约 15GB 已用,但系统内存压力正常,交换空间使用仍为零。只看“已用”这一项,很容易得出设备即将撑不住的判断。

同一个“占用”,可能是不同的统计口径

系统会利用内存保存读过的文件和其他缓存,以减少之后的磁盘读取。有些部分可以在应用需要时回收。因此,“没有闲着”与“无法再分配”不是同一回事。不同操作系统和监控工具对已用内存的展示,也不完全一致。

这不意味着所有高占用都是正常的。如果应用持续申请内存、交换活动变得频繁,或者系统出现明显停顿,就应继续排查。不能从“系统有缓存”跳到“永远不用担心内存”,同样不能从一个高百分比跳到“必须马上重启”。

我更关心连续出现的信号

在 Mac 上,我会结合内存压力、压缩与 Swap 看趋势。在 Linux 上,会特别区分 MemFree 与 MemAvailable。后者试图估计在不使用交换空间的情况下,还能提供给新应用多少内存。

单独看到已有 Swap,也不等于当前正在大量交换。需要比较两个时间点的换入、换出计数,观察活动是否持续。一次旧的高峰可能留下交换占用,但当前负载已经回落。历史累计数字和当前速率必须分开解释。

虚拟机还会增加一层观察误差

宿主机中一个很大的虚拟机进程,可能对应整台客户机的内存,而不是一个应用。客户机内部又有自己的缓存和进程统计。把宿主进程与客户机占用直接相加,会把同一部分资源重复计算。

类似地,进程管理器显示的 RSS 也不宜简单相加后当作独占物理内存。排查时要明确每一个数字来自哪里,再把它与系统压力和时间变化联系起来。

这次观察能够说明什么

这次检查能支持的结论是:在所观察的时段,没有出现需要紧急停服来释放内存的迹象。它不能证明某个进程永远不会泄漏,也不能替代高并发时的测试。对运行中的模型服务,保留趋势和失败记录,比为了让数字变小而反复清缓存更有价值。

参考资料

Apple:查看内存使用情况 ↗Linux Kernel:/proc 中的内存统计 ↗
这是一则可以继续修订的学习记录。文中观察与方法具有各自的适用条件,不构成未经验证的效果承诺。
← 返回全部笔记