现象
web登陆不了,cameraserver的fd泄露
排查方法
fd泄露的排查方法:
查看cameraserver进程的PID:ps -ef|grep cameraserver
查看这个进程打开的fd数量,804是进程的PID:cd proc/804/fd | ls |wc -l
最大的数量是1024,接近这个数量就是fd泄露了,正常来说应该一百多
可以查看一下打开的fd路径:lsof -p 804
可能的原因
查看一下哪些fd重复打开没有关闭
如果是CAM_KSocketServer0,是ISP的socket通信没有释放fd
- linux有安全子系统SElinux,会对进程的权限进行控制,没有权限就创建不了文件,直接退出,没有释放fd
- 摄像头关闭的时候,cameraserver服务端没有关闭连接的socket文件
如果是sof_freeze_dump.txt,可能是出现了
sof timeout
和recover的错误- timeout一般是帧数据接收超时的错误,是通过相邻两帧的时间戳确定的,如果上层进行了时间同步,也会出现超时错误
- recover的操作是在下一帧数据又正常的情况下出现的,把之前的log文件覆盖掉,此时高通的代码删除文件的时候没有先把文件关闭
解决方案
- 如果是ISP的socket通信没有释放fd
- 没有该目录下的权限
- 修改启动文件init.qcom.rc,修改对应目录的对应权限
- 对没有权限的情况进行处理,服务端和客户端都需要进行处理
- 向驱动申请在SElinux中增加cameraserver进程的权限
- socket服务端关闭的时候,需要关闭连接的文件,用到epoll注意需要关闭所有的连接文件
- 没有该目录下的权限
- 如果是sof_freeze_dump.txt
- 如果是上层时间同步引起的超时错误,只有一帧会出现问题。所以判断超时错误的时候再加一个判断,确定两帧都超时了才算超时错误
- 在删除sof_freeze_dump.txt文件之前把文件关闭(server_debug.c)
小结
- 用到文件fd的地方一定要检查程序的各个结束的情况,有打开就必须要有关闭。
- 文件的打开关闭可以在构造和析构函数中进行,更加不容易忘记。
- 创建和打开文件、property的时候,都需要注意是否有权限,更要注意没有权限时的处理。
- 时间同步的时候,需要注意规避高通原生代码fd泄露的bug