1 vmsate
1.1 数据获取
vmsate的数据,也是/proc/<pid>目录,使用cat指令查看vmstat文件即可看到类似如下数据,我这个看的还是slogger2进程的数据。
as_stats.vm_region=29
as_stats.vm_map=22
as_stats.map_size=0x20f (2.058MB)
as_stats.map_phys=0x118 (1.093MB)
as_stats.map_shared=0x161 (1.378MB)
as_stats.map_private=0xae (696.000kB)
as_stats.rss=0x20f (2.058MB)
as_stats.anon_rsv=0xae (696.000kB)
as_stats.rlimit_data=0x15 (84.000kB)
注:vmstat 里 **vm_region 和 vm_map **是十进制
行中的16进制数与括号中对应的数值的计算关系
| 计数器 | 十六进制 | 十进制页数 | ×4 得 KB | 单位判定 | 括号显示(截断小数) |
|---|---|---|---|---|---|
map_size |
0x20f |
527 | 2108 | ≥1024 → 2108/1024 = 2.05859375 | 2.058MB |
map_phys |
0x118 |
280 | 1120 | ≥1024 → 1120/1024 = 1.09375 | 1.093MB |
map_shared |
0x161 |
353 | 1412 | ≥1024 → 1412/1024 = 1.37890625 | 1.378MB |
map_private |
0xae |
174 | 696 | <1024 | 696.000kB |
rss |
0x20f |
527 | 2108 | 同map_size | 2.058MB |
anon_rsv |
0xae |
174 | 696 | 同map_private | 696.000kB |
rlimit_data |
0x15 |
21 | 84 | <1024 | 84.000kB |
1.2 各字段含义
| 计数器 | 含义 | 可能的统计方法 |
|---|---|---|
vm_region |
段数 | pmap 段数 + 1 |
vm_map |
Number of map entries | - |
map_size |
地址空间总大小 | ∑ pmap size + 3(或 mappings 页数 + 3) |
map_phys |
用 MAP_PHYS 映射的页数 | (PHYS且SHARED)的页数 + 3 |
map_shared |
用 MAP_SHARED 映射的页数 | ri_flags低2位=01的页数 + 3 |
map_private |
用 MAP_PRIVATE 映射的页数 | ∑ pmap 的 rsv 列(或 ri_flags低2位=02的页数) |
rss |
物理内存映射量,同一页被多次映射会重复计数 | 同map_size |
anon_rsv |
预留的匿名页数 | 同map_private |
rlimit_data |
私有匿名页映射数(不论是否预留) | heap 段的 size(页数) |
注: 可能的统计方法中,+1、+3这种,只是根据实际的数据统计得到的推论,统计多个进程的数据都符合这个规律,暂不清楚为什么会相差1、3页。
2 各字段数据验算
验算主要是通过pmap数据,pmap在前面的文章中有介绍过。
2.1 vm_region
as_stats.vm_region=29
可能的统计方法:pmap 段数 + 1
将pmap的数据导入到EXCEL表格中,可以看到有28条数据,和vm_region的29相差1
2.2 vm_map
as_stats.vm_map=22
这个没找到对应的规则
2.3 map_size
as_stats.map_size=0x20f (2.058MB)——527页
可能的统计方法:
∑ pmap size + 3
-
- 或
mappings 页数 + 3
可以先看到mapping数据的行数,也是导入到EXCEL表中,除去表头,有524条数据,也是524页数据,和map_size的527页差3页
可以再看下pmap中size的统计,这里我用python写了一个pamp的数据分析工具,统计的size中总大小是0x20c000,注意这里是16进制的Byte大小,as_stats.map_size的0x20f,如果统计的size除以一页的4K大小(0x1000),也就是0x20c页,所以也是相差3页
2.4 map_phys
as_stats.map_phys=0x118 (1.093MB)——280页
可能的统计方法:(PHYS且SHARED)的页数 + 3,也就是flags中,既有PHYS(0x001000),又有SHARED(0x000002)
使用分析工具,筛选后,计算的累计size是0x115页,相差3页
2.5 map_shared
as_stats.map_shared=0x161 (1.378MB)——353页
可能的统计方法:ri_flags低2位=01的页数 + 3
使用分析工具,筛选后,计算的累计size是0x15e页,相差3页
2.6 map_private
as_stats.map_private=0xae (696.000kB)——174页
可能的统计方法:
∑ pmap 的 rsv 列
-
- 或
ri_flags低2位=02的页数
使用分析工具,筛选后,计算的累计size是0xae0页,正好相等
2.7 rss(同map_size)
as_stats.rss=0x20f (2.058MB)——527页
2.8 anon_rsv(同map_private)
as_stats.anon_rsv=0xae (696.000kB)——174页
2.9 rlimit_data
as_stats.rlimit_data=0x15 (84.000kB)——21页
可能的统计方法:heap 段的 size(页数)
使用分析工具,筛选后,stack的size是0x15页,正好相等
3 总结
本篇介绍了QNX中进程的vmstat文件中各字段的含义,以及如何与pmap的数据进行对应。
110