问题背景
今天下午,突然收到nginx告警邮件,线上服务的web有N多的错误.
1. 打开监控平台一看,http的接口都超时了,最厉害的超时20秒了.
2. 立马登录web服务查看, 日志访问情况, 打开一看, 发现很多调用dubbo服务超时.
3. 初步定位是dubbo超时的问题
4. 登录dubbo服务机器查看日志,果然在报异常:thread pool is exhausted, dubbo线程池耗尽
解决步骤
第一步
立马保存现场, jstack pid > dump.log 保存线程日志,为了之后排查问题.
第二步
查看web日志的时候,发现是某个xxxService dubbo服务超时,发现这个dubbo服务,consumer端没有设置超时时间.立马设置为5秒,重新发布
dubbo超时时间的优先级可以查看http://dubbo.io/User+Guide-zh.htm官网
- 方法级优先,接口级次之,全局配置再次之。
-
如果级别一样,则消费方优先,提供方次之。
第三步
xxxService服务提供方,dubbo线程池的数据设置到500, 默认是200个
<dubbo:protocol threads="500"> 重新发布. 观察日志.
刚发布的时候, 还在报thread pool is exhausted错误. 立马让运维紧急扩容了2台dubbo服务机器. 观察2-3分钟,告警解除.
第四步
查看dump.log日志文件,发现线程为WAIRING状态的日志, 查看是代码有调用redis的缓存超时,伦理上redis应该是很快返回,但是线上出现了大量超时,导致dubbo服务超时.初步判断是这个问题,找到redis的中间件团队,升级redis到最新,我用的实在是太老的版本,已经不维护了.增加redis的连接数,重新发布dubbo服务机器到线上.
到目前为止, 线上运行正常,观察几天再说.