昇腾学院 | 案例分享 Atlas 800 3010 多路rtsp流业务处理中host端内存申请失败问题
问题现象描述
问题现象:运行288路rtsp流人脸识别业务,业务长时间稳定性测试过程中,host端内存不断下降,直到500M~1G左右,host端日志报错,无法申请内存,如图所示:
关键过程、根本原因分析
关键过程:
1、业务刚开始运行,查询内存使用情况,服务器操作系统total:125G,used:28G,free:85G,buff/cache:11G,如下图:
2、随着稳定性测试时间加长,free一直在下降,buff/cache一直在上升,如下图:
3、free内存的下降速度10G/1h,内存不断下降到500M左右,由日志查看错误信息,host端无法申请到256kb大小内存,导致device端解码超时,出现程序重启现象,此时内存情况如下图:
4、程序稳定性测试过程中,防止I/O频繁操作,数据不断缓存,通过删除日志动作,used内存恢复到70G左右,由此大部分内存消耗是缓存日志导致的。
5、操作系统设置自动回收内存机制,触发kswapd内核进程工作进行释放,保证操作系统host端free内存介于low阈值和high阈值之间,经过客户业务长时间稳定性验证,内存阈值设置在5G左右合理。
根本原因分析:
1、288路1080p视频流送入vdec模块解码,客户使用malloc方式申请的内存,通过图像预处理后,会产生大量的小于256kb的内存碎片,以至于当free内存达到500M~1G左右,host端无法申请大于256kb的内存。
2、客户产生的日志没有进行及时的清理,导致占用更有的内存。
结论、解决方案及效果
结论:
1、用HIAI_DMalloc方式申请送入vdec模块的内存数据,避免产生大量的内存碎片。
2、设置合理的内存回收机制,保证操作系统有可用的内存容量。
经验总结、预防措施和规范建议
1、使用HIAI_DMalloc内部接口申请host端输入数据的内存。
2、操作系统一般默认的内存回收阈值比较小,对于内存碎片多的场景,建议设置合理的内存回收机制。具体请查收链接:https://blog.csdn.net/zhanglu0223/article/details/77574110。
- 点赞
- 收藏
- 关注作者
评论(0)