【记一次线上事故的排查思路】- 线程阻塞问题排查

问题描述

服务在线上运行一段时间后,新请求不能被执行,于是猜测问题可能是"任务堆积在线程池中未被执行"。

证实猜测

为了证实猜测是对的,于是紧急写了一个接口用于查看现场池状态,包括监控线程队列,当前任务数,正在执行任务数,以及任务完成数。

"taskCount": 0,
"queueSize": 0,
"activeSize": 0,
"completedTaskCount": 0

确认问题

问题再次出现时,调用线程池监控接口,发现任务确实堆积在activeSize中,completedTaskCount不在变化。

定位问题

由于已经明确任务是堆积在活跃线程中,一直没有执行完成,于是联系运维,通过jstack查看线程池日志。
分析出,任务主要阻塞在http调用某个接口
在这里插入图片描述

代码排查

发现服务在调用某个接口时当前服务设置的超时时间未生效,改造httpTemplate,使超时时间生效,并根据以往请求接口的响应时间,设置超时时间为8秒。

问题解决思路

1、线程池监控
从线程池监控中看出,任务主要堆积在ip为“127.0.0.1”这台服务的阻塞队列中,在14:10分下线后,经过一个小时的时间,在没有新请求打进14服务器的同时,

 阻塞队列的任务并没有被消费。

2、任务堆积分析
从1中可以看出,核心线程一直处于running状态,也就是说6个核心线程被死锁了或者一直在死循环中。

3、找问题突破点
解决问题的突破点在于找出一直处在核心线程中的6个任务,通过日志分析这6个任务执行的最后位置。

4、排查思路
通过jstack日志分析线程池中线程阻塞原因。

   通过分析降级的id数据来找出最先进入核心线程并且未被释放的任务。

5、日志优化
继续日志优化,打进的请求要加上线程池信息。为以后出现问题时提供排查路径。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在一个流量高峰期间,我们的网站开始出现了性能问题,特别是Tomcat的worker线程居高不下。这个问题对我们的系统稳定性和用户体验产生了严重影响,因此我们立即进行了排查和解决。 首先,我们使用工具监控了Tomcat的worker线程数,发现在高峰期间线程数增长过快,并且没有下降的趋势。接下来,我们对服务器进行了资源监控,发现CPU和内存的使用率都没有超过正常范围。这表明问题不是由于服务器资源不足导致的。 然后,我们查看了Tomcat的日志文件,发现一些异常错误信息与数据库连接相关。我们怀疑是数据库连接池的问题,因此我们进一步检查了数据库的连接数和连接池的配置。经过对比分析,我们发现数据库连接池的最大连接数被设置得过小,导致在高流量时无法满足请求的需求。我们立即调整了连接池的配置,增加了最大连接数,以应对高峰期的负载。 随后,我们重启了Tomcat,并观察了一段时间。我们发现线程数在高峰期开始时仍然有所增长,但是随着时间的推移开始逐渐下降,最终稳定在一个正常的范围内。这表明我们的排查和解决措施是有效的。 为了进一步确保问题的解决,我们还增加了日志监控和报警机制,以便更及时地发现和解决类似问题。 通过这次经历,我们学到了对于高并发流量情况下的线上问题,需要全面考虑不同组件的性能和配置,并对各个环节进行监控和调整。同时,日志分析和排查是至关重要的工作,能够帮助我们准确定位问题并采取合适的解决措施,最终提升系统的稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence-wen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值