这个服务对应的模块,用户数比较少,且使用频率较低,用户就没有反馈。查看线程和端口都还在,所以健康检查服务并没有报警。
首先怀疑是网络流量不通,问过运维并没有改过nginx配置。尝试模拟前端通过公网调用接口,抓包,返回502.在服务器上直接调用自己的接口,长时间没有返回,直接阻塞。
尝试重启,服务恢复。但是全部重启了,没有留一个现场调查。猜测服务是假死,开始冥思苦想可能的原因。
午饭后,服务再次挂掉。负载均衡上摘掉一台机器做研究。查看内存使用 和 cpu 使用率都非常低。jps拿到pid,jstack <pid> 去所有线程状态。共近300个线程,60个BLOCKED状态。绝大多数都是如下内容:
应该是线程池等待任务。其他线程大多都是IN_NATIVE状态。如下:
看到是发出的http请求,一直卡到socketRead上。方法栈继续向下找,找到了业务方法,是一个webservice对第三方依赖服务的请求。经过与同事交谈得知,第三方服务对请求ip有白名单控制,而我们的出口IP刚好在昨天修改过,导致请求失败。而请求的部分是对方封装的jar包,内部没用进行超时处理。用户请求卡到这,最终耗尽线程池中的线程。无法响应新请求。
对策:
1.增强基础设施管理制度,流程化,保证各部门对相关修改知晓,且有足够时间对出反应。
2.第三方依赖耦合度降低,排除因为依赖的服务问题,导致整体服务停止。