ramdump 中的memory统计
0. 前言
ramdump是指某个时刻系统或者子系统发生crash等异常,系统将内存中的数据通过一定的方式保存下来,相当于一个系统内存快照,用以开发者离线分析系统异常问题。
ramdump 工具中有很多内存统计的脚本,本文逐一剖析内存相关的脚本,涉及脚本如下:
| 脚本名称 | dump文件名称 | 说明 |
|---|---|---|
| memusage.py | memory.txt | 统计内存 total memory、free memory、slab、shmem 以及每个进程的 rss、swap、adj 信息; |
| memstat.py | mem_stat.txt | 统计总的内存使用情况,包含total、free、slab、cached、vmalloc、zram compressed,others中包含 pgtables、kernel stack 等信息; |
| ion_buffer_parse.py | ionbuffer.txt ionproc.txt total_dma_heap.txt | 统计db_list 中所有 dma_buf 的size、expr_name等信息。 总的 dma_buf 大小记录在 total_dma_heap.txt 文件中 |
| vmalloc.py | vmalloc.txt | 统计 vmallocinfo |
| slabinfo.py | ||
1. memusage.py
该脚本统计的信息会写到 memory.txt 文件中。
来看下统计了哪些信息:
Total RAM: 2,716,180kB
Total free memory: 54,324kB(2.0%)
Slab reclaimable: 69,868kB(2.6%)
Slab unreclaimable: 195,680kB(7.2%)
Total Slab memory: 265,548kB(9.8%)
Total SHMEM (PAGECACHE): 90,300kB(3.3%)
Total SHMEM (SWAP): 212kB(0.0%)TOP 3 swapped SHMEM files are:
Address_space 0xffffff803ec32d30 Allocated 13 pages
file name: /dev/ashmem/Trans ImageData
Address_space 0xffffff800b2ac460 Allocated 6 pages
file name: /dev/ashmem/Trans ImageData
Address_space 0xffffff803ec37960 Allocated 6 pages
file name: /dev/ashmem/Trans ImageDataTask name PID RSS in kB SWAP in kB ADJ
m.ohos.launcher 1433 283,520(10.4%) 12,676(0.5%) 400
m.ohos.systemui 1406 165,088(6.1%) 25,992(1.0%) -800
com.ohos.callui 10310 176,892(6.5%) 0(0.0%) 1
m.ohos.contacts 7746 139,204(5.1%) 12(0.0%) 400
com.ohos.camera 17189 124,844(4.6%) 0(0.0%) 0
com.ohos.mms 13071 115,536(4.3%) 12(0.0%) 400
foundation 1027 110,608(4.1%) 3,224(0.1%) -1000
ard:inputMethod 1465 106,788(3.9%) 6,464(0.2%) 400
appspawn 277 110,432(4.1%) 0(0.0%) -1000
| 字段名称 | 说明 |
|---|---|
| Total RAM | 统计全局变量 _totalram_pages |
| Total free memory | 统计NR_FREE_PAGES,以及占total 的百分比 |
| Slab reclaimable | 统计NR_SLAB_RECLAIMABLE,以及占 total 的百分比,Kernel5.10 以上的版本字段名称有所变化 |
| Slab unreclaimable | 统计 NR_SLAB_UNRECLAIMABLE,以及占 total 的百分比,Kernel5.10 以上的版本字段名称有所变化 |
| Total Slab memory | 统计总的 slab 内存,上面两者之和 |
| Total SHMEM (PAGECACHE) | 统计NR_SHMEM,以及占 total 的百分比 |
| Total SHMEM (SWAP) | 统计 shmem 进入 swap 的内存,这些信息都保存在 shmem_swaplist 中 |
| TOP 3 swapped SHMEM files | 上面统计信息之后,会将 TOP 3 swapped SHMEM files 列举出来 |
| 所有进程信息 | 统计进程的 name、PID、rss、swap 和 adj,其中 rss 和 swap统计值来源于 mm_struct 中 mm_rss_stat 结构体,rss = anon_rss + file_rss + shmem_rss |
2. memstat.py
该脚本统计的信息会写到 mem_stat.txt 文件中。
来看下统计了哪些信息:
Total RAM : 2652 MB
Free memory: : 53 MBTotal Slab memory: : 259 MB
Total DMA memory : 54 MB
KGSL : 0 MB
ZRAM compressed : 4 MB
vmalloc : 85 MB
Others : 1904 MB
Cached : 570 MBTotal Unaccounted Memory : 293 MB
| 字段名称 | 说明 |
|---|---|
| Total RAM | 统计全局变量 _totalram_pages |
| Free memory | 统计NR_FREE_PAGES,以及占total 的百分比 |
| Total Slab memory | 统计总的 slab 内存,NR_SLAB_RECLAIMABLE + NR_SLAB_UNRECLAIMABLE |
| Total DMA memory | 统计所有dma-buf 的内存大小。对于 kernel 5.10 及以上的版本,该数据读取的是total_dma_heap.txt 文件,该文件于 ion_buffer_parse.py 解析写入,dma-buf 都统计在全局变量 db_list 中,详细查看下文 ion_buffer_parse.py 剖析 |
| KGSL | 未知 |
| ZRAM compressed | 统计 ZRAM 压缩的内存大小 |
| vmalloc | 统计通过vmalloc 申请的内存大小。对于 vmalloc 分配的内存都会被记录到全局变量nr_vmalloc_pages 中,详细可以查看《内核参数:vmallocinfo》一文 |
| others | 统计 NR_ANON_MAPPED + NR_FILE_PAGES + NR_PAGETABLE + NR_KERNEL_STACK_KB |
| Cached | 统计 NR_FILE_PAGES |
| Total Unaccounted Memory | 没有被统计的内存大小 |
3. ion_buffer_parse.py
该脚本统计的信息会写到 ionbuffer.txt、ionproc.txt、total_dma_heap.txt 文件中。
3.1 ionbuffer.txt
来看下统计了哪些数据:
*****Parsing dma buf info for ion leak debugging*****File_addr REF Name Size Exp Heap Size in KB
v.v (struct file *)0xffffff8031154140 9 None 0x555000 system-uncached None (5460 KB)
v.v (struct file *)0xffffff8031154500 10 None 0x555000 system-uncached None (5460 KB)
v.v (struct file *)0xffffff807a006640 6 None 0x555000 system-uncached None (5460 KB)
v.v (struct file *)0xffffff80a23b3540 6 None 0x555000 system-uncached None (5460 KB)
v.v (struct file *)0xffffff807cfb92c0 8 None 0x555000 system-uncached None (5460 KB)
v.v (struct file *)0xffffff808fc8ea00 8 None 0x4f4000 system-uncached None (5072 KB)
v.v (struct file *)0xffffff80b59cab40 8 None 0x4f4000 system-uncached None (5072 KB)
v.v (struct file *)0xffffff805cb97540 3 None 0x48f000 system None (4668 KB)
轮询 db_list 中所有的 dma-buf,所有的size 都会统计到 total_dma_heap,最终的总的 dma-buf 的内存会记录到 total_dma_heap.txt 中。
| 字段名称 | 说明 |
|---|---|
| File_addr | dma_buf 所对应的文件的 struct file 地址 |
| REF | 该文件被引用的次数 |
| Name | dma_buf 的name,一般使用 dma_buf_set_name() 函数配置,默认不会设置,所以为None |
| Size | dma_buf 所代表的内存大小,十六进制 |
| Exp | dma_buf 的 exp_name,同 dma_heap 的name |
| Heap | dma_heap 的name,上面 txt 显示为None,是因为脚本代码有问题 |
| Size in KB | 同Size,只不过转换成了KB 单位 |
3.2 ionproc.txt
来看下统计了哪些数据:
*****Parsing dma proc info for ion leak debugging*****render_service (PID 828) size (KB): 43600
Name Size Size in KB Time Alive(sec) (struct file *)
system-uncached 0x555000 5460 0 0xffffff80a23b3540
system-uncached 0x555000 5460 0 0xffffff8031154500
system-uncached 0x555000 5460 0 0xffffff8031154140
system-uncached 0x555000 5460 0 0xffffff807a006640
system-uncached 0x555000 5460 0 0xffffff807cfb92c0
system-uncached 0x4f4000 5072 0 0xffffff80b59cab40
system-uncached 0x4f4000 5072 0 0xffffff808fc8ea00
system-uncached 0xe4000 912 0 0xffffff8061202280
system-uncached 0xe4000 912 0 0xffffff801f506000 ...m.ohos.launcher (PID 1433) size (KB): 16380
Name Size Size in KB Time Alive(sec) (struct file *)
system-uncached 0x555000 5460 0 0xffffff807cfb92c0
system-uncached 0x555000 5460 0 0xffffff807a006640
system-uncached 0x555000 5460 0 0xffffff80a23b3540
该文件统计的是使用 dma-buf的进程的相关信息,每一个 proc 都会显示进程名、PID 以及使用的dma-buf 的总大小。
通常该文件统计的数据与ionbuffer.txt 配合使用,分析某些dma_buf 异常。
| 字段名称 | 说明 |
|---|---|
| Name | slab_buf 的exp_name |
| Size | slab_buf 所占用的内存大小,十六进制 |
| Size in KB | 同上,转换成KB 的单位 |
| Time Alive(sec) | slab_buf 的存活时长,一般用于 struct dma_buf 中存在ktime 的成员,除此都为0 |
| (struct file *) | 同 ionbuffer.txt 中,代表 dma_buf 对应的文件的 struct file 地址 |
3.3 total_dma_heap.txt
来看下统计了哪些数据:
Total dma memory: 54MB
该数据统计所有dma_buf 的总大小,在分析 ionbuffer.txt 的时候看到,所有db_list 中的 dma_buf 的size 都会累计到变量total_dma_heap,最终记录到 total_dma_heap.txt 文件中。
4. vmalloc.py
该脚本统计的信息会写到 vmalloc.txt 文件中。
来看下统计了哪些信息:
Memory mapped region allocated by VmallocVM_STRUCT ADDRESS_RANGE SIZE PHYS_ADDR CALLER Flag
v.v (struct vmap_area)0xffffff8081917400 ffffffc000000000-ffffffc000002000 2000 0 bpf_jit_binary_alloc0x0xac vmalloc pages=1
v.v (struct vmap_area)0xffffff80b4230c00 ffffffc000002000-ffffffc000004000 2000 0 bpf_jit_binary_alloc0x0xac vmalloc pages=1
v.v (struct vmap_area)0xffffff80a33d8180 ffffffc000004000-ffffffc000006000 2000 0 bpf_jit_binary_alloc0x0xac vmalloc pages=1
v.v (struct vmap_area)0xffffff80a33d8480 ffffffc000006000-ffffffc000008000 2000 0 bpf_jit_binary_alloc0x0xac vmalloc pages=1
v.v (struct vmap_area)0xffffff807a1bb500 ffffffc000008000-ffffffc00000a000 2000 0 bpf_jit_binary_alloc0x0xac vmalloc pages=1
v.v (struct vmap_area)0xffffff8025419a80 ffffffc00000a000-ffffffc00000c000 2000 0 bpf_jit_binary_alloc0x0xac vmalloc pages=1
v.v (struct vmap_area)0xffffff808d27c180 ffffffc009820000-ffffffc00997a000 15a000 0 load_module0x0xbb0 vmalloc pages=345
v.v (struct vmap_area)0xffffff808d39b300 ffffffc00997a000-ffffffc009997000 1d000 0 load_module0x0xbb0 vmalloc pages=28
v.v (struct vmap_area)0xffffff808d5b8300 ffffffc009997000-ffffffc0099b6000 1f000 0 load_module0x0xbb0 vmalloc pages=30
v.v (struct vmap_area)0xffffff808da97c80 ffffffc0099b6000-ffffffc00a2cb000 915000 0 load_module0x0xbb0 vmalloc pages=2324
v.v (struct vmap_area)0xffffff808d30ca00 ffffffc00a2cb000-ffffffc00a2d1000 6000 0 load_module0x0xbb0 vmalloc pages=5
v.v (struct vmap_area)0xffffff808c688200 ffffffc00a2d1000-ffffffc00a311000 40000 0 load_module0x0xbb0 vmalloc pages=63
v.v (struct vmap_area)0xffffff809621e780 ffffffc00a311000-ffffffc00a6dc000 3cb000 0 load_module0x0xbb0 vmalloc pages=970
| 字段名称 | 说明 |
|---|---|
| VM_STRUCT | 从kmalloc 中分配的struct vm_struct 的地址 |
| ADDRESS_RANGE | vm_struct 代表的vmalloc 子区域的内存空间,差值就是SIZE |
| SIZE | vm_struct 代表的vmalloc 子区域的内存大小,十六进制 |
| PHYS_ADDR | 代表的vmalloc 子区域对应的物理地址起始地址,一般出现于vmap 或 ioremap |
| CALLER | 调用vmalloc 的函数 |
| Flag | vmalloc 的属性,详细查看《内核参数:vmallocinfo》一文 |
更详细的 vmalloc 内存管理信息可以查看《vmalloc 详解》一文和《内核参数:vmallocinfo》一文。
5. slabinfo.py
相关文章:
ramdump 中的memory统计
0. 前言 ramdump是指某个时刻系统或者子系统发生crash等异常,系统将内存中的数据通过一定的方式保存下来,相当于一个系统内存快照,用以开发者离线分析系统异常问题。 ramdump 工具中有很多内存统计的脚本,本文逐一剖析内存相关的…...
Element-Ui树形数据懒加载,删除到最后一个空数组不刷新问题
使用elemenui树形删除数据的时候刷新页面,我在网上找了好多方法,要么没用,要么都是部分代码,自己又看不懂,不得不硬着头皮看源码,发现了有个方法可以刷新。 使用elemenui树形删除数据的时候刷新页面。源码里…...
基于NASM搭建一个能编译汇编语言的汇编软件工具环境(利用NotePad++)
文章目录 一、创建汇编语言源程序二、Notepad的下载、安装、使用三、下载和安装编译器NASM3.1 下载NASM编译器3.2 安装并配置环境变量 四、编译汇编语言源程序(使用命令)五、下载和使用配套源码及工具六、将编译功能集成到Notepad 一、创建汇编语言源程序…...
使用setoolkit制作钓鱼网站并结合dvwa靶场储存型XSS漏洞利用
setoolkit是一款kali自带的工具 使用命令启动 setoolkit 1) Social-Engineering Attacks 1) 社会工程攻击 2) Penetration Testing (Fast-Track) 2) 渗透测试(快速通道) 3) Third Party Module…...
计算机组成原理-总线概述
文章目录 总线简图总线的物理实现总览总线定义总线的特性总线的分类按数据格式分类串行总线并行总线 按总线功能分类注意系统总线的进一步分类 总线的结构单总线的机构双总线的结构三总线的结构四总线的结构 小结 总线简图 总线的物理实现 如果该为数据总线,那么当…...
三角函数两角和差公式推导
一.几何推理 1.两角和公式 做一斜边为1的直角△ABC,任意旋转非 k Π , k N kΠ,kN kΠ,kN,补充如图,令 ∠ A B C ∠ α , ∠ C B F ∠ β ∠ABC∠α,∠CBF∠β ∠ABC∠α,∠CBF∠β ∴ ∠ D B F ∠ D B A ∠ α ∠ β 90 , ∠ D A …...
HarmonyOS page生命周期函数讲解
下面 我们又要看一个比较重要的点了 页面生命周期 页面组件有三个生命周期 onPageShow 页面显示时触发 onPageHide 页面隐藏时触发 onBackPress 页面返回时触发 这里 我们准备两个组件 首先是 index.ets 参考代码如下 import router from ohos.router Entry Component struc…...
3D视觉-结构光测量-线结构光测量
概述 线结构光测量中,由激光器射出的激光光束透过柱面透镜扩束,再经过准直,产生一束片状光。这片光束像刀刃一样横切在待测物体表面,因此线结构光法又被成为光切法。线结构光测量常采用二维面阵 CCD 作为接受器件,因此…...
ssm基于web的马病管理系统设计与实现+jsp论文
摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,马病信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大…...
SaaS版Java基层健康卫生云HIS信息管理平台源码(springboot)
云his系统源码,系统采用主流成熟技术开发,B/S架构,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问,前后端分离,多服务协同,服务可拆分,功能易扩展。多集团统一登录…...
redis,memcached,nginx网络组件,网络编程——reactor的应用
目录 目标网络编程关注的问题连接的建立连接的断开消息的到达消息发送完毕 网络 IO 职责检测 IO检测 io剖析 操作 IO 阻塞IO 和 非阻塞IOIO 多路复用epoll结构以及接口 reactor编程连接建立连接断开数据到达数据发送完毕 reactor 应用:后续补充源码解析单 reacrtor多…...
【机电、机器人方向会议征稿|不限专业|见刊快】2024年机械、 图像与机器人国际会议(IACMIR 2024)
【机电、机器人方向会议征稿|不限专业|见刊快】2024年机械、 图像与机器人国际会议(IACMIR 2024) 2024 International Academic Conference on Machinery, Images, and Robotics 会议将聚焦“机械、成像和机器人”相关的最新研究领域,为国内…...
uniapp学习之路
uniapp 学习之路 1. 下载HBuilderX2. 下载uView初始框架3. 开始学习1.更改页面背景色,渐变色 1. 下载HBuilderX https://www.dcloud.io/hbuilderx.html?ivk_sa1024320u2. 下载uView初始框架 https://ext.dcloud.net.cn/plugin?id15933. 开始学习 1.更改页面背景…...
移动开发新的风口?Harmony4.0鸿蒙应用开发基础+实践案例
前段时间鸿蒙4.0引发了很多讨论,不少业内人士认为,鸿蒙将与iOS、安卓鼎足而三了。 事实上,从如今手机操作系统竞赛中不难看出,安卓与iOS的形态、功能逐渐趋同化,两大系统互相取长补短,综合性能等差距越来越…...
QT上位机开发(倒计时软件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 倒计时软件是生活中经常遇到的一种场景。比如运动跑步,比如学校考试,比如论文答辩等等,只要有时间限制规定的地…...
2023 楚慧杯 --- Crypto wp
文章目录 初赛so large e 决赛JIGE 初赛 so large e 题目: from Crypto.Util.number import * from Crypto.PublicKey import RSA from flag import flag import randomm bytes_to_long(flag)p getPrime(512) q getPrime(512) n p*q e random.getrandbits(1…...
Python+OpenCV 零基础学习笔记(1-3):anaconda+vscode+jupyter环境配置
文章目录 前言相关链接环境配置:AnacondaPython配置OpenCVOpencv-contrib:Opencv扩展 Notebook:python代码笔记vscode配置配置AnacondaJupyter文件导出 前言 作为一个C# 上位机,我认为上位机的终点就是机器视觉运动控制。最近学了会Halcon发现机器视觉还…...
Spring Cloud Gateway 常见过滤器的基本使用
目录 1. 过滤器的作用 2. Spring Cloud Gateway 过滤器的类型 2.1 内置过滤器 2.1.1 AddResponseHeader 2.1.2 AddRequestHeader 2.1.3 PrefixPath 2.1.4 RequestRateLimiter 2.1.5 Retry 2.2 自定义过滤器 1. 过滤器的作用 过滤器通常用于拦截、处理或修改数据流和事…...
maven依赖无法传递问题排查
一、背景 在A模块中引入B模块,C服务引入A模块但是B模块没有传递进来。 二、排查 使用mvn clean install -Dmaven.test.skiptrue查看打包日志信息,通过搜索A模块名称,出现如下警告信息: [WARING] The POM for A:jar:0.0.1-SNAP…...
JVM钩子
JVM钩子 简介 在Java应用程序中,可以通过注册关闭钩子(Shutdown Hook)函数来实现在JVM关闭时执行特定的代码。关闭钩子是一种用于在JVM关闭时执行清理任务的机制,它允许开发者在JVM关闭之前执行一些必要的清理工作,如…...
Adafruit GPS库:轻量级NMEA 0183解析器设计与嵌入式实践
1. Adafruit GPS 库概述Adafruit_GPS 是 Adafruit 公司为嵌入式平台(尤其是基于 Arduino 生态的 MCU)开发的轻量级、高鲁棒性 GPS 数据解析库。其核心目标并非驱动 GPS 模块硬件,而是专注于从串行流中可靠提取、校验并结构化解析 NMEA 0183 协…...
【声纳与人工智能融合——从理论前沿到自主系统实战】第五章 声纳波形设计与主动感知智能优化
目录 第五章 声纳波形设计与主动感知智能优化 5.1 智能波形设计理论与方法 5.1.1 信息论指导下的波形优化 5.1.1.1 最大化互信息准则的波形设计 5.1.2 深度强化学习在波形设计中的应用 5.1.2.1 状态空间、动作空间与奖励函数设计 5.1.2.2 动态环境下波形序列的自适应生成…...
PX4启动脚本rcS:从SD卡加载到飞行器就绪的完整流程解析
1. PX4启动脚本rcS的核心作用 当你第一次接触PX4飞控时,可能会被它复杂的启动流程搞得一头雾水。其实这个看似神秘的启动过程,核心就是一个叫rcS的脚本文件在掌控全局。这个脚本就像是飞控系统的"总指挥",负责协调各个模块的启动顺…...
GuwenBERT:古文自然语言处理的技术革新
GuwenBERT:古文自然语言处理的技术革新 【免费下载链接】guwenbert GuwenBERT: 古文预训练语言模型(古文BERT) A Pre-trained Language Model for Classical Chinese (Literary Chinese) 项目地址: https://gitcode.com/gh_mirrors/gu/guwe…...
NOJ编程竞赛中的五大常见错误类型及高效调试技巧
1. NOJ编程竞赛错误类型全景解析 第一次参加NOJ在线编程竞赛时,看到满屏的WA、CE、RE、TE错误提示,我整个人都是懵的。直到后来在实战中踩过无数坑,才发现这些错误其实都有规律可循。最常见的五大错误类型就像编程路上的五个拦路虎࿰…...
一文读懂能源效率优化AI智能体提升能源使用效率,AI应用架构师知识盛宴
一文读懂能源效率优化AI智能体:架构师的技术拆解与实战指南 一、引言:从“能源浪费”到“AI救赎”的必然选择 1. 钩子:一个触目惊心的数字 你知道吗?全球工业领域约有30%的能源消耗是“无意义的浪费”——锅炉燃烧不充分导致的排烟…...
中国蚁剑启动报错全解析:从加载失败到空白界面的终极修复指南
1. 中国蚁剑启动报错的三大常见场景 第一次打开中国蚁剑就遇到报错,那种感觉就像刚拿到新玩具却发现电池没电。根据我这些年处理过的案例,启动问题主要集中在三个方向:界面加载失败、解压权限错误和空白界面。这些问题看似复杂,其…...
Visio网络拓扑图绘制实战:从基础操作到高级定制
1. Visio网络拓扑图绘制入门指南 第一次接触Visio画网络拓扑图时,我也被那些复杂的图标和连接线搞得头晕眼花。但用顺手后发现,这玩意儿比PS简单多了,就像用Word画图一样自然。先说说最基础的准备工作:安装Visio时记得勾选"网…...
mapbox 基于 Turf.js 实现高精度多边形分割(支持带空洞 / 坐标无损)
在 GIS 前端开发中,多边形分割是高频需求(如图斑拆分、地块划分)。本文基于 Turf.js 封装了一套高精度多边形分割工具类,支持普通模式 / 兼容模式,可处理带空洞的多边形,且能 100% 保留原始坐标,…...
2026年网文作者生存指南:实测7款AI码字工具,解决“吃设定”与“AI味”的终极防坑指南
写了十二年网文,从早期的起点玄幻、贴吧同人,一路熬到现在番茄的免费飞读模式,算是把网文圈的潮起潮落看了个遍。 最近这两年,个人作者真的很难受。很多工作室直接用大模型批量扫榜,搞得卷字数已经没意义了,…...
