系统分析记录-rocketmq导致jvm线程数量大

一 . 系统说明:

A系统阿里云平台,5台集群,每台:1-2核,内存6G,带宽上限2M,磁盘1G。

基于tomcat容器,主要业务消费rocketmq,再pegion(服务治理工具)调用第三方服务。

同时接入20个左右topic的mq,并每一次mq都会调用一次第三方服务,第三方服务有B,C,D等系统,单台mq的qps 有几个(4个)比较大,一小时几十万。其他的比较小。

二. 问题:

5台集群一台的线程数量达到2500+,触发公司线程报警。其他四台也很高(2000+),但是还没到阀值。

三 .初步分析:

1. 调用链

看到线程数量大的这台a机器,调用B系统有多个请求时间到15S(调用超时时间是5S),并有10个左右调用失败,正常的都是1S以下,但是B系统的日志显示所有请求都是1S以下返回的。目前没有思路。

2. threaddump

2.1 活跃线程:

226个running Threads,194 个 "New I/O worker": running, holding...",活跃线程大部分是在epoolwait,应该是等着接收mq消息。

2.2 全部线程:

1900+个线程都在线程池里空闲着,等待任务来执行。

大致是:ConsumeMessageThread_X  有275个,NettyClientPublicExecutor_X 1024个,600+ 个线程池模样线程(pool-XX-thread-XXX)。

分析下 :

(1)ConsumeMessageThread_X  是rocketmq的消费线程,epoolwait中,所以ConsumeMessageThread_X 也在等待。

数量上参考下rocketmq源码,在:

         有20个客户端,所以基本也是这个数量,这里最小需要20个线程吗?有些mq真的qps超级小。包装消费类时可以在start方法前面,set这两个值。并对外提供配置方式。

(2)NettyClientPublicExecutor_X,NettyRemoteingClient.java :这个线程是client做回调用的。

private int clientCallbackExecutorThreads = Runtime.getRuntime().availableProcessors();

所以应该是 可用processor有64个

 这部分应该是云服务器的 物理服务器可用核太多,导致新建了很多无用的线程,其实这部分线程只做callback使用,数量应该也可以开发可配置。

(3)pool-XX-thread-XXX

有5(7,21,22,15,28)个线程池,每个线程池100+个线程,都是线程池里的线程空闲。

这部分需要看下pegion的代码,惊奇地发现pegion这部分跟dubbo一样,近似看下开源的dubbo的代码

大意就是各种threadpool用这个factory来生成线程,线程越来越多。没有源码很难看懂,从数量看也不是特别多,具体再分析。

遗留问题:

rocketmq不常用线程数量可以配置等方式减少下

dubbo pegion线程池数量等有场景再分析下

dubbo个别服务调用时间长,这个目前还没有思路。

原文地址:https://www.cnblogs.com/thinkqin/p/11794028.html

时间: 2024-11-06 11:50:26

系统分析记录-rocketmq导致jvm线程数量大的相关文章

jvm 线程数量

Java虚拟机能够管理的线程数量有限,不加控制的创建新线程可能会导致Java虚拟机崩溃. JVM中可以生成的最大数量由JVM的堆内存大小.Thread的Stack内存大小.系统最大可创建的线程数量(Java线程的实现是基于底层系统的线程机制来实现的,Windows下_beginthreadex,Linux下pthread_create)三个方面影响. AD: 最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端.对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试

Thread 线程池中可用的线程数量

GetAvaliableThread(out workerThreadCount,out iocompletedThreadCount)   函数居然一次返回了两个变量.线程池里的线程按照公用被分成了两大类:工作线程和IO线程,或者IO完成线程,前者用于执行普通的操作,后者专用于异步IO,比如文件和网络请求,注意,分类并不说明两种线程本身有差别,线程就是线程,是一种执行单元,从本质上来讲都是一样的,线程池这样分类 Thread 线程池中可用的线程数量

存储过程不返回记录集导致ADO程序出错

HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF()       {return m_pRecordset->adoEOF == VARIANT_TRUE;}; m_pRecordset->adoEOF 将执行下面的函数(见msado15.tli) 1    inline VARIANT_BOOL Recordset15::GetadoEOF (

Java并发程序设计(6)线程池之线程数量的控制

1.1. ExecutorService ExecutorService是线程池的接口. Executors是用于创建不同线程池的工具类. 1.2. 线程数量固定的线程池 ExecutorService executorService = Executors.newFixedThreadPool(2); for(int j=0;j<10;j++){ final int t = j; executorService.execute( new Runnable(){ @Override public

[小细节,大BUG]记录一些小问题引起的大BUG(长期更新....)

[小细节,大BUG]  1. 在不久前,一个朋友出现了这样一个BUG:当UITableView加载cell的时候,自定义的cell,怎么显示,里面的文字总是显示不完全(注意,文字不长).然后,我帮忙给看了下,甚至把在storyBoard中将cell的相关属性都试了下,虽然可以解决,但是效果不理想.最终经过排查,终于发现问题所在:当自定义cell时,因为需要布局子控件,所以他重写了layoutSubviews方法,然而在此方法中没有调用[super layoutSubviews],所以造成了布局混

多线程使用时,线程数量设置

多线程数量设定 1         Web应用中使用多线程的情况有几种: 1.1         一个线程为快速响应请求,把一些其他业务操作让线程来做,而本线程测快速继续. 1.2         一些业务需要统一处理,用一些线程单独来做. 1.3         …想不出来在web应用中会有什么其他场景. 2         在用到多线程时,一般要启动几个线程来循环做,至于启动几个线程,则是根据统一类型任务的数量和频率,就是说平均一秒内有多少个任务等待执行. 2.1         如果任务很

线程的学习-1,控制线程数量,模仿的

学会了控制线程数量,目前感觉使用c#5.0的新特性灵活性不如之前的线程使用,所以不是很喜欢用新特性,不过也可能是我还没熟悉,等以后熟悉清楚了,再评价好不好,今天先搞一搞控制线程数量 public class TaskTest { public void Test() { List<Task> list = new List<Task>(); TaskFactory taskFactory = new TaskFactory(); for (int i = 0; i < 100

List的设置值,跟变量的位置关系(变量范围的变化导致结果差别很大)

我们想要的结果是: [RegnTypeCharge: null,null,null,null,1,null,null,null,null,null,null,null,null,null,null,][RegnTypeCharge: null,null,null,null,hehe,null,null,null,null,null,null,null,null,null,null,]com.[email protected]addbf1com.[email protected]42e816 需要

线程系列09,线程的等待、通知,以及手动控制线程数量

当一个线程直到收到另一个线程的通知才执行相关的动作,这时候,就可以考虑使用"事件等待句柄(Event Wait Handles)".使用"事件等待句柄"主要用到3个类: AutoResetEvent, ManualResetEvent以及CountdownEvent(.NET 4.0以后才有).本篇包括: ※ 一个线程等待另一个线程的通知※ 2个线程互相通知等待※ 一个线程等待队列中的多个任务通知※ 手动控制线程的数量 □ 一个线程等待另一个线程的通知 最简单的情景