现象

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重复打开没有关闭

  1. 如果是CAM_KSocketServer0,是ISP的socket通信没有释放fd

    • linux有安全子系统SElinux,会对进程的权限进行控制,没有权限就创建不了文件,直接退出,没有释放fd
    • 摄像头关闭的时候,cameraserver服务端没有关闭连接的socket文件
  2. 如果是sof_freeze_dump.txt,可能是出现了sof timeout和recover的错误

    • timeout一般是帧数据接收超时的错误,是通过相邻两帧的时间戳确定的,如果上层进行了时间同步,也会出现超时错误
    • recover的操作是在下一帧数据又正常的情况下出现的,把之前的log文件覆盖掉,此时高通的代码删除文件的时候没有先把文件关闭

解决方案

  1. 如果是ISP的socket通信没有释放fd
    1. 没有该目录下的权限
      • 修改启动文件init.qcom.rc,修改对应目录的对应权限
      • 对没有权限的情况进行处理,服务端和客户端都需要进行处理
      • 向驱动申请在SElinux中增加cameraserver进程的权限
    2. socket服务端关闭的时候,需要关闭连接的文件,用到epoll注意需要关闭所有的连接文件
  2. 如果是sof_freeze_dump.txt
    1. 如果是上层时间同步引起的超时错误,只有一帧会出现问题。所以判断超时错误的时候再加一个判断,确定两帧都超时了才算超时错误
    2. 在删除sof_freeze_dump.txt文件之前把文件关闭(server_debug.c)

小结

  1. 用到文件fd的地方一定要检查程序的各个结束的情况,有打开就必须要有关闭。
  2. 文件的打开关闭可以在构造和析构函数中进行,更加不容易忘记。
  3. 创建和打开文件、property的时候,都需要注意是否有权限,更要注意没有权限时的处理。
  4. 时间同步的时候,需要注意规避高通原生代码fd泄露的bug