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

问题,排查,应用程序,不在,接收,请求 · 浏览次数 : 0

小编点评

## 应用程序卡死问题排查分析 **问题分析:** * 应用程序请求都无法处理新请求,导致服务器无法处理新请求。 * 服务器启动时日志记录中没有发现任何异常信息。 * 后端程序正常运行,但由于请求无法处理,导致应用程序卡死。 **问题排查步骤:** 1. **查看前端网页请求状态:** 使用 `top` 命令查看应用进程的 CPU 和内存占用情况。发现应用进程占用不高,但一些线程处于 WAITING 状态。 2. **使用 Arthas 查看线程信息:** 使用 `thread -n 10` 命令观察线程状态。发现大量线程处于 WAITING 状态,其中很多线程处于 `WAITING --all` 状态。 3. **使用 jstack 命令分析线程:** 使用 `jstack` 命令观察每个线程的堆栈信息。发现大量线程处于 WAITING 状态,其中许多线程在等待从阻塞队列中获取元素。 4. **分析阻塞队列大小:** 使用 `ognl @com.cogent.system.common.BagInfoReport@mediaLinkInfoQueue.size()` 命令查看阻塞队列大小。发现阻塞队列已满。 5. **尝试解决问题:** * 提高消费者的消费速率,减小生产速度,扩大阻塞队列容量。 * 可以尝试使用其他方法替代 `put` 方法,例如使用 `add` 或 `offer` 来添加元素。 **问题解决方法:** * **优化消费者的消费速率:** 可以根据实际情况增加消费者线程,选择合适批量插入的数量。 * **降低生产速度:** 可以根据实际业务情况与同事商量,是否有必要减少上报的频率。 * **扩大阻塞队列容量:** 可以增加阻塞队列的大小,或者使用其他方法替代 `put` 方法。 **注意:** * 问题可能涉及多个技术,建议根据实际情况进行调试。 * 使用 `ognl` 可以提供更多的信息,可以帮助分析问题的关键。

正文

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

关键词: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可不可以操作对象的成员变量,如果有网友了解,欢迎指出!!

与问题排查---应用程序不在接收新请求相似的内容:

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

问题排查 应用程序不在接收新请求 关键词:springboot,jstack,Arthas 问题描述 查看前端网页,发现所有请求都pending,都超时。但是查看后端程序发现并没有挂掉,cpu,内存都正常。但是日志不打印了。看起来应用程序整体卡死了。 然后重启应用程序,发现又能正常运行了,但是过了半

JVM 内存大对象监控和优化实践

服务器内存问题是影响应用程序性能和稳定性的重要因素之一,需要及时排查和优化。本文介绍了某核心服务内存问题排查与解决过程。首先在JVM与大对象优化上进行了有效的实践,其次在故障转移与大对象监控上提出了可靠的落地方案。最后,总结了内存优化需要考虑的其他问题。

[转帖]《Linux性能优化实战》笔记(24)—— 动态追踪 DTrace

使用 perf 对系统内核线程进行分析时,内核线程依然还在正常运行中,所以这种方法也被称为动态追踪技术。动态追踪技术通过探针机制来采集内核或者应用程序的运行信息,从而可以不用修改内核和应用程序的代码就获得丰富的信息,帮你分析、定位想要排查的问题。 以往,在排查和调试性能问题时,我们往往需要先为应用程

线上问题排查--进程重启失败,最后发现是忘了cd

# 背景 我前面写了几篇文章,讲c3p0数据库连接池发生了连接泄露,但是随机出现,难以确定根因,最终呢,为了快速解决问题,我是先写了个shell脚本,脚本主要是检测服务的接口访问日志,看看过去的30s内是不是接口几乎都超时了,如果是的话,咱们就重启服务。然后把这个shell加入到了crontab里,

问题排查:nginx的反向代理感觉失效了一样

# 背景 最近,负责基础设施的同事,要对一批测试环境机器进行回收,回收就涉及到应用迁移,问题是整个过程一团乱。比如服务器A上一堆应用要调用服务器B上一堆服务,结果服务器B被回收了,然后服务器A上一堆应用报错。 今天就是负责查一个问题,app上一个头像上传的接口,之前都好好的,不知道怎么就不能访问了,

问题排查:nginx能跑,但是只能跑一会,不能跑多了

# 背景 上周都是查测试环境的问题,比如,我上一篇写的[问题排查:nginx的反向代理感觉失效了一样 ](https://www.cnblogs.com/grey-wolf/p/17655238.html),就是说这个事的。在文章里,最终查到是nginx的全连接队列满了(每个监听端口有个队列,完成三

【问题排查篇】一次业务问题对 ES 的 cardinality 原理探究

小编工作中负责业务的一个服务端系统,使用了 Elasticsearch 服务做数据存储,业务运营人员反馈,用户在使用该产品时发现,用户后台统计的订单笔数和导出的订单笔数不一致!对此进行排查并进行总结

[转帖]K8S 问题排查: cgroup 内存泄露问题 - kmem

K8S 问题排查: cgroup 内存泄露问题 - kmemhttps://www.cnblogs.com/leffss/p/15019898.html 目录 前言 现象 原因 解决方案 方案一 方案二 方案三 验证方式 影响范围 原理解释 kmem 是什么 cgroup 与 kmem 机制 kme

线上FullGC问题排查实践——手把手教你排查线上问题

作者:京东科技 韩国凯 一、问题发现与排查 1.1 找到问题原因 问题起因是我们收到了jdos的容器CPU告警,CPU使用率已经达到104% 观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型,所以此时考虑是FullGC引起的大量CPU占用(之前有类似情况,告知用

ELK日志缺失问题排查-多行日志聚合Logstash配置问题

1. 背景 推荐系统的推荐请求追踪日志,通过ELK收集,方便遇到问题时,可以通过唯一标识sid来复现推荐过程 最近在碰到了几个bad case,需要通过sid来查询推荐日志,但发现部分无法在kibana查询到 2. 分析 推荐日志的整个收集流程如下: flowchart LR 线上机器日志 -->