内核中内存信息的展示
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_threshold
vm
相关事件的统计信息: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
。
|
|