4.7.1 内存管理基础:地址空间、分页与页缓存
内存管理基础:地址空间、分页与页缓存#
本节聚焦 Linux 内存管理三大核心:进程虚拟地址空间、分页与页表、页缓存。通过示例与排错方法,建立性能调优与故障定位的基础能力。
1. 进程虚拟地址空间#
- 概念:每个进程拥有独立的虚拟地址空间,互不干扰,内核通过页表映射到物理内存。
- 常见区域:text、data/bss、heap、stack、mmap、kernel space。
- 关键指标:
- RSS:实际驻留物理内存
- VIRT:虚拟地址空间总量
- PSS:共享库按比例分摊内存
原理草图(进程地址空间)
示例:查看进程地址空间与映射
# 1) 查看进程的内存映射
pid=$(pgrep -n bash)
cat /proc/$pid/maps | head -n 10
# 2) 查看更易读的内存映射与大小
pmap -x $pid | head -n 15
命令解释:
- /proc/<pid>/maps:逐段显示虚拟地址映射
- pmap -x:展示映射段大小、RSS、权限等
排错提示:
- 进程 VIRT 很大但 RSS 不高:可能是大量 mmap 保留空间(非异常)
- RSS 持续上升且无回落:怀疑内存泄漏,配合 pmap/smem 排查
2. 分页与页表机制#
- 分页:虚拟地址按固定大小页(一般 4KB)映射到物理页帧。
- 页表:维护虚拟页与物理页的映射关系。
- TLB:页表缓存,TLB miss 会导致性能下降。
- 缺页异常:
- Major Fault:需从磁盘读取
- Minor Fault:页已在内存,仅需映射
原理草图(地址转换与页表)
示例:观察缺页与分页行为
# 每秒观察分页与缺页
vmstat 1
# 查看某进程的缺页统计(minflt/majflt)
pid=$(pgrep -n nginx)
cat /proc/$pid/stat | awk '{print "minflt="$10, "majflt="$12}'
命令解释:
- vmstat 1:si/so 表示换入换出,pgfault/pgmajfault 关注分页压力
- /proc/<pid>/stat:第 10、12 列为 minor/major fault
排错提示:
- majflt 持续高:磁盘读取压力大,考虑热数据缓存、减少抖动
- si/so 持续非 0:系统开始频繁交换,应关注内存是否不足
3. 页缓存(Page Cache)#
- 作用:缓存文件系统数据,减少磁盘 I/O。
- 读缓存:读文件进入页缓存。
- 写缓存:写入先变为脏页,异步刷盘。
原理草图(页缓存读写)
示例:观察页缓存变化
# 1) 查看页缓存相关指标
grep -E 'MemFree|MemAvailable|Cached|Dirty|Buffers' /proc/meminfo
# 2) 读取大文件观察缓存上升(示例文件)
dd if=/dev/urandom of=/tmp/bigfile bs=1M count=256
cat /tmp/bigfile > /dev/null
grep -E 'Cached|Dirty' /proc/meminfo
命令解释:
- Cached:页缓存大小
- Dirty:待回写的脏页
排错提示:
- Dirty 持续过大:回写压力大,可能导致写入延迟
- Cached 很大但业务内存不足:需关注缓存回收参数
4. 内存状态与可用内存理解#
- free:完全空闲页
- available:可回收页缓存 + 空闲页
- 原则:Linux 会主动利用空闲内存做缓存,
free少不代表内存紧张。
示例:对比 free 与 available
free -h
命令解释:
- 观察 available 更能反映实际可用内存
5. 运维关注点与排查方向#
- major page fault 激增:频繁磁盘 I/O
- cached 过大但业务内存不足:缓存回收策略需优化
- dirty 突增:写回压力大,可能导致延迟抖动
- memavailable 下降:系统进入内存紧张状态
快速排查命令
# 缺页与分页
vmstat 1
# 页缓存与脏页
grep -E 'Cached|Dirty' /proc/meminfo
# 按进程查看内存占用
ps -eo pid,comm,rss,vsz,pmem --sort=-rss | head -n 10
6. 关键命令速览与解释#
free -h:查看内存概况vmstat 1:观察分页、交换、缺页cat /proc/meminfo:详细内存指标sar -B 1 3:分页/缺页统计(需sysstat)
安装与使用(sysstat 工具)
# 安装(以 CentOS/RHEL 为例)
yum install -y sysstat
# Debian/Ubuntu
apt-get update && apt-get install -y sysstat
# 使用 sar 观察分页
sar -B 1 3
7. 练习#
- 地址空间映射练习:对比
maps与pmap输出差异,并说明 RSS 与 VIRT 的区别。 - 缺页观察练习:连续执行
vmstat 1,记录 major/minor fault 的变化,并解释原因。 - 页缓存练习:读取大文件前后对比
Cached与Dirty,说明页缓存机制的作用。