Android Display性能问题教战手册5-SF/HWC内存使用问题

系列文章请扫关注公众号!

Android Display Graphics系列文章-汇总

本文主要包括部分:

1、dma-buf问题初步判定方法

2、SF/HWC dma-buf debug

3、SF/HWC与对比机内存使用对比问题

本文主要分析SurfaceFlinger、Hardware composer内存使用问题,及dma-buf的debug技巧。

Overview

dma-buf是一个多进程间的buffer共享的机制, 本节主要介绍针对display部分相关的dma-buf如何做初步的分析

在Android中Buffer需要在多个进程间传递使用的Module有很多, 但用量比较明显,无法回避的主要都在MM相关module中, 其中显示Graphic图形使用的Buffer是最为频繁的, Buffer会在APP / sytemserver / Surface / GPU / SurfaceFlinger / hwcomposer / kernel display DRM driver 等module间进行传递使用, 所以Graphic的相关Module是最容易被Call到需要来厘清dma-buf使用情况的

1、 dma-buf问题初步判定方法

怎样判定当前的内存问题是dma-buf相关的问题呢?

在meminfo中的 EGL mtrack 部分就是代表 dma buf的用量, 如果这部分用量异常则需要厘清dma buf的使用情况

dma-buf使用异常会与哪些问题相关?

1,内存分配不出引发的异常 各种exception, 图像卡死等现象,伴有低内存的, 经过内存owner分析以后无其他内存异常的

2, 内存占用异常 主要指在一些预期不会使用很多内存的场景, 出现较大的dma-buf占用

3, buffer相关fd异常 目前对于fd主要会报异常的就是fdsan, 或者有些exception发生前突然出现fd error等

发生异常时如何进一步查看dma-buf的使用信息呢?

1, 有发生exception, 且能获取到db的情况

Hang : SYS_DMA_HEAP_RAW

SWT/Other: DMABUF_HEAP_INFO / ION_DMABUF_SYSTEM_INFO

OOM/KE/JE****:SYS_KERNEL_LOG****(search keyword: "dma_heap: mtk_debug")

2, 没有发生exception或没有db的情况:

此种情况一般基本要求是device保有内存使用异常的现场未恢复, 进阶要求是有找到一些复现操作路径,并且可以观察到EGL mtrack部分随着使用在持续增长且不会自动减少

制作adb脚本去循环cat meminfo, 并持续比较和观察EGL mtrack部分, 可以设定增长到一定Size即主动去kill -11 [SurfaceFlinger Pid] 来产生NE, 以固定到问题现场并提取到db

如果不方便触发和提取到db,可以通过以下cmd去cat到当前一些dmabuf的info出来

adb shell cat /proc/dma_heap/all_heaps > all_dma_heaps.txt 此文件为MTK平台独有,在MTK平台debug时推荐优先查看

adb shell /system/bin/dma_buf_dump > dmabuf_dump.txt 此文件会按进程分开列出每个进程的dma buf持有情况

adb shell dmabuf_dump -a > dmabuf_dump_a.txt 该文件为Android默认节点, 其列表形式比较容易查看Fd ref/ Map ref count持有情况

adb shell dmabuf_dump -b > dmabuf_dump_b.txt 该文件为Android默认节点, 主要时按per buffer进行统计汇总

2、 SF/HWC dma-buf debug

SF/HWC作为图形系统的传递中枢, Buffer的使用异常通常都会有surfaceflinger和composer的中间持有, 这也是此类问题为什么会常常需要SF/HWC owner参与梳理的原因

SF/HWC的梳理step by step:

1, 首先通过all_dma_heaps可以观察整体状况

此处dump首先会列出dma buffer的主要user, 我们主要关注surfaceflinger和composer的使用量是否有异常

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| PID PSS(KB) RSS(KB) 3236 25272 47712 2935 103267 127272 1443 37533 108432 1225 4 4 984 102401 371176 906 232617 330476 893 48 48 -----EGL memtrack data end --sum: userspace_pss:501143 KB rss:985120 KB --sum: kernel rss: 3136 KB pid table: pid:3236 name:droid.launcher3 pid:2935 name:ndroid.systemui pid:1443 name:system_server pid:1225 name:binder:1225_2 pid:984 name:surfaceflinger pid:906 name:composer@3.2-se pid:893 name:binder:893_2 |

同步观察dump中列出的top 10用量的buffer, 注意这里把 buffer name 都有打印出来, 因为Buffer最终通过BufferQueue分配使用,所以其使用进程肯定会经过surfaceflinger和composer, 此处可以进一步分辨是否有哪个名字的buffer使用量过多, 需要进一步去分析关注

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dmabuf alloc total:(361/504280KB), top 10 user: debug name sum of size(KB) count of heap G:ColorFade#2(BLAST Consumer)2 79772 37 G:VRI[NotificationShade]#13(BLA 79772 13 G:VRI[GalleryActivity]#4(BLAST 77840 37 G:SurfaceView[com.android.galle 73500 37 FramebufferSurface 63552 37 G:screenshot 44880 12 G:ColorFade#3(BLAST Consumer)3 31444 35 G:VRI[]#14(BLAST Consumer)14 29092 10 G:Wallpaper#0(BLAST Consumer)0 11316 9 G:VRI[NavigationBar0]#1(BLAST C 4368 64 |

2, 去具体查看有嫌疑的Buffer的使用情况

3, 进一步debug ref count不归 0 的原因

( i ) SF/APP

(ii)HWC

(iii)kernel

3、 SF/HWC与对比机内存使用对比问题

SF部分主要差异就是在Buffer数量上,主要分为两点:.......

Composer进程的差异: ........

=========================================================================

============================完整文章见公众号===============================

=========================================================================

相关推荐
曹绍华1 分钟前
kotlin扩展函数是如何实现的
android·开发语言·kotlin
LSL666_5 小时前
5 Repository 层接口
android·运维·elasticsearch·jenkins·repository
alexhilton9 小时前
在Jetpack Compose中创建CRT屏幕效果
android·kotlin·android jetpack
2501_9400940211 小时前
emu系列模拟器最新汉化版 安卓版 怀旧游戏模拟器全集附可运行游戏ROM
android·游戏·安卓·模拟器
下位子11 小时前
『OpenGL学习滤镜相机』- Day9: CameraX 基础集成
android·opengl
参宿四南河三13 小时前
Android Compose SideEffect(副作用)实例加倍详解
android·app
火柴就是我13 小时前
mmkv的 mmap 的理解
android
没有了遇见13 小时前
Android之直播宽高比和相机宽高比不支持后动态获取所支持的宽高比
android
shenshizhong14 小时前
揭开 kotlin 中协程的神秘面纱
android·kotlin
vivo高启强14 小时前
如何简单 hack agp 执行过程中的某个类
android