如何使用vmstat 和 free 查看内存碎片化信息?
在 Linux 系统中,vmstat
和 free
命令主要用于查看系统内存的整体使用情况,但它们无法直接显示内存碎片化信息。不过,通过这两个工具的输出,结合其他指标,我们可以间接推断内存碎片化的程度。以下是具体方法:
一、使用 free
命令查看内存总体情况
free -h # 以人类可读的格式显示内存使用情况
关键指标:
- total:总内存
- used:已使用内存
- free:空闲内存
- shared:共享内存
- buff/cache:缓存和缓冲区
- available:实际可用内存(考虑缓存释放后)
示例输出:
total used free shared buff/cache available
Mem: 7.7G 2.3G 3.1G 118M 2.3G 4.9G
Swap: 2.0G 0B 2.0G
碎片化推断:
如果 free
显示有大量空闲内存,但应用仍频繁出现 OOM,可能存在内存碎片化。
二、使用 vmstat
监控内存动态变化
vmstat 1 10 # 每秒采样一次,共采样10次
关键指标:
- si/so:从磁盘交换到内存 / 从内存交换到磁盘的速率(单位:KB/s)
- bi/bo:块设备输入 / 输出速率(单位:块 /s)
- free:空闲内存(单位:KB)
示例输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st0 0 0 162304 21528 627220 0 0 0 2 1 1 0 0 100 0 0
碎片化推断:
若 si/so
频繁非零,即使 free
内存充足,也可能存在碎片化导致的内存分配失败。
三、查看内存碎片化的直接方法
虽然 vmstat
和 free
无法直接显示碎片化信息,但可结合以下命令:
1. 查看 /proc/buddyinfo
(内存块分布)
cat /proc/buddyinfo
输出示例:
Node 0, zone DMA 0 0 0 0 0 0 0 0 1 1 3
Node 0, zone DMA32 123 89 72 56 38 25 16 10 5 2 1
Node 0, zone Normal 156 120 100 80 60 40 25 15 8 3 1
含义:
- 每行代表一个内存区域(如 DMA、Normal)
- 每列代表不同大小的连续内存块数量(从 1 个页框到 1024 个页框)
- 高阶列(右侧)数值低表示大内存块稀缺,可能存在碎片化
2. 使用 smem
分析内存分配模式
smem -t # 按进程显示内存使用情况
示例输出:
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory