使用jstack解决线程爆满问题

news2024/9/20 14:23:48
    • 问题发现

生产应用现存在问题,影响到系统的使用,前端页面只配置了35个派生指标,后台任务生成20000多线程任务,占用了全部资源,导致其他系统也没资源可用,指标工厂也无法进一步使用,今天上午发的死锁也应该是这个原因引起的,在配置初期没有存在死锁的问题,派生指标配置的越来越多,后面配置的派生指标出现死锁的问题也越来越多,现在有5台机器,都已经快到机器的极限值,从前台配置和后台生成任务的比例来看,现在的代码应该是存在bug,或者在任务架构方面需要修改。

其中一台机器线程查询如下:

查看用户进程

[bdpcloud@host167 da]$ ps -u bdpcloud -L | wc -l

5348

统计RUNNABLE线程数量

[bdpcloud@host167 da]$ jstack 319012 > thread.txt

[bdpcloud@host167 da]$ grep RUNNABLE thread.txt | wc -l

92

    • 现场日志提取

使用jstack命令提取线程日志,命令是:jstack PID

[nmportal@hhhtsjzx-app04-1-2 bin]$ /opt/nmportal/jdk1.8/bin/jstack 2625 > a.txt

2023-01-18 16:26:13

Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):

"Attach Listener" #4493 daemon prio=9 os_prio=0 tid=0x00007fb3b81b9000 nid=0x5623 waiting on condition [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

"I/O dispatcher 4016" #4481 prio=5 os_prio=0 tid=0x00007fb32c51a000 nid=0x1896 runnable [0x00007fb0e0e65000]

java.lang.Thread.State: RUNNABLE

at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)

at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)

at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)

at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)

- locked <0x00000000a3901d98> (a sun.nio.ch.Util$3)

- locked <0x00000000a3901d88> (a java.util.Collections$UnmodifiableSet)

- locked <0x00000000a3901da8> (a sun.nio.ch.EPollSelectorImpl)

at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)

at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:255)

at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)

at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)

at java.lang.Thread.run(Thread.java:748)

经过统计,类似于这个线程为RUNNABLE状态的,多达8588个,基本上确定是应用代码存在问题

    • 问题排查过程

既然定位到是代码创建线程的问题,那就候找到这个代码是哪里创建的,看了一下这个报错日志,报错的类不是jdk自带的就是框架自带的,日志信息量小,感觉无从下手。我们先找到日志里面的报错信息,看报错涉及的类AbstractMultiworkerIOReactor和线程名称I/O dispatcher,还好这个写了线程的名称,我们根据类名和线程的名称找到到了代码创建的位置

但是这个也并没有什么用,无法根据这些信息查找到是创建的源头是我们的哪里的代码问题,再看一下AbstractMultiworkerIOReactor这个类,去百度搜索一下,查看一下相关信息,从某种关系来说,和httpasynclient有着某种关系,找不到关系,也只能边找百度,边尝试猜测是哪里引用了,也许是运气比较好,查找第一个类就定位到问题所在了。

我们查看代码,搜一下哪里使用了httpsyn类似的方法或者类

最终找到一个可疑的地方,在创建AsyncRestTemplate的时候,用了 @Scope("prototype"),即原型,就是多例的意思,而问题在于这个AsyncRestTemplate里面,每次都会创建一个AsyncRestTemplate都会创建一个新的HttpComponentsAsyncClientHttpRequestFactory,而这个线程池并不会关闭,所以调用了这个同步的方法,就会创建越来越多的线程。把这个 @Scope("prototype")去掉即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/177875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Email Signature Manager 9.3 Crack

概述 Email Signature Manager为所有用户创建和部署电子邮件签名 包括合并的联系方式、公司徽标、社交媒体图标 和链接&#xff0c;甚至个性化内容&#xff0c;如用户照片 创建和附加电子邮件活动&#xff0c;向所有人介绍奖项&#xff0c; 活动或促销&#xff0c;或设置运行的…

基于STM32的FreeRTOS开发(1)----FreeRTOS简介

为什么使用freertos FreeRTOS 是一个免费和开源的实时操作系统&#xff0c;它主要用于嵌入式系统。它非常轻量级&#xff0c;可以在很小的硬件资源上运行&#xff0c;因此非常适合在限制硬件资源的嵌入式系统中使用。 FreeRTOS提供了一组简单的任务管理功能&#xff0c;可以让…

基于Springboot vue前后端分离在线培训考试系统源码

# 云帆培训考试系统 管理账号&#xff1a;admin/admin 学员账号&#xff1a;person/person # 介绍 一款多角色在线培训考试系统&#xff0c;系统集成了用户管理、角色管理、部门管理、题库管理、试题管理、试题导入导出、考试管理、在线考试、错题训练等功能&#xff0c;考…

C++:运算符重载与类的赋值运算符重载函数

目录 章节知识架构 一.运算符重载 1. 运算符重载的基本概念 代码段1 2.关于运算符重载的重要语法细则 二.运算符重载在类中的使用 三.类的默认成员函数&#xff1a;重载函数(赋值运算符重载) 1.自定义重载函数 代码段2 2.编译器默认生成的重载函数 四.前置(--)和后置…

Facebook小组与主页:哪个更适合SEO?

在 SEO中&#xff0c;对于优化人员来说有两种策略&#xff1a;一种是在 Facebook组上投放广告&#xff1b;另一种则是在主页上投放广告。那么&#xff0c;这两种策略哪种更好呢&#xff1f;对于 SEO来说又有什么影响呢&#xff1f;如果你已经在 Facebook上进行了一些优化工作&a…

