linux 内存碎片分析
1,cat /proc/pagetypeiinfo查看和关键参数分析
tt@tt-Lenovo-G485:~$ cat /proc/pagetypeinfo
Page block order: 9
Pages per block: 512Free pages count per migrate type at order 0 1 2 3 4 5 6 7 8 9 10
Node 0, zone DMA, type Unmovable 0 4 2 1 0 1 2 1 1 0 0
Node 0, zone DMA, type Movable 6 2 1 4 1 0 0 0 0 1 0
Node 0, zone DMA, type Reclaimable 4 2 1 2 1 1 0 1 1 0 0
Node 0, zone DMA, type HighAtomic 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA, type CMA 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA, type Isolate 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA32, type Unmovable 1 2 64 5 1 2 0 1 0 0 0
Node 0, zone DMA32, type Movable 0 7 6 3 8 7 5 2 0 0 0
Node 0, zone DMA32, type Reclaimable 328 151 7 15 0 0 0 0 0 0 0
Node 0, zone DMA32, type HighAtomic 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA32, type CMA 0 0 0 0 0 0 0 0 0 0 0
Node 0, zone DMA32, type Isolate 0 0 0 0 0 0 0 0 0 0 0Number of blocks type Unmovable Movable Reclaimable HighAtomic CMA Isolate
Node 0, zone DMA 2 5 1 0 0 0
Node 0, zone DMA32 69 725 20 0 0 0
-
内存分区信息(Zone)
- 如
DMA
、DMA32
、Normal
等,表示不同物理内存区域。 - 每个分区下会列出页块类型(如
Unmovable
、Reclaimable
、Movable
)及其数量。 - 每列数字表示对应阶(0~10)的连续空闲页块数量。
- 例如:
order 0
表示单页,order 9
表示 512 页的连续块。
- 如
-
页块类型说明
类型 描述 Unmovable
不可移动页(如内核数据结构),通常由内核固定使用25。 Movable
可移动页(如用户进程内存),可被页迁移机制回收或压缩25。 Reclaimable
可回收页(如文件缓存),可通过内存回收机制释放25。 HighAtomic
高原子性操作保留页,通常为 05。 CMA
连续内存分配器(Contiguous Memory Allocator)保留区域,未分配时为 05。 Isolate
隔离页(特殊用途),通常为 05。 诊断提示:若某阶的块数持续为 0,可能表明内存碎片严重。
该输出反映了系统内存按迁移类型和阶数的分布情况,可用于分析内存碎片和伙伴系统状态。
2,cat /proc/zoneinfo参数查看和解析
tt@tt-Lenovo-G485:~$ cat /proc/zoneinfo
Node 0, zone DMA
pages free 1602
min 12
low 15
high 18
scanned 0
spanned 4095
present 3998
managed 3977
nr_free_pages 1602
nr_alloc_batch 3
nr_inactive_anon 621
nr_active_anon 695
nr_inactive_file 278
nr_active_file 385
nr_unevictable 0
nr_mlock 0
nr_anon_pages 1252
nr_mapped 580
nr_file_pages 733
nr_dirty 1
nr_writeback 0
nr_slab_reclaimable 52
nr_slab_unreclaimable 56
nr_page_table_pages 59
nr_kernel_stack 5
nr_unstable 0
nr_bounce 0
nr_vmscan_write 317
nr_vmscan_immediate_reclaim 0
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 47
nr_dirtied 231
nr_written 544
nr_pages_scanned 0
numa_hit 19148
numa_miss 0
numa_foreign 0
numa_interleave 0
numa_local 19148
numa_other 0
workingset_refault 233
workingset_activate 111
workingset_nodereclaim 0
nr_anon_transparent_hugepages 0
nr_free_cma 0
protection: (0, 1580, 1580, 1580, 1580)
pagesets
cpu: 0
count: 0
high: 0
batch: 1
vm stats threshold: 4
cpu: 1
count: 0
high: 0
batch: 1
vm stats threshold: 4
all_unreclaimable: 0
start_pfn: 1
inactive_ratio: 1
Node 0, zone DMA32
pages free 11939
min 1238
low 1547
high 1857
scanned 0
spanned 416768
present 416192
managed 405611
nr_free_pages 11939
nr_alloc_batch 64
nr_inactive_anon 70887
nr_active_anon 227783
nr_inactive_file 20482
nr_active_file 32455
nr_unevictable 0
nr_mlock 0
nr_anon_pages 270765
nr_mapped 65696
nr_file_pages 82331
nr_dirty 176
nr_writeback 0
nr_slab_reclaimable 7996
nr_slab_unreclaimable 7933
nr_page_table_pages 9913
nr_kernel_stack 619
nr_unstable 0
nr_bounce 0
nr_vmscan_write 100124
nr_vmscan_immediate_reclaim 61
nr_writeback_temp 0
nr_isolated_anon 0
nr_isolated_file 0
nr_shmem 21375
nr_dirtied 32121
nr_written 131709
nr_pages_scanned 0
numa_hit 3259558
numa_miss 0
numa_foreign 0
numa_interleave 27734
numa_local 3259558
numa_other 0
workingset_refault 67434
workingset_activate 33644
workingset_nodereclaim 0
nr_anon_transparent_hugepages 25
nr_free_cma 0
protection: (0, 0, 0, 0, 0)
pagesets
cpu: 0
count: 157
high: 186
batch: 31
vm stats threshold: 20
cpu: 1
count: 121
high: 186
batch: 31
vm stats threshold: 20
all_unreclaimable: 0
start_pfn: 4096
inactive_ratio: 3
参数说明:
字段 | 含义 |
---|---|
pages free | 当前空闲页数(1页=4KB)。 |
min/low/high | 内存水位线,用于触发内存回收机制。 |
spanned/present | spanned 表示总地址空间页数,present 表示实际物理内存页数。 |
managed | 由伙伴系统管理的页数(present - 保留页) |
内存状态分析
DMA 区域
- 空闲内存
- 空闲页:1602页(约6.3MB),远高于
high
水位线(18页),表明当前无内存压力。
- 空闲页:1602页(约6.3MB),远高于
- 活动内存
- 匿名页(
nr_anon_pages
):1252页,占比较高,可能为进程堆栈或堆内存。 - 文件页(
nr_file_pages
):733页,包括缓存和映射文件。
- 匿名页(
DMA32 区域
- 空闲内存
- 空闲页:11939页(约46.6MB),高于
high
水位线(1857页),内存充足。
- 空闲页:11939页(约46.6MB),高于
- 活动内存
- 匿名页:270765页(约1GB),显著高于DMA区域,反映用户进程内存使用。
- 文件页:82331页(约322MB),主要用于文件缓存。
关键指标解读
- NUMA 本地化
numa_hit
(DMA32: 3259558)远高于numa_miss
,表明内存访问本地化良好。
- 内存回收
nr_vmscan_write
(DMA32: 100124)表示因内存回收写入磁盘的页数,反映历史回收压力。
- 透明大页
nr_anon_transparent_hugepages
(DMA32: 25)表示使用了大页优化。
. 潜在问题检查
- Slab 内存
- DMA32区域中
nr_slab_unreclaimable
(7933页)较高,可能存在内核对象泄漏。
- DMA32区域中
- 脏页
nr_dirty
(DMA32: 176)需结合I/O负载判断是否影响性能。
脏页解析
系统级监控
-
vmstat
:观察memory
和io
字段,so
(换出)和si
(换入)反映交换活动,bi
/bo
显示块I/O操作
vmstat 1
查看 cat /proc/meminfo 里面的dirty字段。
进程级分析
pidstat -d
:监控进程的脏页生成速率1。-
pmap
:显示进程内存映射,识别高脏页生成的可执行文件或共享库
指标/参数 | 含义 | 参考值 |
---|---|---|
Dirty (/proc/meminfo) | 当前脏页总量 | 长期超过总内存10%需警惕 |
vm.dirty_background_ratio | 触发后台回写的脏页比例阈值(默认10%) | 根据I/O负载调整 |
vm.dirty_ratio | 触发同步阻塞回写的脏页比例(默认30%) | 避免过高导致I/O卡顿 |
调整参数
sysctl -w vm.dirty_background_ratio=5 # 降低后台回写阈值
sysctl -w vm.dirty_ratio=20 # 限制同步阻塞阈值
sysctl -w vm.dirty_expire_centisecs=1000 # 缩短脏页驻留时间
查看信息
sysctl vm.dirty_expire_centisecs
sysctl vm.dirty_writeback_centisecs