• 正文
  • 相关推荐
申请入驻 产业图谱

QNX内存分析-vmstat探究

10/08 08:22
110
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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的数据进行对应。

相关推荐

控制科学与工程硕士,日常分享单片机、嵌入式、C/C++、Linux等学习经验干货~