4. 内存资源基础
在多 OS CPU 环境中,内存不是“一块可以随意切分的蛋糕”,而是一套由硬件地址转换、内核页表管理和 NUMA 拓扑共同约束的资源体系。理解物理内存、虚拟内存、分页、交换空间、内存映射与 NUMA 架构,是后续做 CPU 与内存配比、虚拟机内存超分、容器内存限制和性能调优的前提。
一、核心原理:从物理内存到虚拟地址空间
物理内存是主板内存条提供的真实存储容量,CPU 通过内存控制器访问。虚拟内存是每个进程看到的连续地址空间,由 MMU(内存管理单元)借助页表把虚拟地址翻译为物理地址。分页机制把地址空间切成固定大小的页,常见为 4KB,也支持 2MB、1GB 的大页。页表项记录页框号、权限位、脏位、访问位和存在位;当访问的页不在物理内存中时触发缺页异常,由内核决定调入页面或执行交换。
交换空间是磁盘或 SSD 上预留的区域,用于在物理内存紧张时换出匿名页。内存映射则把文件或设备区域直接映射到进程地址空间,使读写文件像访问内存一样,典型如 mmap、共享库加载和 tmpfs。NUMA 架构把 CPU 和内存划分为多个节点,每个节点内 CPU 访问本地内存延迟低、带宽高,跨节点访问则明显变慢。
二、方法流程:内存资源规划的关键步骤
- 识别物理内存与可用内存:用
free -h、/proc/meminfo查看总量、可用量、缓存与缓冲区,区分 MemFree 与 MemAvailable。 - 确认虚拟内存与分页配置:检查页大小、透明大页 THP 状态、
vm.swappiness与vm.overcommit_memory。 - 规划交换空间:根据业务是否允许换出、SSD 寿命和延迟要求决定 swap 大小与优先级。
- 梳理内存映射:统计共享库、mmap 文件、tmpfs 和匿名映射占用,避免映射区与堆栈冲突。
- 识别 NUMA 拓扑:用
numactl --hardware、lscpu查看节点、CPU 归属和距离矩阵。 - 绑定与验证:对延迟敏感进程使用
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 与内存协同规划打下可靠基础。