Hi3516CV610 FAQ
本文针对使用 Hi3516CV610 过程中可能遇到的常见疑问,提供解答与规避方案。
使用建议
- 首次使用: 先阅读"系统稳定性"和"性能对比"两个章节,了解用版本的基本特征
- 遇到问题: 先根据现象在对应模块FAQ中查找,多数问题有明确的规避方案
- 性能规划: 业务设计阶段参考FAQ中的性能约束条件,避免超限使用
- 持续更新: 本FAQ随版本迭代持续更新,建议关注最新版本说明
目录
1. 系统和功能
Q1.1 单板无响应,或sdk_server进程异常退出(OOM),如何处理?
现象:
部分业务负载较重的情况下,可能出现如下现象,业务中断或单板无响应
1、业务运行过程中出现频繁的如下异常打印,业务中断
[osal_uds_send_recv_multi:222]:send to 14 err:0xffffffff in thread(306267672)!
[osal_uds_send_recv_multi:222]:send to 14 err:0xffffffff in thread(306267672)!
2、通sdk_server进程异常退出、被os kill等,通过 ps 命令无法查询到 sdk_server 进程
3、串口打印
业务场景可能包含:
- AIISP aibnr场景下aibnr切换为WDR
- VPSS全在线卷绕(帧中断模式EARLY_END)
- VPSS全在线帧中断下动态创建销毁组(帧中断模式EARLY_END)
- 在线WDR+ VPSS-VENC卷绕
原因: os内存紧张,导致sdk_server无法分配到足够的内存,或频繁触发os的内存回收,导致系统卡顿/卡死、或sdk_server因为OOM被os Kill。
解决方案:
- 在当前的基础上,将OS MEM增大至少2M(默认os分配是32M),具体调整方式见文档《内存布局调整指南》"内存布局修改示例"章节
- 重启单板
如仍有问题,请尝试重新运行业务后,通过cat /proc/umap/* > proc_log.txt和cat /dev/mpplog抓取日志
Q1.2 cat /dev/logmpp查看无任何日志输出?
现象: cat /dev/logmpp 日志无输出。
原因:
1、默认日志等级是 ERROR(严重)以上才打印,当前没有错误日志产生
2、没有打开logmpp功能
解决方案:
1、打开logmpp功能开,步骤如下
-
加载ko时传递参数:insmod ot_base.ko logmpp_show=1
-
修改samples/mpp/common/sdk_init/sdk_init.c中的base_init函数,具体修改内容如下
-
进入samples/mpp/sdk_server执行如下命令重编sdk_server
-
重新运行sdk_server即可
2、如何修改各个模块的logmpp级别
-
查看模块。数字表示日志级别,越小表示日志级别越高。例如3表示ERROR级别,6表示INFO级别。具体可以参考头文件"ot_debug.h"中的定义。
# cat /proc/umap/logmpp_user ----------------------------------------log buffer state---------------------------------------------------------------- max_len(KB) read_pos write_pos butt_pos 64 0 0 65536 ----------------------------------------current log level--------------------------------------------------------------- vb : 3 sys : 3 region : 3 …… -
修改具体模块的logmpp打印级别
echo "模块=级别" > /proc/umap/logmpp_user,以vi模块为例
```shell
echo "vi=6" > /proc/umap/logmpp_user
```
表示将vi模块日志级别为0-6的都打印到/dev/logmpp中。
也可以修改所有模块的日志级别,命令为:
表示将所有模块日志级别为0-6的都打印到/dev/logmpp中。
日志打印级别的修改,在单板重启或者sdk_server重启之后会恢复到默认级别3。
Q1.3 sdk_server的CPU占用过高(可能超过15%),如何处理?
现象: 业务负载较重的场景下,sdk_server占用率可能持续较高。
例如 单目4K20fps线性,VI开启3DNR,VPSS组打多个cover,送给智能分析后,出3路编码码流并存储码流。
原因: 社区架构采用多进程通信方式,多进程之间通过UDS通信,进程之间采用UDS连接池共享连接,进行通信。
解决方案:当前连接池最大个数默认是8,可以根据实际业务负载评估高频进程间通信的(每秒超过1000次交互)业务线程数量,并重新设置最大连接池数量,降低连接池管理消耗和线程数量。例如高频UDS通信的线程只有3个,则可以设置线程池最大数量为4,相对于默认节省4个线程的资源。具体设置方法为:
-
修改
soc/drivers/osal/src/linux/userspace/osal_uds_client.c的宏定义UDS_POOL_MAX -
进入目录
soc/drivers/osal/src/linux/userspace重新编译,得到libosal.so/libosal.a,替换对应的库即可
Q1.4 如何打开WDR?
现象:无法使用WDR功能。
原因: 默认WDR功能未打开。
解决方案: 按照如下步骤打开WDR功能
-
修改profile的值。sample/mpp/common/sdk_init/sdk_init.c中,sys_profile默认为0,需要修改sys_profile的值为1。
-
重编sdk_server。进入samples/mpp/sdk_server执行
make clean -j;make -j命令重编sdk_server。
编译后使用新的sdk_server重新运行即可。
2. 性能
Q2.1 CPU使用率较高,SDK的接口调用耗时增加,这是正常的吗?
现象:部分场景下,CPU占用较高。涉及场景包括:
- 单目4M30fps 线性/ 2to1WDR
- 单目4K20fps 线性(录像机场景)
- 单目4M12fps AI-ISP(黑光)智能IPC
原因: 当前架构采用多进程通信提供媒体功能(sdk_server进程),SDK的接口调用通过IPC发送给sdk_server,存在固有的用户态/内核态切换和IPC通信开销(跟交互的数据有关,0.2ms-1ms之间),导致部分性能指标变高。
解决方案:
- 当前多进程通信框架导致,可以根据实际业务降低连接池线程数量,具体参考
Q1.3 - 当前版本需合理规划业务负载,关闭或裁剪不需要的功能
Q2.2 快启耗时达不到预期?
现象:当前支持快启功能,sdk_server开放了全量功能,导致快启时间变长。
解决方案:根据实际业务情况重新评估基线,并裁剪sdk_server中不需要的模块。裁剪方法为
-
修改samples/mpp/common/sdk_init/sdk_init.c中的sdk_init函数,根据实际业务确认哪些模块不需要
-
进入samples/mpp/sdk_server执行如下命令重编sdk_server
-
重新运行sdk_server即可
3. 视频处理(VPSS)
Q3.1 VPSS多路低延时+卷绕+普通叠加后编码通道过多,导致报错?
现象: VPSS开启6路低延时+6路卷绕+6路普通,对接16路编码,业务运行后出现错误日志信息
原因: 多路极限性能受限,资源不足导致异常打印
规避方案:
- 该场景为极限性能场景,不建议在实际业务中使用,需要减少低延时/卷绕通道的组合数量
Q3.2 VPSS通道VB缓存块不足时降帧率?
现象: 实际运行过程中,每个通道在只有2块对应大小的VB时会降帧率。
解决方案: 增加每个通道的VB缓存块数量,建议至少配置3-4块VB。
Q3.3 延时中断行号配置过大导致丢帧?
现象:全在线工作模式,帧中断类型EARLY、EARLY_END,1080P分辨率延时中断行号配置1079会导致丢帧
解决方案:将early_line设置为图像高度的2/3,避免延时中断与下一个帧起始中断太近。
4. ISP/AIISP/AIBNR
Q4.1 AIBNR切换为WDR时异常,sdk_server异常退出?
现象: AIBNR切换为WDR时,串口和日志出现异常打印,切换失败,sdk_server进程异常退出。
解决方案: 参见 Q1.1
Q4.2 WDR自动降帧场景下,镜头遮挡后放开时画面卡住?
现象: WDR在线业务中(VI在线,VPSS离线),AE自动模式下(短帧优先和长帧优先都存在),自动降帧模式,镜头对着工频闪灯泡,用手遮住镜头后放开,点播画面卡住,VI和VPSS通道帧率为0。
规避方案:
1、关掉BNR
2、避免在WDR自动降帧模式下进行极端的光照突变操作(如遮挡镜头后突然放开)
5. 智能算子(SVP/NPU)
Q5.1 SVP NPU Sample运行需要增大OS内存?
现象: 使用默认32M OS内存运行sample_svp_npu_main时,日志一直打印vi_pipe相关报错。
解决方案: 增大OS内存分配,建议从默认32M调整到48M或更高。
Q5.2 IVE任务队列满如何解决?
现象: 执行ive任务,出现The waiting queue is full of task队列满的打印报错。
解决方案: 当前ive队列默认节点数是64,需要实际情况增加ive节点数,建议每次增加32后重试,修改方案为
-
修改samples/mpp/common/sdk_init/sdk_init.c中的ive_init函数,具体修改内容如下
-
进入samples/mpp/sdk_server执行如下命令重编sdk_server
-
重新运行sdk_server即可
6. PQTools调参工具
Q6.1 默认32M内存下单板运行PQT工具异常?
现象: 默认32M内存配置下,PQT工具有多个场景运行异常
工具使用的业务场景可能包括:
- 启wdr业务、3A统计抓图功能,无法获取统计信息
- 部分aibnr业务:hy006_3814_0011_4M15_large_mem_aiisp_send_raw.ini、hy006_3814_0011_4M5_large_mem_aiisp_send_raw.ini(128M DDR不支持)
- FPN标定(128M DDR不支持)
- 灌raw/yuv后,进行点播、3A抓图、抓jpeg(128M DDR不支持)
- 板端自动灌YUV抓码流
原因: 默认32M的OS内存不足,或128M DDR单板上无法运行
解决方案:
1、 增大OS内存分配,建议从默认32M调整到更大值。
2、需要128M以上DDR的场景,当前不支持