问题排查---应用程序不在接收新请求

简介: 关键词:springboot,jstack,Arthas

问题排查---应用程序不在接收新请求

关键词:springboot,jstack,Arthas

问题描述

查看前端网页,发现所有请求都pending,都超时。但是查看后端程序发现并没有挂掉,cpu,内存都正常。但是日志不打印了。看起来应用程序整体卡死了。

然后重启应用程序,发现又能正常运行了,但是过了半小时后,应用程序又会卡死,不再接受新请求。但是看起来cpu和内存等都是正常的。

问题排查

使用top命令,查看到应用进程cpu内存正常,占用不高。

使用Arthas查看线程信息,使用dashboardthread -n 10等命令,看到线程cpu和内存也都占用不高。但是发现大量线程处于WAITING状态:

image-20231007140124383

使用thread --state WAITING --all,可以看到很多http-nio-8080-exec-开头的线程:

image-20231007140044188

随便选中其中一个线程,查看其堆栈信息,thread 700

image-20231007140302112

找到了相关的代码,经过分析发现produceMediaLinkInfo方法是向一个阻塞队列放入数据,当阻塞队列满了的时候,则该线程将阻塞。其实这个阻塞队列就是一个生产者-消费者模型,现在生产者的生产速率过快,而消费者的消费速率相对较慢,导致大量的线程往阻塞队列中put数据时,阻塞住了,因此大量线程进入WAITING状态。

由于大量线程处于WAITING状态,导致tomcat没有多余的线程处理其他新的请求,因此才看起来程序卡死,但是其cpu和内存都正常。


除了使用Arthas,我也使用了jstack命令,也是能够看出大量线程处于WAITING状态,并且jstack会打印每个线程的堆栈信息。

问题解决

定位好问题后,其实就是想办法加快消费者的消费速率,减小生产速度,扩大阻塞队列容量。

对于增加消费速度,可以根据实际情况增加消费者线程,选择合适批量插入的数量(增加批量插入数据库的数量,看是否能提高效率)

对于减小生产速度,可以根据实际业务情况与同事商量,是否有必要减少上报的频率。因为我们之前是一个设备一秒一次上报状态,现在突然改成了100ms一次,也就是说生产的速率突然提高了十倍,感觉还是有点问题的,可以再去商议这个问题。

增大阻塞队列容量,或者不使用put方法,而是使用add或者offer来添加元素。

other

Arthas的ognl

给大家做一个有意思的操作~~~

现在我们已经知道了阻塞队列满了,导致大量线程WAITING,那么现在我直接将阻塞队列clear,那么理论上线程就不会阻塞了。

thread命令查看现在有多少WAITING线程:

image-20231007143128764

可以看到有851个WAITING

现在我们看看这个阻塞队列的大小(这个阻塞队列最大是50,mediaLinkInfoQueue是阻塞队列的名字):

ognl @com.cogent.system.common.BagInfoReport@mediaLinkInfoQueue.size()

image-20231007143312403

可以看到阻塞队列满了。

我们执行clear方法:

ognl @com.cogent.system.common.BagInfoReport@mediaLinkInfoQueue.clear()

image-20231007143431994

我执行了clear方法,但是很快阻塞队列又满了。

image-20231007143558597

然后我又执行了很多次clear方法,我们可以看到WAITING状态的线程越来越少。

然后我的程序终于重新运行起来了,可以接受新的请求了。

我觉得这个ognl很有意思,但是现在我只看到他操作类变量,不知道ognl可不可以操作对象的成员变量,如果有网友了解,欢迎指出!!

目录
相关文章
|
NoSQL 搜索推荐 Java
SpringBoot整合Redis启动时卡死问题记录
SpringBoot整合Redis启动时卡死问题记录
1766 0
|
Cloud Native Linux 网络安全
如何利用Gitlab-CI持续部署到远程机器?
长话短说,今天聊一聊使用Gitlab-CI 自动部署到远程服务器。
如何利用Gitlab-CI持续部署到远程机器?
|
11月前
|
Arthas 监控 Java
Arthas thread(查看当前JVM的线程堆栈信息)
Arthas thread(查看当前JVM的线程堆栈信息)
1827 10
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
685 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
9月前
|
人工智能 Java 开发者
spring-boot重试机制:Guava-Retrying
在业务开发中,请求第三方接口时常因网络问题导致失败,此时可使用重试机制解决。本文介绍基于Guava实现的guava-retrying,通过封装HTTP请求工具类并结合重试策略,提升接口调用稳定性。内容涵盖工具类编写、重试配置及监听处理,适用于Java开发者优化系统健壮性。
288 1
|
机器学习/深度学习 人工智能 边缘计算
软件测试的未来:自动化与AI的融合
在数字化时代的浪潮中,软件测试作为确保产品质量的关键步骤,正经历着前所未有的变革。随着技术的发展,自动化测试和人工智能(AI)的结合不仅提升了测试的效率和准确性,还极大地扩展了测试的范围和深度。本文将探讨自动化测试的最新趋势、AI如何重塑测试流程,以及未来软件测试可能达到的新高度。
|
Java 数据库连接 Maven
如何使用Sentinel实现流控和降级
通过以上步骤,你可以使用Sentinel实现应用的流量控制和降级操作,以保护系统在高流量或不稳定情况下的稳定性。欢迎关注威哥爱编程,一起学习成长。
745 1
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
存储 网络协议 网络性能优化
网络传输延迟
网络传输延迟
974 1