内核中内存信息的展示
Contents
在linux内核中,整个内存信息和状态的展示可以通过以下几个文件获得:
| 文件 | 描述 |
|---|---|
/proc/buddyinfo |
展示系统上各个zone的buddy信息,主要用来分析内存碎片问题 |
/proc/pagetypeinfo |
输出系统上各个zone中的不同迁移类型的详细状态信息 |
/proc/vmstat |
描述内存统计信息 |
/proc/zoneinfo |
输出系统上各个内存zone的详细信息 |
在详细介绍这些接口之前,我们先要明确一下几点:
- 现在的内核中,内存管理最大概念为
node。 - 在node上再分为一个或者几个
zone - 每个
zone中又分为不同的迁移类型

系统环境
- 发行版:
centos7.5 - 内核版本:3.10.0-862.14.4.el7.x86_64
- 处理器:
40core(Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz) - 内存:
128GB,两个NUMA node
/proc/vmstat
该文件输出了当前系统上虚拟内存的统计信息,这里的信息大约分为以下几类:
- 所有
zone中各种类型页面数的统计信息,从nr_free_pages到nr_free_cma writeback相关的统计信息:nr_dirty_threshold和nr_dirty_background_thresholdvm相关事件的统计信息:pgpgin到balloon_migrate
简单讨论一下这几类数据的内核实现:
(1)各种类型的页面统计信息:
使用数组vm_stat来记录各种类型的页面统计信息,其类型为原子变量:atomic_long_t
|
|
(2)writeback相关的统计信息,是通过函数global_dirty_limits来获取的,这里就不具体分析了。
(3)vm相关事件的统计信息是通过函数all_vm_events来计算,内核定义了vm_event_states每cpu变量,all_vm_events用于将所有处理器上的这些事件进行累加。
|
|
该文件的输出示例如下:
|
|
/proc/buddyinfo
该文件输出了系统内存管理中,伙伴系统的状态。该文件每一行代表一个zone中buddy的信息。每一行先输出 node 编号,然后是zone的名称,紧接着是各个order(0-10)剩余的块个数。
- 每个
order对应的大小为:2^(order)*PAGE_SIZE - 当内存系统碎片化比较严重时,
order比较大的计数一般为0,此时分配大的内存将会失败
该文件的内核实现比较简单,直接输出每个zone对应的free_area[order].nr_free
|
|
输出示例如下:
|
|
/proc/pagetypeinfo
pagetypeinfo输出系统上各个zone中的不同迁移类型的详细状态信息,其比/proc/buddyinfo 中的信息更加详细。同时该文件也输出了如下信息:
- 系统上
page block的大小和page block order的值:一般情况下,Page block order为9, 所以每个page block中有512个page页。 - 每个
zone中的page block个数
注意:跟
buddyinfo不同,这里直接输出的page的个数,而不是order对应的伙伴系统的空闲块的个数
输出示例信息如下:
|
|
- 从输出来看,我们系统上每个
pageblock的大小为512 * 4k = 2MB - 我们看到
DMA区的总共有8个pageblock,所以DMA的大小为8 * 2MB = 16MB
/proc/zoneinfo
/proc/zoneinfo输出了系统上zone的信息,其信息主要分为以下几类:
zone的一些基本信息,包括名称,空闲页面个数,三个水位,以及管理的页的个数等等zone中各个类型页面个数的统计信息protection信息,决定是否可以内存分配请求时,需要用到- 输出
zone的每个cpu对应的pagesets信息 - 其它信息
- 在本示例输出中,
node0有DMA、DMA32、Normal这三个zone,node1只有一个Normal zone。
|
|