当前位置: 首页 > news >正文

【Python】在rk3588开发板排查内存泄漏问题过程记录

背景介绍:

实时视频检测程序,可支持多路视频流实时目标检测等操作。在服务器上运行正常,移植到RK3588,并开发基于rknn的推理模块。在测试期间发现内存泄露的问题,使用top指令长期观察,内存平均以约5%每小时的速度增长;

第一阶段分析:

  1. 整个程序包含了获取帧图片、AI推理图片、图片绘制结果信息、保存图片、队列推送告警等环节;图片内存堆积可能造成内存泄漏;
  2. 疑惑点:python自身具备GC自动回收机制,使用完的图片应该会慢慢自动回收;在服务器运行程序时,并未发现内存泄漏;

第一阶段操作:

  1. 目前图片在程序内主要以cv2的格式存在。手动del释放所有程序内已经使用完全的图片数据,特别需要关注使用copy()的图片数据。
    例如:
    在这里插入图片描述

第二阶段分析:

调整过后,发现程序的内存上涨速度变慢,但是每小时仍以0.5~1%的速度增长。目前没有想到存在泄漏风险的地方,决定使用一些排查内存泄漏的工具来查看。

第二阶段操作:

在主线程中定时监控当前进程的内存占用:
简单示例:

import psutil, os, timepid = os.getpid()
proc = psutil.Process(pid)while True:mem_mb = proc.memory_info().rss / 1024 / 1024print(f"[{time.strftime('%H:%M:%S')}] Memory: {mem_mb:.2f} MB")time.sleep(10)  # 每 10 秒采样一次

然后再锁定泄漏对象类型
安装 objgraph:

pip install objgraph

在主线程定期调用:

import objgraph
objgraph.show_growth(limit=20)

它会告诉你哪种对象数量一直在涨,例如:

ndarray               50000    +1000
dict                   1200    +200
Frame                  800     +50

如果是 ndarray → 大概率是 OpenCV / numpy 图像数据没释放
如果是 dict / list → 可能是缓存或队列没清
如果是自定义类 → 检查你的推理 / 线程代码

然后再代码中主线程的修改如下:
在这里插入图片描述

打印结果如下:
在这里插入图片描述
然后可以看到Letter_Box_Info对象始终稳定增长,这是一个内存泄露的点。
排查发现,这是Letter_Box_Info是rknn推理模块中引用第三方代码里,创建的一个对象。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

泄露原因:COCO_test_helper对象的letter_box_info_list数组内不断加入Letter_Box_Info对象,却没有主动释放,导致letter_box_info_list数组长度不断增加。
解决方案:在每次rknn推理结束后手动释放:
在这里插入图片描述

修改后重新运行程序:
在这里插入图片描述
没有发现新的泄漏对象

后续

内存泄漏速度进一步降低,说明排查内存泄漏的方式是有效的。
修改后运行程序,运行很长一段时间后,内存泄漏以低于0.5%的速度增长,但是以上方式没有再排查到内存泄漏,后续有新进展会补充。
现阶段,采用进程定期重启的方式可以暂时解决这个问题,目前设置的24小时重启一次的策略,凌晨执行,不易感知。

http://www.dtcms.com/a/325410.html

相关文章:

  • 视频前处理技术全解析:从基础到前沿
  • DreaMoving:基于扩散模型的可控视频生成框架
  • 安全合规4--下一代防火墙组网
  • GaussDB 数据库架构师修炼(十三)安全管理(1)-账号的管理
  • vue+flask基于规则的求职推荐系统
  • CentOS7搭建安全FTP服务器指南
  • 【安全发布】微软2025年07月漏洞通告
  • C语言如何安全的进行字符串拷贝
  • MQTT:Vue集成MQTT
  • GaussDB安全配置全景指南:构建企业级数据库防护体系
  • 【vue(一))路由】
  • uncalled4
  • 昆仑万维SkyReels-A3模型发布:照片开口说话,视频创作“一键改台词”
  • 使用行为树控制机器人(二) —— 黑板
  • 哈希、存储、连接:使用 ES|QL LOOKUP JOIN 的日志去重现代解决方案
  • Logistic Loss Function|逻辑回归代价函数
  • 实习学习记录
  • 集成电路学习:什么是URDF Parser统一机器人描述格式解析器
  • ttyd终端工具移植到OpenHarmony
  • 工业相机与智能相机的区别
  • 5G与云计算对代理IP行业的深远影响
  • 用 Python 绘制企业年度财务可视化报告 —— 从 Excel 到 9 种图表全覆盖
  • nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)
  • 论文中PDF的公式如何提取-公式提取
  • Lightroom 安卓版 + Windows 版 + Mac 版全适配,编辑管理一站式,专业摄影后期教程
  • 【实用案例】录音分片上传的核心逻辑和实现案例【文章附有代码】
  • 智能双行框!百度全量上线AI搜索,是革新浪潮还是昙花一现?
  • 场外个股期权交易系统全球解决方案:监管协同与流动性创新——基于香港LEAP框架与多级清算体系的实践验证
  • 腾讯 iOA 测评 | 横向移动检测、病毒查杀、外设管控、部署性能
  • 智能合约执行引擎在Hyperchain中的作用