Linux内核分析之内存管理-15
第15章:内存统计与调试
基于 Linux 6.12.38 源码
15.1 内存统计概述
15.1.1 统计接口
Linux 内核提供多种内存统计接口:
| 接口 | 用途 |
|---|---|
| /proc/meminfo | 系统内存信息 |
| /proc/vmstat | 虚拟内存统计 |
| /proc/zoneinfo | Zone 详细信息 |
| /proc/pid/maps | 进程内存映射 |
| /proc/pid/smaps | 进程内存统计 |
| sysfs (cgroup) | 内存控制组统计 |
15.1.2 统计架构
1 | ┌─────────────────────────────────────────────────────────────┐ |
15.2 vm_stat 结构
15.2.1 统计项定义
位置: include/linux/vmstat.h
1 | /* Zone 统计项 */ |
15.2.2 统计操作
1 | /* Zone 统计操作 */ |
15.3 vm_event 计数器
15.3.1 事件定义
位置: include/linux/vm_event_item.h
1 | enum vm_event_item { |
15.3.2 事件计数
位置: include/linux/vmstat.h
1 | /* 每核事件状态 */ |
15.4 /proc/meminfo
15.4.1 meminfo 实现
位置: mm/page_alloc.c
1 | static int meminfo_proc_show(struct seq_file *m, void *v) |
15.4.2 meminfo 字段说明
1 | # 主要字段 |
15.5 /proc/vmstat
15.5.1 vmstat 实现
位置: mm/vmstat.c
1 | static int vmstat_show(struct seq_file *m, void *v) |
15.5.2 vmstat 字段说明
1 | # 主要字段 |
15.6 /proc/zoneinfo
15.6.1 zoneinfo 实现
1 | static int zoneinfo_show(struct seq_file *m, void *v) |
15.7 进程内存统计
15.7.1 /proc/pid/smaps
1 | # 查看进程内存映射统计 |
15.7.2 字段说明
| 字段 | 说明 |
|---|---|
| Size | 映射大小 |
| Rss | 驻留集大小 (实际物理内存) |
| Pss | 按比例共享内存 |
| Shared_Clean | 共享干净页面 |
| Shared_Dirty | 共享脏页面 |
| Private_Clean | 私有干净页面 |
| Private_Dirty | 私有脏页面 |
| Swap | Swap 使用 |
| Locked | 锁定内存 |
15.8 调试工具
15.8.1 用户空间工具
1 | # vmstat - 虚拟内存统计 |
15.8.2 内核调试选项
1 | # 内存调试选项 |
15.9 kmemleak
15.9.1 kmemleak 概述
kmemleak 是内核内存泄漏检测工具,自动检测未释放的内存。
15.9.2 使用方法
1 | # 启用 kmemleak |
15.9.3 kmemleak 输出
1 | unreferenced object 0xffff888123456789 (size 1024): |
15.10 page_owner
15.10.1 page_owner 概述
page_owner 跟踪每个页面的分配者,帮助调试页面分配问题。
15.10.2 使用方法
1 | # 启用 page_owner |
15.10.3 page_owner 输出
1 | Page allocated via order 0, mask 0x42c0ca(GFP_KERNEL|__GFP_NOWARN|__GFP_COMP|__GFP_RECLAIMABLE), |
15.11 页面投毒
15.11.1 page_poisoning 概述
页面投毒用特定模式填充释放的页面,检测 use-after-free 错误。
15.11.2 配置和使用
1 | CONFIG_PAGE_POISONING=y |
1 | # 启动参数 |
15.12 内存热点分析
15.12.1 perf 使用
1 | # 内存分配分析 |
15.12.2 eBPF 工具
1 | # memleak - BCC 内存泄漏检测 |
15.13 本章小结
本章介绍了 Linux 6.12 的内存统计与调试:
- 统计接口: /proc/meminfo、/proc/vmstat、/proc/zoneinfo
- vm_stat: Zone/Node 统计项和操作
- vm_event: 事件计数器,跟踪内存操作
- 进程统计: /proc/pid/smaps,进程内存映射
- 调试工具: vmstat、slabtop、pmap、smem
- 内核调试: kmemleak、page_owner、page_poisoning
- 性能分析: perf、eBPF 工具
内存统计和调试工具对于理解和优化内存使用至关重要。
附录:内存管理完整系列
本系列 15 章涵盖了 Linux 6.12 内存管理的全部内容:
- 概述 - 内存管理架构和设计
- 物理内存模型 - Node、Zone、Page、Watermark
- 物理内存分配器 - Buddy System
- 虚拟地址空间 - 用户/内核空间布局
- 页表管理 - 多级页表、页表操作
- 虚拟内存区域 (VMA) - VMA 管理
- 页面分配 - alloc_pages、kmalloc
- Slab 分配器 - SLUB 实现
- 缺页异常处理 - 页面错误处理
- 页面回收 - LRU、kswapd、直接回收
- 内存映射 - mmap、mprotect、munmap
- 匿名内存与页缓存 - 堆、页缓存、回写
- 内存压缩与迁移 - Compaction、Migration
- 内存控制组 - memcg 限制和统计
- 内存统计与调试 - 统计接口和调试工具
- Title: Linux内核分析之内存管理-15
- Author: 韩乔落
- Created at : 2026-01-20 21:39:55
- Updated at : 2026-02-24 14:04:51
- Link: https://jelasin.github.io/2026/01/20/Linux内核分析之内存管理-15/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments