分析
之前分析对文件数打开过多的原因可能存在如下三个地方:
- 分布式锁
- 异步定时任务
- 异步写日志
下面一个一个分析。
分布式锁
分布式锁是采用redis实现的,加入了自旋的功能(redis做分布式锁终归不是一个很好的方案),但是代码中使用这个锁的地方不止一处,之前都一直没有出问题,所以先放一边。
异步写日志
由于查看lsof,是sock一直在增长,考虑是网络连接没有正常释放的问题,用到网络连接的地方就是接口请求,用户请求和写NFS日志。网上看了下也有说是NFS的问题,将日志临时注释,发现并没有作用。那就是接口请求或用户请求的问题,但是一直也没有头绪。
异步定时任务
由于发生问题的前一天上线过一个定时任务的功能,所以把那天发布的代码拿出来检查,也没发现有什么问题(后台才知道是Controler层定义了一个线程池成员变量导致类无法被GC)。
堆DUMP
这个时候把堆dump出来分析成了最直接的方式, 但是我们服务是部署在docker里的,而这个dock