参考来源与版权说明
这章解决什么问题
内存看似只要看“用了多少”,实际最容易误判。Linux 会主动把空闲内存用于页缓存;虚拟内存、常驻内存和共享页又不是同一概念。真正的问题是:工作集能否留在主存,分配是否被回收或配额阻塞,换页是否伤害关键路径,以及增长究竟是缓存预热、正常业务增长还是泄漏。本章给出一条先识别压力、再归因到进程与分配路径的路线。
五条核心结论
- 空闲内存少不等于内存不足。要同时看可用内存、页扫描、直接回收、交换、PSI 与 OOM 事件。
- 先查饱和度。持续页扫描、非零换入换出、直接回收延时或 OOM,比单个使用率数字更接近用户感受到的问题。
- VSZ、RSS、PSS 与 WSS 回答不同问题。RSS 含共享页,对多个进程直接求和会重复计算;WSS 才描述近期真正活跃的页。
- 内存位置也重要。NUMA 远端访问、分配器竞争、页大小和 TLB 覆盖范围,都可能在“容量尚足”时造成延时。
- 调优必须由证据驱动。调整 swappiness、巨型页、NUMA 绑定或 cgroup 限额前,应保留基线并验证收益与副作用。
核心模型与关键指标
进程访问虚拟地址,页表把它映射到物理页,TLB 缓存映射结果。匿名页通常承载堆和栈;文件页可由页缓存保存,需要时可丢弃并从文件重新读取。缺页并非天然异常:轻微缺页不需磁盘,严重缺页才可能等待存储。匿名页被移入交换设备,则表明主存压力或策略正在影响驻留。
| 观察面 | 关键指标 | 主要回答 |
|---|---|---|
| 系统容量 | available、free、cache、swap used | 还有多少可快速分配的空间 |
| 压力与饱和 | PSI some/full、pgscan、pgscand、si/so、OOM | 任务是否因回收或交换停顿 |
| 进程占用 | RSS、PSS、VSZ、匿名页、映射 | 谁占用,是否重复计算共享页 |
| 活跃集合 | WSS、引用页变化 | 近期真正需要驻留多少内存 |
| NUMA | numa_hit、numa_miss、other_node | 数据是否靠近执行它的 CPU |
诊断步骤
- 先确认现象与时间窗:是延时抖动、吞吐下降、进程被杀,还是容量告警。
- 用 vmstat 与 PSI 判断是否存在持续压力;再查系统日志中的 OOM 和分配失败。
- 区分“空闲少但可回收缓存多”与“工作集超过可用主存”。有交换设备时,重点看 si、so 是否持续变化。
- 按 RSS/PSS 找到大进程,再用 pmap、smaps 或应用自身堆分析拆分匿名页、文件映射和共享页。
- 若压力呈慢性增长,画出进程内存随时间曲线,结合业务量判断缓存预热、正常增长与泄漏。
- 多插槽系统再看 NUMA 命中;容器环境还要检查 cgroup 限额与节流,不能只看宿主机剩余内存。
常用工具与命令
以下命令只读;部分指标、列名和权限随内核、procps、sysstat 与发行版变化。
vmstat -Sm 1 5
cat /proc/pressure/memory
free -h
swapon --show
sar -B 1 5
ps -eo pid,comm,%mem,rss,vsz --sort=-rss
pmap -x PID
numastat
dmesg --ctime | grep -i -E "out of memory|oom|memory failure"
vmstat 的第一行在部分版本中是自启动以来的平均值,应优先读后续区间。PSI 需要较新的 Linux;pmap 与 dmesg 可能需要额外权限。跟踪 malloc、缺页或直接回收的 BPF 工具可继续下钻,但高频分配跟踪可能显著增加开销,生产环境应短时、带过滤使用。
如何解读结果
free 很小、available 仍充足,且 PSI、si/so、页扫描都接近零,通常只是缓存利用了内存。反之,pgscand 上升说明应用分配路径进入直接回收;PSI some 表示至少一些任务受阻,full 表示所有可运行任务同时因内存停顿,后者更严重。si/so 持续非零比“swap 已用多少”更值得警惕:已用交换页可以长期不动,并不等于正在抖动。
RSS 高说明进程常驻页多,但共享库会被重复计入;需要准确分摊时看 PSS。VSZ 很大可能只是预留地址空间。numa_miss、numa_foreign 或 other_node 相对命中持续升高时,要结合线程在哪个节点运行,验证远端内存访问。
趋势比快照更有解释力。若 RSS 随请求量增长后稳定,可能是有界缓存;若业务量稳定而匿名内存持续单调增长,并最终伴随回收或 OOM,才更像无界增长。WSS 远小于 RSS 时,说明许多常驻页近期并不活跃,但也不能据此立即缩容:采样窗口必须覆盖日峰、批处理和故障恢复。页扫描偶发一次不等于持续压力,应把速率、持续时间和应用延时放到同一时间线上。
常见误判
- 把“内存使用率 95%”直接判为故障,却不看可回收缓存和压力指标。
- 把所有缺页都当成磁盘访问;轻微缺页可能只是建立映射。
- 对所有进程 RSS 求和后声称超过物理内存,忽略共享页重复计算。
- 看到进程增长就认定泄漏;应用缓存预热和分配器保留也会增长。
- 在生产环境用逐步缩减内存来估算 WSS,主动制造交换和性能下降。
- 复制固定的 swappiness、巨型页或 NUMA 参数,不做版本核对和前后对比。
五分钟自测
- free 很低但 available 很高、PSI 为零,最可能是什么?答:页缓存占用了空闲空间,尚无压力证据。
- vmstat 中哪两列持续非零提示正在换页?答:si 与 so。
- 为什么不能直接汇总所有进程 RSS?答:共享页会被多次计入。
- 哪个指标更接近近期真正活跃的内存?答:工作集大小 WSS。
- 容器达到内存限制而宿主机仍很空闲,属于哪一层问题?答:资源控制或配额问题。
本章小结
内存诊断的核心不是寻找一个“正常使用率”,而是证明工作集、压力与用户延时之间的关系。先用低开销系统指标确认压力,再从进程、映射、分配路径和 NUMA 逐层归因;调优只应在基线清楚、可回滚且能复测时进行。
同样的采样方法应在健康时保留一份基线,故障发生后才有可信的比较对象。
来源定位
- PDF 357-376 页:虚拟内存、换页、工作集、分配器与 NUMA 架构。
- PDF 376-382 页:USE、使用情况描述、泄漏检测和内存收缩方法。
- PDF 382-403 页:vmstat、PSI、sar、ps、pmap、numastat、WSS 与 BPF 工具。
- PDF 404-410 页:可调参数、巨型页、分配器、NUMA 绑定、资源控制与参考资料。
章节测验
共 5 道单选题。答错有解析,答对看来源页码。