4. 内存资源基础

在多 OS CPU 环境中,内存不是“一块可以随意切分的蛋糕”,而是一套由硬件地址转换、内核页表管理和 NUMA 拓扑共同约束的资源体系。理解物理内存、虚拟内存、分页、交换空间、内存映射与 NUMA 架构,是后续做 CPU 与内存配比、虚拟机内存超分、容器内存限制和性能调优的前提。

一、核心原理:从物理内存到虚拟地址空间

物理内存是主板内存条提供的真实存储容量,CPU 通过内存控制器访问。虚拟内存是每个进程看到的连续地址空间,由 MMU(内存管理单元)借助页表把虚拟地址翻译为物理地址。分页机制把地址空间切成固定大小的页,常见为 4KB,也支持 2MB、1GB 的大页。页表项记录页框号、权限位、脏位、访问位和存在位;当访问的页不在物理内存中时触发缺页异常,由内核决定调入页面或执行交换。

交换空间是磁盘或 SSD 上预留的区域,用于在物理内存紧张时换出匿名页。内存映射则把文件或设备区域直接映射到进程地址空间,使读写文件像访问内存一样,典型如 mmap、共享库加载和 tmpfs。NUMA 架构把 CPU 和内存划分为多个节点,每个节点内 CPU 访问本地内存延迟低、带宽高,跨节点访问则明显变慢。

虚拟内存 → 分页 → 物理内存 / 交换空间 / NUMA 节点 进程虚拟地址空间 代码段 / 只读数据 堆(malloc / brk) 文件映射 / 共享库 栈(线程栈 / 局部变量) MMU + 页表 虚拟地址 → 物理地址 4KB / 2MB / 1GB 页 缺页异常 → 内核处理 访问 物理内存(RAM) 页框 0 页框 1 页框 2 页框 3 命中 交换空间(Swap / 页面文件) 匿名页换出 · 内存紧张时使用 SSD 上延迟远高于 RAM 缺页换出 NUMA 架构:本地访问快,跨节点访问慢 Node 0 CPU 0-7 · 本地内存 64GB 本地延迟 ≈ 80ns 本地带宽高 Node 1 CPU 8-15 · 本地内存 64GB 本地延迟 ≈ 80ns 本地带宽高 跨节点互连(UPI / Infinity Fabric) 远程延迟 ≈ 140ns,带宽受限

二、方法流程:内存资源规划的关键步骤

  1. 识别物理内存与可用内存:用 free -h、/proc/meminfo 查看总量、可用量、缓存与缓冲区,区分 MemFree 与 MemAvailable。
  2. 确认虚拟内存与分页配置:检查页大小、透明大页 THP 状态、vm.swappiness 与 vm.overcommit_memory。
  3. 规划交换空间:根据业务是否允许换出、SSD 寿命和延迟要求决定 swap 大小与优先级。
  4. 梳理内存映射:统计共享库、mmap 文件、tmpfs 和匿名映射占用,避免映射区与堆栈冲突。
  5. 识别 NUMA 拓扑:用 numactl --hardware、lscpu 查看节点、CPU 归属和距离矩阵。
  6. 绑定与验证:对延迟敏感进程使用 numactl --cpunodebind 与 --membind,并用 numastat 观察命中率。
# 查看内存与 NUMA 拓扑
free -h
cat /proc/meminfo | grep -E "MemTotal|MemAvailable|SwapTotal|HugePages"
numactl --hardware
lscpu | grep -i numa

# 将进程绑定到 Node 0 的 CPU 与内存
numactl --cpunodebind=0 --membind=0 ./latency_sensitive_app

# 查看 NUMA 命中与未命中
numastat -p $(pgrep latency_sensitive_app)

三、案例/场景:多 OS CPU 下的内存分配

假设一台双路服务器有 2 个 NUMA 节点,每节点 16 核、64GB 内存,运行 4 个虚拟机,每个虚拟机 8 vCPU、24GB 内存。若不做 NUMA 绑定,虚拟机内存可能跨节点分布,vCPU 访问远程内存导致延迟上升。合理做法是把每个虚拟机尽量放在同一节点内,或按节点均衡放置,并预留 10%~15% 内存给宿主内核、页缓存和突发开销。

资源项 典型值/建议 规划要点
物理内存 128GB(2×64GB) 按节点统计,避免单节点耗尽
虚拟内存/分页 4KB 基础页,THP 按需 数据库常关闭 THP,减少延迟抖动
交换空间 16GB~32GB 或按需 延迟敏感业务降低 swappiness
内存映射 共享库、tmpfs、mmap 文件 关注映射区增长与地址空间碎片
NUMA 绑定 每 VM 绑定同节点 用 numastat 验证本地命中率

四、误区与复盘

常见误区一:只看 MemFree 判断内存不足。Linux 会把空闲内存用于页缓存,MemAvailable 才更接近真实可用量。若 MemAvailable 长期低于 10%,才需要警惕。

常见误区二:认为 swap 越大越好。swap 只是缓冲,不是扩容。频繁换入换出会造成 I/O 抖动,SSD 寿命也会受影响。

常见误区三:忽略 NUMA 距离。跨节点访问延迟可能增加 50% 以上,对高频交易、实时音视频和数据库影响显著。

复盘建议:每次扩容或迁移后,记录 numastat 的本地命中率、vmstat 的 si/so、/proc/meminfo 的 MemAvailable 和 HugePages 使用量。把“物理内存—虚拟内存—分页—交换—映射—NUMA”作为一条完整链路来观察,而不是孤立地看某一个指标。

掌握这些基础后,才能在多 OS CPU 场景中合理设置内存预留、超分比例、大页策略和 NUMA 亲和性,为后续的 CPU 与内存协同规划打下可靠基础。