☰ 第 07 章 · 内存:容量、回收与换页
COURSE SOURCES

参考来源与版权说明

仅作来源说明 · 不提供原始资料下载
查看全部来源说明
01
START HERE

这章解决什么问题

内存看似只要看“用了多少”,实际最容易误判。Linux 会主动把空闲内存用于页缓存;虚拟内存、常驻内存和共享页又不是同一概念。真正的问题是:工作集能否留在主存,分配是否被回收或配额阻塞,换页是否伤害关键路径,以及增长究竟是缓存预热、正常业务增长还是泄漏。本章给出一条先识别压力、再归因到进程与分配路径的路线。

02
SECTION 02

五条核心结论

  1. 空闲内存少不等于内存不足。要同时看可用内存、页扫描、直接回收、交换、PSI 与 OOM 事件。
  2. 先查饱和度。持续页扫描、非零换入换出、直接回收延时或 OOM,比单个使用率数字更接近用户感受到的问题。
  3. VSZ、RSS、PSS 与 WSS 回答不同问题。RSS 含共享页,对多个进程直接求和会重复计算;WSS 才描述近期真正活跃的页。
  4. 内存位置也重要。NUMA 远端访问、分配器竞争、页大小和 TLB 覆盖范围,都可能在“容量尚足”时造成延时。
  5. 调优必须由证据驱动。调整 swappiness、巨型页、NUMA 绑定或 cgroup 限额前,应保留基线并验证收益与副作用。
03
SECTION 03

核心模型与关键指标

进程访问虚拟地址,页表把它映射到物理页,TLB 缓存映射结果。匿名页通常承载堆和栈;文件页可由页缓存保存,需要时可丢弃并从文件重新读取。缺页并非天然异常:轻微缺页不需磁盘,严重缺页才可能等待存储。匿名页被移入交换设备,则表明主存压力或策略正在影响驻留。

观察面关键指标主要回答
系统容量available、free、cache、swap used还有多少可快速分配的空间
压力与饱和PSI some/full、pgscan、pgscand、si/so、OOM任务是否因回收或交换停顿
进程占用RSS、PSS、VSZ、匿名页、映射谁占用,是否重复计算共享页
活跃集合WSS、引用页变化近期真正需要驻留多少内存
NUMAnuma_hit、numa_miss、other_node数据是否靠近执行它的 CPU
04
SECTION 04

诊断步骤

  1. 先确认现象与时间窗:是延时抖动、吞吐下降、进程被杀,还是容量告警。
  2. 用 vmstat 与 PSI 判断是否存在持续压力;再查系统日志中的 OOM 和分配失败。
  3. 区分“空闲少但可回收缓存多”与“工作集超过可用主存”。有交换设备时,重点看 si、so 是否持续变化。
  4. 按 RSS/PSS 找到大进程,再用 pmap、smaps 或应用自身堆分析拆分匿名页、文件映射和共享页。
  5. 若压力呈慢性增长,画出进程内存随时间曲线,结合业务量判断缓存预热、正常增长与泄漏。
  6. 多插槽系统再看 NUMA 命中;容器环境还要检查 cgroup 限额与节流,不能只看宿主机剩余内存。
05
SECTION 05

常用工具与命令

以下命令只读;部分指标、列名和权限随内核、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 工具可继续下钻,但高频分配跟踪可能显著增加开销,生产环境应短时、带过滤使用。

06
SECTION 06

如何解读结果

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 时,说明许多常驻页近期并不活跃,但也不能据此立即缩容:采样窗口必须覆盖日峰、批处理和故障恢复。页扫描偶发一次不等于持续压力,应把速率、持续时间和应用延时放到同一时间线上。

07
SECTION 07

常见误判

  • 把“内存使用率 95%”直接判为故障,却不看可回收缓存和压力指标。
  • 把所有缺页都当成磁盘访问;轻微缺页可能只是建立映射。
  • 对所有进程 RSS 求和后声称超过物理内存,忽略共享页重复计算。
  • 看到进程增长就认定泄漏;应用缓存预热和分配器保留也会增长。
  • 在生产环境用逐步缩减内存来估算 WSS,主动制造交换和性能下降。
  • 复制固定的 swappiness、巨型页或 NUMA 参数,不做版本核对和前后对比。
08
SECTION 08

五分钟自测

  1. free 很低但 available 很高、PSI 为零,最可能是什么?答:页缓存占用了空闲空间,尚无压力证据。
  2. vmstat 中哪两列持续非零提示正在换页?答:si 与 so。
  3. 为什么不能直接汇总所有进程 RSS?答:共享页会被多次计入。
  4. 哪个指标更接近近期真正活跃的内存?答:工作集大小 WSS。
  5. 容器达到内存限制而宿主机仍很空闲,属于哪一层问题?答:资源控制或配额问题。
09
SECTION 09

本章小结

内存诊断的核心不是寻找一个“正常使用率”,而是证明工作集、压力与用户延时之间的关系。先用低开销系统指标确认压力,再从进程、映射、分配路径和 NUMA 逐层归因;调优只应在基线清楚、可回滚且能复测时进行。

同样的采样方法应在健康时保留一份基线,故障发生后才有可信的比较对象。

10
SECTION 10

来源定位

  • PDF 357-376 页:虚拟内存、换页、工作集、分配器与 NUMA 架构。
  • PDF 376-382 页:USE、使用情况描述、泄漏检测和内存收缩方法。
  • PDF 382-403 页:vmstat、PSI、sar、ps、pmap、numastat、WSS 与 BPF 工具。
  • PDF 404-410 页:可调参数、巨型页、分配器、NUMA 绑定、资源控制与参考资料。
📝
QUICK CHECK

章节测验

5 道单选题。答错有解析,答对看来源页码。

单选题 · 第 1/5
已答 0/5

一台 Linux 主机的 free 很低,但 available 仍较高,PSI memory 接近零,vmstat 的 si/so 也持续为零。最合理的初步判断是什么?

⚡ 用本章题目开始计时冲刺