《Linux内存管理:实验驱动的深度探索》大纲
《Linux内存管理:实验驱动的深度探索》
——通过递进式实验与问题剖析,从入门到精通
第一部分:初探内存——基础概念与简单实验
目标:理解内存的基本行为,学会观察和提问
第1章 内存初体验:从"free命令"的疑问开始
-
实验1:连续执行
free -h
,为什么"available"内存会变化? -
问题:buff/cache是什么?为什么Linux喜欢“浪费”内存?
-
实验2:用
dd
创建大文件,观察内存和cache的变化 -
核心收获:Linux的内存缓存机制
第2章 虚拟内存:为什么进程认为自己拥有全部内存?
-
实验3:编写一个分配100GB内存的程序(但系统只有8GB)
-
问题:为什么程序不崩溃?
mmap
和malloc
的区别? -
实验4:用
pmap
分析进程内存布局 -
核心收获:虚拟地址空间 vs 物理内存
第二部分:深入内存分配——从用户态到内核
目标:理解内存分配背后的机制,学会调试基础问题
第3章 malloc的真相:内存从何而来?
-
实验5:用
strace
追踪malloc(1024)
的系统调用 -
问题:为什么有时候用
brk
,有时候用mmap
? -
实验6:实现一个简易内存池(对比
malloc
性能) -
核心收获:内存分配策略与碎片问题
第4章 缺页异常:内存的"懒加载"机制
-
实验7:编写一个触发大量缺页的程序,用
perf
统计缺页次数 -
问题:为什么
memset
比循环赋值更快? -
实验8:观察写时复制(COW)在
fork()
中的行为 -
核心收获:按需分配与页面错误处理
第三部分:物理内存管理——伙伴系统与Slab
目标:理解内核如何管理物理内存,解决性能问题
第5章 伙伴系统:如何避免内存碎片?
-
实验9:制造内存碎片,观察
/proc/buddyinfo
变化 -
问题:为什么
GFP_ATOMIC
可能失败,而GFP_KERNEL
不会? -
实验10:编写内核模块,尝试分配不同阶的内存块
-
核心收获:物理内存的组织方式
第6章 Slab分配器:小对象的高效管理
-
实验11:用
slabtop
观察task_struct
的缓存使用 -
问题:为什么
kmalloc(1024)
比malloc(1024)
快? -
实验12:故意制造Slab泄漏,用
kmemleak
检测 -
核心收获:对象缓存与内存池优化
第四部分:内存回收与Swap——当内存不足时
目标:理解内存回收机制,优化系统性能
第7章 kswapd与LRU:内存的"垃圾分类"
-
实验13:用
vmstat 1
观察kswapd的活动 -
问题:为什么
/proc/sys/vm/swappiness
默认是60? -
实验14:模拟内存压力,观察LRU链表变化
-
核心收获:页面回收策略与调优
第8章 Swap:救命稻草还是性能杀手?
-
实验15:用
dd
创建Swap文件,测试极端内存压力 -
问题:为什么数据库通常禁用Swap?
-
实验16:对比zswap/zram的性能差异
-
核心收获:Swap的使用场景与优化
第五部分:高级主题——NUMA、cgroups与性能调优
目标:掌握生产环境中的内存优化技巧
第9章 NUMA:多CPU架构的内存挑战
-
实验17:用
numactl
绑定进程到特定节点 -
问题:为什么Redis在NUMA机器上性能下降?
-
实验18:观察跨节点访问的性能损耗
-
核心收获:NUMA优化策略
第10章 cgroups:内存的资源隔离
-
实验19:用cgroup限制容器内存,触发OOM Killer
-
问题:为什么
docker run -m
不总是有效? -
实验20:调整
memory.limit_in_bytes
和oom_score_adj
-
核心收获:容器内存限制与调优
第六部分:实战与调试——从问题到解决方案
目标:综合运用知识解决真实问题
第11章 内存泄漏排查实战
-
案例1:用
valgrind
抓用户态泄漏 -
案例2:用
kmemleak
抓内核泄漏 -
案例3:用
bpftrace
动态追踪内存分配
第12章 性能优化实战
-
案例4:优化Java应用的GC参数
-
案例5:调整透明大页(THP)提升数据库性能
-
案例6:解决kswapd导致的CPU飙高
附录:实验速查表
-
实验环境搭建:QEMU调试内核+Debian镜像
-
常用命令速查:
free
/vmstat
/slabtop
/perf
-
调优参数大全:
swappiness
/overcommit_memory
/zone_reclaim_mode
本书特色
✅ 实验驱动:每个知识点配套可操作的实验
✅ 问题导向:从疑问出发,逐步深入
✅ 渐进式难度:从free
命令到内核源码分析
✅ 真实案例:来自生产环境的经验与教训
适合读者:
-
想彻底理解Linux内存的开发者
-
被OOM、泄漏、性能问题困扰的运维
-
喜欢动手实践的技术爱好者