RK3588 Android12 DMABUF内存泄漏问题分析

什么是DMABUF

DMABUF是多媒体设备之间共享内存的一种特定buffer结构,不同设备可以通过DMABUF的fd进行跨进程共享内存,实现零拷贝提高性能,支持异步访问降低模块耦合度。

问题描述

RK3588机器在线视频播放长时间拷机出现系统重启,log里面可以看到dma-buf内存分配失败,最后导致系统重启。

[05-15 04:55:46][64021.496139][ T6554] rk_vcodec: mpp_task_attach_fd:1696: can't import dma-buf 1
[05-15 04:55:46][64021.496144][ T6554] iep2_process_reg_fd:270: reg[044]: 00000401 failed
[05-15 04:55:46][64021.496149][ T6554] rk_vcodec: mpp_process_task_default:602: alloc_task failed.
[05-15 04:55:46][64021.496155][ T6554] rk_vcodec: mpp_wait_result_default:842: session 6553:531 pending list is empty!
[05-15 04:55:46][64021.496160][ T6554] rk_vcodec: mpp_msgs_wait:1549: session 531 wait result ret -5
[05-15 04:55:46][64021.499857][ T6554] mpp_dma_import_fd:198: dma_buf_get fd 16 failed(-22)
[05-15 04:55:46][64021.499870][ T6554] rk_vcodec: mpp_task_attach_fd:1696: can't import dma-buf 16
[05-15 04:55:46][64021.499876][ T6554] iep2_process_reg_fd:270: reg[044]: 00000410 failed
[05-15 04:55:46][64021.499881][ T6554] rk_vcodec: mpp_process_task_default:602: alloc_task failed.
[05-15 04:55:46][64021.499888][ T6554] rk_vcodec: mpp_wait_result_default:842: session 6553:531 pending list is empty!
[05-15 04:55:46][64021.499893][ T6554] rk_vcodec: mpp_msgs_wait:1549: session 531 wait result ret -5

结合log及现象看比较大可能是内存泄漏导致,于是按如下方法来确认并定位是哪里泄漏。

问题分析

/proc/rk_dmabuf/dev 这个节点里面会记录当前的dma的使用信息:

130|rk3588_s_evb7:/ # cat /proc/rk_dmabuf/dev                                                                                                                                                 DMABUF NAME             EXPORT                 SIZE:KiB AttachedDevicesffffff8022507400 402-allocator@4. system-uncached        2628 KiB fb000000.gpu display-subsystem fb000000.gpu
ffffff8143313a00 402-allocator@4. system-uncached        2628 KiB fb000000.gpu display-subsystem fb000000.gpu
ffffff819883e200 474-c2@1.1-servi rockchipdrm              56 KiB fdc38100.rkvdec-core
ffffff819daddc00 402-allocator@4. system-uncached        2628 KiB display-subsystem fb000000.gpu
ffffff80364ec200 402-allocator@4. system-uncached        2628 KiB fb000000.gpu display-subsystem fb000000.gpu
ffffff819dac0400 402-allocator@4. system-uncached        2628 KiB fb000000.gpu display-subsystem fb000000.gpu
ffffff81032a1400 402-allocator@4. system-uncached        2628 KiB display-subsystem fb000000.gpu
ffffff8102c5a400 402-allocator@4. system-uncached        1260 KiB fdbb0000.iep fdc38100.rkvdec-core fb000000.gpu display-subsystem
ffffff8102c59800 402-allocator@4. system-uncached        1260 KiB fdbb0000.iep fb000000.gpu fdc38100.rkvdec-core display-subsystem
ffffff81049b9000 402-allocator@4. system-uncached        1260 KiB fdbb0000.iep fdc38100.rkvdec-core fb000000.gpu display-subsystem
ffffff800f84de00 402-allocator@4. system-uncached        1260 KiB fdc38100.rkvdec-core fb000000.gpu display-subsystem
ffffff800f84c400 402-allocator@4. system-uncached        1260 KiB fb000000.gpu fdc38100.rkvdec-core display-subsystem