Python---文件操作

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 文件操作思维导图前言文件是什么文件路径文件操…

SpringBoot基础回顾:场景启动器

上一章我们回顾了 SpringBoot 的自动装配&#xff0c;以及承载自动装配的核心——自动配置类。自动配置类的定义位置通常在每个场景的 jar 包中&#xff0c;配置 spring.factories 文件中 EnableAutoConfiguration 的位置通常在相应的 autoconfigure jar 包下。本章会着重回顾和…

SpringMVC简介

SpringMVC简介什么是MVC?MVC的工作流程什么是SpringMVC&#xff1f;HelloWorld创建maven工程配置web.xml创建请求控制器配置springMVC.xml配置文件什么是MVC? MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的javaBean,作用是是处理数…

恶意代码分析实战 9 隐蔽的恶意代码启动

9.1 Lab12-1 分析 查看程序的导入函数。 通过这几个函数&#xff0c;可以推断出是远程线程注入。 使用ProMon检测&#xff0c;并没有看到什么有用的信息。 使用Proexproer检查。 也没有什么有用的信息。 拖入IDA中分析一下。 将这几个字符串重命名&#xff0c;便于识别。 …

【MyBatis】| MyBatis使用⼩技巧

目录 一&#xff1a;MyBatis使用⼩技巧 1. #{}和${} 2. typeAliases 3. mappers 4. IDEA配置⽂件模板 5. 插⼊数据时获取⾃动⽣成的主键 一&#xff1a;MyBatis使用⼩技巧 1. #{}和${} #{}&#xff1a;先编译sql语句&#xff0c;再给占位符传值&#xff0c;底层是Prepar…

【C语言进阶】一文带你学会C语言文件操作

前言 我们前面学习结构体时&#xff0c;写了通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增加、删除数据&#xff0c;此时数据是存放在内存中&#xff0c;当程序退出的时候&#xff0c;通讯录中的数据自然就不存在了&#xff0c;等下次运行通讯录…

Python---自动生成二维码

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 自动生成二维码 二维码的本质上&#xff0c;就…

人工智能学习06--pytorch05--torchvision中的数据集使用DataLoader的使用

torchvision中的数据集使用 test_set的class属性 把数据集每一部分都变成tensor类型 现在输出的就是tensor数据类型了 DataLoader的使用 batch_size 一摞牌中&#xff0c;每次抓几张shuffle 打乱&#xff0c;第二次打牌前&#xff0c;牌的顺序要跟第一次不一样&#xff0…

【JavaSE】一文看懂构造器/构造方法(Cunstructor)

&#x1f331;博主简介&#xff1a;大一计科生&#xff0c;努力学习Java中!热爱写博客~预备程序媛 &#x1f4dc;所属专栏&#xff1a;Java冒险记【从小白到大佬之路】 ✈往期博文回顾: 【JavaSE】保姆级教程|1万字10张图学会类与对象–建议收藏 &#x1f575;️‍♂️近期目标…

CSS边框、边距、轮廓(边框宽度/颜色/各边/简写属性/圆角边框/内外边距/高度宽度/框模型/轮廓宽度/颜色/属性/偏移)——万字长文|一文搞懂

目录 CSS边框 CSS 边框属性 CSS 边框样式 实例 CSS 边框宽度 实例 特定边的宽度 实例 CSS 边框颜色 实例 特定边框的颜色 实例 HEX 值 实例 RGB 值 实例 HSL 值 实例 CSS 边框 - 单独的边 实例 不同的边框样式 实例 它的工作原理是这样的&#xff1a; …

ROS学习寄录1

1 创建ROS工作空间 1.1 创建工作空间 &#xff08;1&#xff09;创建工作空间 mkdir catkin_ws &#xff08;2&#xff09;进入catkin_ws文件夹&#xff0c;然后创建一个src文件夹 cd catkin_ws mkdir src &#xff08;3&#xff09;进入src文件夹&#xff0c;生成CMakeL…

「自控原理」4.2 根轨迹法分析与校正

本节介绍利用根轨迹法分析系统性能发热方法 本节介绍根轨迹校正 文章目录利用根轨迹分析系统性能主导极点法增加零极点对系统的影响根轨迹校正串连超前校正原理与步骤超前校正例题串连滞后校正附加开环偶极子的作用原理与步骤滞后校正例题利用根轨迹分析系统性能 利用根轨迹分…

Oracle cloud vps实例配置访问

Oracle cloud vps实例配置访问创建一个免费配置的实例&#xff0c;并配置访问创建实例时&#xff0c;系统映像选择创建实例时候的ssh密钥配置子网&#xff0c;打开22端口使用工具登录服务器配置多个公钥&#xff0c;支持多个ssh私钥来登录登录vps实例修改登录用户和身份验证方式…

【接口】接口超时原因分析

接口超时的原因&#xff1a; 一、网络抖动 有可能是你的网络出现抖动、网页请求API接口、接口返回数据给网页丢包了。 二、被带宽占满 用户量暴增&#xff0c;服务器网络带宽被占满。 服务器带宽&#xff1a;一定时间内传输数据的大小&#xff0c;如&#xff1a;1s传输10M…

剑指Offer 第1天

第 1 天 栈与队列&#xff08;简单&#xff09; 剑指 Offer 09. 用两个栈实现队列 class CQueue { public: CQueue() {} void appendTail(int value) { s1.push(value); } int deleteHead() { while(!s1.empty()) { …