如何不触发OOM Killer即可查询Linux内核内存池的状态
问题解答
原版Linux原生支持无需触发OOM Killer即可获取该内存统计数据,该数据是内核伙伴系统的各阶空闲页统计,可以通过/proc/buddyinfo接口直接读取。
具体使用方式如下:
- 直接读取
/proc/buddyinfo文件即可得到和OOM Killer日志输出完全一致的内存区域空闲页分阶统计:
cat /proc/buddyinfo
输出格式和你贴出的OOM日志内容完全一致:
Node 0 DMA: 0*4kB 0*8kB 1*16kB (U) 0*32kB 2*64kB (U) 1*128kB (U) 1*256kB (U) 0*512kB 1*1024kB (U) 1*2048kB (M) 3*4096kB (M) = 15888kB Node 0 DMA32: 14121*4kB (UME) 18163*8kB (UME) 12588*16kB (UME) 5074*32kB (UME) 1404*64kB (UME) 484*128kB (UME) 19*256kB (UME) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 722236kB Node 0 Normal: 399161*4kB (UME) 126769*8kB (UME) 74232*16kB (UME) 26738*32kB (UME) 5767*64kB (UME) 1079*128kB (UME) 50*256kB (UE) 2*512kB (U) 0*1024kB 0*2048kB 0*4096kB = 5175148kB
- 如果需要更细粒度的按页迁移类型拆分的统计,可以读取
/proc/pagetypeinfo文件,该文件需要root权限访问,可以用来分析内存碎片化程度,更适配延迟优化的场景。 - 两个接口都是Linux主线内核默认支持的功能,无需安装额外工具、无需修改内核配置,读取操作不会对系统运行产生任何负面影响,适合定期采集作为内存状态的基准数据,可直接和OOM触发时的日志数据做对比分析。
内容的提问来源于stack exchange,提问作者Mikko Rantalainen
相关产品推荐
相关产品推荐