每个1个小时(根据实际泄漏的速度可以适当增加减小)敲一下如下命令,保存当前dma-buf的信息
cat /proc/rk_dmabuf/dev > sdcard/time1.txt
一小时后
cat /proc/rk_dmabuf/dev > sdcard/time2.txt
然后使用比较工具对比看两个文件的差异,看是否有多出的dma-buf信息

对比发现ffffff81c260aa00 359-allocator@4. system-uncached 1740 KiB display-subsystem 这个一直在增加,通过 /sys/kernel/debug/dma_buf/bufinfo 输出的 dmabuf 的 inode 信息, 可以检索到哪些进程持有该 dmbuf 的 fd:

rk3588_s_evb7:/ # cat /sys/kernel/debug/dma_buf/bufinfo                                                                                                                                       Dma-buf Objects:
size            flags           mode            count           exp_name        ino
01781760        00000002        00080007        00000004        system-uncached 00520340        359-allocator@4.0-sAttached Devices:display-subsystem
Total 1 devices attached
01781760        00000002        00080007        00000004        system-uncached 00520339        359-allocator@4.0-sAttached Devices:display-subsystem
Total 1 devices attached
01781760        00000002        00080007        00000004        system-uncached 00143207        359-allocator@4.0-sAttached Devices:display-subsystem
Total 1 devices attached01290240        00000002        00080007        00000004        system-uncached 00177498        359-allocator@4.0-sAttached Devices:display-subsystem
Total 1 devices attached

上面是 cat /sys/kernel/debug/dma_buf/bufinfo 的输出, 520339是某个 dmabuf 的 inode 的 i_ino 成员, 下面是在 lsof 的输出中检索到的该 iino , 即对应的进程以 fd 持有对对应 dmabuf 的引用. 一个 dmabuf 可能被多个 进程 这样引用:

rk3588s_s:/ # lsof | grep 520339
c2@1.1-service   426 mediacodec  235u     0000                0,8       0t0     520339 /dmabuf:359-allocator@4.0-s
rk3588s_s:/ #
rk3588s_s:/ #
rk3588s_s:/ # lsof | grep 143207
c2@1.1-service   426 mediacodec  117u     0000                0,8       0t0     143207 /dmabuf:359-allocator@4.0-s
rk3588s_s:/ #
rk3588s_s:/ # lsof | grep 177498
c2@1.1-service   426 mediacodec   89u     0000                0,8       0t0     177498 /dmabuf:359-allocator@4.0-s

通过上面命令可以看到这个dma-buf的持有者是进程号:426的mediacodec进程,通过ls /proc/426/fd 可以看到有多个dma-buf的fd没有释放,这样就可以确认是mediacodec内有dma-buf没有释放,存在泄漏的问题,再找对应的模块负责人进行具体分析定位。

