近日,下班走后接收到业务反馈的一个错误,微信服务器向公众号推送消息或事件后,得到的回应不合法 次数: 5分钟 2731次
。
看到是微信推送消息相关,然后看了眼时间,大概定位到了是定时通过微信公众号通知学生上课提醒的业务,所以立马通知开发去排查消息发送日志确定是什么问题。
但是开发查完消息发送日志,并没有发现相关线索,就去查看应用日志,最终才发现了大量如下的异常信息
1 | java.net.SocketException: Too many open files |
第一反应就是文件打开数超过 Linux 的限制了,莫非还是默认的 1024
?。立即执行 ulimit -n
查看当前系统的文件打开符限制,得到的结果是 65535
。
看到数字想起来早期已经统一设置了该参数了。继续查看上面的异常信息,发现了几个关键的地方
java.net.SocketException
org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:120)
由此大概率判断可能是网络资源没有得到释放导致?
所以立即执行了 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
命令,显示存在 40多万
个状态为 CLOSE_WAIT
的连接
然后执行 ll /proc/[PID]/fd |wc -l
查看当前应用进程是否有大量状态为 CLOSE_WAIT
的连接,继续应证了该想法。
接下来就比较明确了,进行 Code Review,查看 at cn.xxxxxxxx.notice.manager.component.impl.WXPushServiceImpl.doAction(WXPushServiceImpl.java:89)
相关区域的代码
找到了使用 HttpClient
的地方,确认了当时的开发未释放 httpclient 实例。