虚拟地址空间
+----------+ +----------+
| Page #1 | ---> | Frame #7 |
+----------+ +----------+
| Page #2 | ---> | Frame #2 |
+----------+ +----------+
| Page #3 | ---> | Frame #5 |
+----------+ +----------+
优势:
提供隔离,每个进程有独立的虚拟空间。解决物理内存不足问题,支持 Swap。3.1.3 伙伴系统 (Buddy System)
Linux 使用 伙伴系统 进行物理内存页的分配。
优点:
减少内存碎片。高效分配和回收。3.1.4 SLAB / SLUB 分配器
针对小内存对象(如 task_struct),Linux 引入 SLAB/SLUB 分配器来提高效率。
特性SLABSLUB
结构复杂度
简单
适合场景
大型系统
通用系统
默认内核选择
早期内核
新版本默认使用
类比:伙伴系统像 仓库管理整箱货物,SLAB/SLUB 则像 便利店拆分小包装,避免浪费。
3.2 Swap 与 OOM 机制3.2.1 什么是 Swap
当物理内存不足时,Linux 会将 不活跃的内存页移到 磁盘上的 Swap 空间,释放物理内存。
3.2.2 Swap 触发机制
内核根据 页面回收算法 判断是否触发 Swap。
关键参数:vm.swappiness
查看当前值:
cat /proc/sys/vm/swappiness
临时修改:
sudo sysctl -w vm.swappiness=10
永久修改:
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf
3.2.3 kswapd 工作流程3.2.4 OOM(Out of Memory)
如果内存和 Swap 都耗尽,内核会触发 OOM Killer,选择一个进程强制杀死。
影响 OOM 的参数
Overcommit 策略/proc/sys/vm/overcommit_memory
oom_score/proc/
/oom_score数值越高,被杀掉的概率越大。
3.2.5 OOM 日志示例
当 OOM 发生时,dmesg 会输出类似日志:
Out of memory: Kill process 2345 (java) score 920 or sacrifice child
Killed process 2345 (java), UID 1000, total-vm:204800kB, anon-rss:102400kB
3.3 内存管理工具工具用途示例命令
free
总体内存和 Swap 使用情况
free -m
sar -r
内存趋势监控
sar -r 1 10
smem
进程级内存分布
smem -r
pmap
查看进程内存段
pmap
vmstat
内存、CPU、IO 综合监控
vmstat 1 5
Day 3 练习练习 1:调整 swappiness
查看当前 vm.swappiness 值:
cat /proc/sys/vm/swappiness
设置为 10,并观察 Swap 使用变化:
sudo sysctl -w vm.swappiness=10
启动内存压力工具,如 stress,观察 free -m 输出。
练习 2:模拟 OOM
使用 stress 创建内存压力:
sudo apt install stress -y
stress --vm 4 --vm-bytes 512M --timeout 60s
查看 dmesg,分析 OOM 日志。
练习 3:pmap 分析进程内存布局
查找某个进程 PID:
ps aux | grep firefox
使用 pmap 查看内存段:
pmap
FAQ
Q:Swap 是不是越大越好?A:不是。Swap 过大只会让系统更慢,通常建议 Swap = 物理内存的 1-2 倍。
Q:如何判断 OOM 是谁导致的?A:通过 dmesg 或 /var/log/messages 中的 OOM Killer 日志,查看被杀掉的进程和 oom_score。
Q:swappiness 设置多少合适?A:桌面系统可设为 10-20;服务器可设为 0-5。
Q:Swap 对 SSD 是否有损伤?A:Swap 会产生大量写入,对 SSD 有一定损耗,但现代 SSD 一般足以承受。
最终学习目标
完成本日课程后,应该能够:
熟练解释 Linux 内存管理原理。通过 free、vmstat、pmap 等工具分析内存问题。调整 Swap 策略,理解 kswapd 和 OOM 的工作机制。定位和解决常见内存不足问题。