主题
19 · 虚拟内存:RSS、VSZ 与 OOM
目标:理解虚拟地址与物理内存的分工,会读 RSS/VSZ,会看 OOM 相关线索。
前置:17 · 地址空间;命令行对照 05 · free/df。
1. 环境前提
bash
mkdir -p ~/lab/os
# 可选:sudo apt install -y smem1
2
2
2. 概念框(轻量课本)
| 词 | 一句话 |
|---|---|
| 虚拟内存 | 每个进程以为自己有一整片「连续地址」;由内核映射到物理页或磁盘(swap) |
| 缺页(page fault) | 访问尚未落在物理页上的虚拟地址时,内核介入补页或报错 |
| VSZ(虚拟大小) | 地址空间里映射的总量,往往看起来很大 |
| RSS(常驻集) | 当前占着的物理内存粗估(运维更常看) |
| OOM Killer | 物理内存吃紧时,内核可能杀掉占内存多的进程保整机 |
text
进程虚拟地址 ──映射表──► 物理 RAM 页
└──► 或尚未分配 / 在 swap1
2
2
3. 动手:读内存数字
bash
free -h
head -n 20 /proc/meminfo
ps -o pid,rss,vsz,pmem,cmd -p $$
ps -o pid,rss,vsz,pmem,cmd --sort=-rss | head -n 151
2
3
4
5
2
3
4
5
单位提醒:ps 的 RSS/VSZ 常见为 KiB。
看映射:
bash
# 映射片段很多,先看头尾
head -n 15 /proc/$$/maps
tail -n 10 /proc/$$/maps
grep Vm /proc/$$/status1
2
3
4
2
3
4
status 字段 | 含义(近似) |
|---|---|
VmSize | 虚拟大小 ≈ VSZ |
VmRSS | 常驻 ≈ RSS |
VmSwap | 进了 swap 的量 |
制造一点可观察的分配(Bash 仅示意,勿在生产机狂跑):
bash
# 读一大文件进变量会涨 RSS;用完即退
python3 - <<'PY'
import time
print("pid", __import__("os").getpid())
buf = bytearray(50 * 1024 * 1024) # ~50MiB
time.sleep(15)
PY
# 另开会话:ps -o pid,rss,vsz,cmd -C python31
2
3
4
5
6
7
8
2
3
4
5
6
7
8
4. OOM 怎么读(练习机)
bash
# 是否刚发生过 OOM(需权限;无则空)
sudo dmesg -T | grep -i oom | tail -n 20
# 或
sudo journalctl -k | grep -i 'out of memory' | tail -n 201
2
3
4
2
3
4
典型线索:某 PID、进程名、oom_score、被杀原因。
处理方向:加内存 / 限服务内存 / 修泄漏 / 降并发——先定位是谁吃满。
5. 与命令行篇对照
| 05 命令 | OS 视角 |
|---|---|
free -h | 看物理内存与 buff/cache(cache 可回收,不等于「真的只剩那么点」) |
ps 的 %MEM | 相对物理内存占比 |
| 服务「被系统杀掉」 | 优先查 OOM 日志 |
6. 动手清单
- [ ]
free -h与/proc/meminfo各看一眼 - [ ] 对当前 shell 对比 RSS 与 VSZ(VSZ 通常更大)
- [ ]
ps --sort=-rss找出当前最吃内存的进程 - [ ] 能口述:虚拟内存 ≠ 已经占用的物理 RAM
7. 常见翻车
| 翻车 | 处理 |
|---|---|
| 看见 VSZ 几 GB 就慌 | 先看 RSS;共享库会算进虚拟映射 |
free 的 available 与 used 困惑 | 看 available 更接近「还能再给应用多少」 |
| 无 swap 时 OOM 更早 | 云机常关 swap;更要限服务内存 |
8. 官方 / 延伸
man free、man 5 proc- Kernel:Out Of Memory Management(选读)
下一篇:文件系统 —— inode、挂载与路径解析。