RK3588 Android12 DMABUF内存泄漏问题分析相关推荐

  1. Android内存泄漏的分析和避免

    内存泄漏 Java是垃圾回收语言的一种,其优点是开发者无需特意管理内存分配,降低了应用由于局部故障(segmentation fault)导致崩溃,同时防止未释放的内存把堆栈(heap)挤爆而导致程序 ...

  2. android内存泄漏原因分析,android 内存泄漏问题

    内存泄露问题在一些压力测试的场景很容易暴露,例如一些常用应用场景反复操作(eg:反复切换前后摄像头,反复进入退出相机应用.压力拍照等等). 内存泄露一般表现为: ①内存分配释放,导致进程空间虚拟地址被 ...

  3. Android 内存泄漏问题分析 指南

    内存异常的情况: 我们看到一直在上涨~ 内存正常的情况: 内存有涨有跌,这样才说明内存能够被回收. Mat 工具的使用: 使用mat 打开hprof文件,查看你认为可能泄露的类的引用. 如果是java ...

  4. android内存泄漏原因分析,Android Studio3.6的内存泄漏检测功能 VS LeakCanary

    2020年2月,谷歌发布了Android Studio 3.6版.它包括一个新的"内存泄漏检测"功能.这是否意味着我们不再需要流行的内存泄漏检测库"Leak Canary ...

  5. Android Others部分内存泄漏 OOM分析

    本周公司项目解决内存泄漏,使用Android studio profiler工具进行分析. 在人工monkey测试点击管理页面各项菜单后,工具内存查看页面看到内存有增长不是释放的情况.但是dump后未 ...

  6. 设置log缓存_全局变量、事件绑定、缓存爆炸?Node.js内存泄漏问题分析

    作者:elvinpeng,腾讯 WXG 前端开发工程师 Node.js 使用的是 V8 引擎,会自动进行垃圾回收(Garbage Collection,GC),因而写代码的时候不需要像 C/C++ 一 ...

  7. android内存泄漏原因分析,Android 内存泄漏案例分析总结(Handler)

    在Android开发开发中,操作不当很容易引起内存泄漏,这里主要记录下平时遇到问题,包括:静态变量(也包含集合).非静态的内部类.Handler.监听器,尤其是 Handler 在开发中要格外的注意. ...

  8. C++内存机制中内存泄露、内存溢出、内存越界和内存泄漏原因分析

    在用C++做底层驱动时,经常会遇到内存不足的警告,往往是因为内存出现溢出.泄露或者越界等原因. 内存溢出(out of memory) 是指程序在申请内存时,没有足够的内存空间供其使用. 内存泄漏(m ...

  9. 实战Java内存泄漏问题分析 -- hazelcast2.0.3使用时内存泄漏 -- 2

    hazelcast 提供了3中方法调用startCleanup: 第一种是在ConcuurentMapManager的构造函数中,通过调用node的executorManager中的Scheduled ...

最新文章

  1. Animation动画:
  2. DISPLAY环境变量的作用
  3. NS2网络模拟(3)-吞吐率
  4. 【计算机网络】网络层 : OSPF 协议 ( 协议简介 | 链路状态路由算法 | OSPF 区域 | OSPF 特点 )
  5. 跨域 (1) jsonp 跨域
  6. 帝国整站PHP源码,帝国cms 诗词整站源码
  7. 笔记-项目配置管理-配置管理主要工作
  8. php性能优化分析工具XDebug 大型网站调试工具
  9. 直男的回答能多出乎意料?
  10. PIT和TestNG突变测试简介
  11. 输入分钟输出小时python_输出键,值对如何使1小时内的时间在使用Python的MapReduce中的reducer中结束?...
  12. html 物流状态,使用css实现物流进度的样式的实例代码
  13. emlog和typecho文章采集插件-简数第三方数据采集
  14. 财务自由,一年赚500万,依然做社畜是什么感觉?
  15. 从头开始复习css之选择器(中)
  16. ScreenToClient And ClientToScreen
  17. MATLAB频谱图绘制
  18. 计算机模拟病例考试试题,计算机模拟病例考试的效标—关联效度研究
  19. 6款沙发背景墙装饰画 总有一幅你喜欢的
  20. Bing必应搜索引擎打开新标签默认页的修改

热门文章

  1. python 全角半角字符转换
  2. drawable java什么意思_Java Drawable.draw方法代码示例
  3. 带状态转换图的词法分析器
  4. 如何只用逻辑运算实现算术加减乘除运算
  5. 什么是增长飞轮?增长飞轮(Growth Loops)概述
  6. 自然语言处理(NLP): 13 The Illustrated BERT, ELMo, and co.
  7. windows关机API
  8. wps如何设置试卷密封线_如何用word文档编辑试卷的密封线、班级、姓名等
  9. matlab互补误差函数程序,准确计算比例互补误差函数erfcx()
  10. Java题-利用递归方法求5!