关于tomcat繁忙线程数获取

超详细的Tomcat性能监控及调优教程!你学废了吗? 一、下载地址 https://tomcat.apache.org/download-80.cgi 二、安装步骤 将安装包 apache-tomcat-8.5.39.tar.gz 上传至服务器 /usr/local 目录下,再执行如下步骤: [root@admin local]# cd /usr/local [root@admin local]# tar -zxvf apache-tomcat-8.5.39.tar.gz // 解压压缩包 [root@admin local]# mv apache- 阅读详情

        在某些情况下,我们需要对tomcat的繁忙线程数进行监控以满足我们队应用服务器状态信息的把控。那么我们该如何通过我们自定义的接口来获得tomcat的繁忙线程数?

        首先,我们应该想到tomcat本身是否为我们提供了类似的方法,博主在实际开发中拜读了一遍tomcat的源码,的确也找到了获取当前服务繁忙线程数的方法。但是它本身并未对外提供,并且使用的时候需要进行一些初始化操作。大家如果有兴趣的话可以下载tomcat源文件,找到org.apache.coyote.http11.AbstractHttp11Processor这个类,在process中有disableKeepAlive这个函数。进入函数查看具体实现



我们可以看到tomcat本事是从线程池中取得活跃数,那么我们也可以通过类似的办法取得tomcat线程池中的活跃数。博主使用的jsp,大家可以对应改为后台代码。

bean来解析线程池

public static class MBeans {

	private final MBeanServer mbeanServer;

	MBeans() {
		this(getPlatformMBeanServer());
	}

	private MBeans(MBeanServer mbeanServer) {
		super();
		this.mbeanServer = mbeanServer;
	}
	static MBeanServer getPlatformMBeanServer() {
		return ManagementFactory.getPlatformMBeanServer();
	}
	Set<ObjectName> getTomcatThreadPools() throws MalformedObjectNameException {
		return mbeanServer.queryNames(new ObjectName("*:type=ThreadPool,*"), null);
	}

	Set<ObjectName> getTomcatGlobalRequestProcessors() throws MalformedObjectNameException {
		return mbeanServer.queryNames(new ObjectName("*:type=GlobalRequestProcessor,*"), null);
	}

	Object getAttribute(ObjectName name, String attribute) throws JMException {
		return mbeanServer.getAttribute(name, attribute);
	}
}

然后用一个方法获取信息,这里可以添加函数获取到其他信息,例如最大连接数等。

public static class TomcatInformations implements Serializable {

	private static final boolean TOMCAT_USED = System.getProperty("catalina.home") != null;

	private static final long serialVersionUID = -6145865427461051370L;

	@SuppressWarnings("all")
	private static final List<ObjectName> THREAD_POOLS = new ArrayList<ObjectName>();
	@SuppressWarnings("all")
	private static final List<ObjectName> GLOBAL_REQUEST_PROCESSORS = new ArrayList<ObjectName>();

	private final String name;
	private final int maxThreads;
	private final int currentThreadCount;
	private static int currentThreadsBusy=0;
	private final long bytesReceived;
	private final long bytesSent;
	private final int requestCount;
	private final int errorCount;
	private final long processingTime;
	private final long maxTime;

	private TomcatInformations(MBeans mBeans, ObjectName threadPool) throws JMException {
		super();
		name = threadPool.getKeyProperty("name");
		maxThreads = (Integer) mBeans.getAttribute(threadPool, "maxThreads");
		currentThreadCount = (Integer) mBeans.getAttribute(threadPool, "currentThreadCount");
		currentThreadsBusy = (Integer) mBeans.getAttribute(threadPool, "currentThreadsBusy");
		ObjectName grp = null;
		for (final ObjectName globalRequestProcessor : GLOBAL_REQUEST_PROCESSORS) {
			if (name.equals(globalRequestProcessor.getKeyProperty("name"))) {
				grp = globalRequestProcessor;
				break;
			}
		}
		if (grp != null) {
			bytesReceived = (Long) mBeans.getAttribute(grp, "bytesReceived");
			bytesSent = (Long) mBeans.getAttribute(grp, "bytesSent");
			requestCount = (Integer) mBeans.getAttribute(grp, "requestCount");
			errorCount = (Integer) mBeans.getAttribute(grp, "errorCount");
			processingTime = (Long) mBeans.getAttribute(grp, "processingTime");
			maxTime = (Long) mBeans.getAttribute(grp, "maxTime");
		} else {
			bytesReceived = 0;
			bytesSent = 0;
			requestCount = 0;
			errorCount = 0;
			processingTime = 0;
			maxTime = 0;
		}
	}

	public static List<TomcatInformations> buildTomcatInformationsList() {
		if (!TOMCAT_USED) {
			return Collections.emptyList();
		}
		try {
			synchronized (THREAD_POOLS) {
				if (THREAD_POOLS.isEmpty() || GLOBAL_REQUEST_PROCESSORS.isEmpty()) {
					initMBeans();
				}
			}
			final MBeans mBeans = new MBeans();
			final List<TomcatInformations> tomcatInformationsList = new ArrayList<TomcatInformations>(
					THREAD_POOLS.size());
			for (final ObjectName threadPool : THREAD_POOLS) {
				tomcatInformationsList.add(new TomcatInformations(mBeans, threadPool));
			}
			return tomcatInformationsList;
		} catch (final InstanceNotFoundException e) {
			return Collections.emptyList();
		} catch (final AttributeNotFoundException e) {
			return Collections.emptyList();
		} catch (final JMException e) {
			throw new IllegalStateException(e);
		}
	}

	private static void initMBeans() throws MalformedObjectNameException {
		final MBeans mBeans = new MBeans();
		THREAD_POOLS.clear();
		GLOBAL_REQUEST_PROCESSORS.clear();
		THREAD_POOLS.addAll(mBeans.getTomcatThreadPools());
		GLOBAL_REQUEST_PROCESSORS.addAll(mBeans.getTomcatGlobalRequestProcessors());
	}

	public static long getCurrentThreadsBusy(){
		buildTomcatInformationsList();
		return currentThreadsBusy;
	}
}

博主经过测试可以得到当前tomcat的活跃(繁忙)线程数,希望可以帮到大家。当然,tomcat也提供了管理功能,在管理功能里面可以根据关键字获得对应的数值。这也是一种获取tomcat繁忙线程数的方式。


聊下并发和Tomcat线程数(错误更正) 本文前半部分结论存在严重错误,请看最后2015-1-20更新部分。   最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s。 服务器性能很好,Tomcat版本是7.0.54,配置如下: &lt;Executor name="tomcatThreadPool" na... 阅读详情

相关推荐

企业AI Agent审计与合规:从日志留存到网络联动的完整落地指南

审计日志是企业安全与合规体系的基石,尤其在AI Agent大规模接入业务后,如何完整记录其行为链成为新的挑战。从日志留存180天到PCI DSS合规要求,审计体系需要覆盖会话、推理、工具调用、数据访问等关键环节,并结合不可篡改的存储设计,确保证据链可信。同时,借鉴上网行为管理设备对应用行为控制审计的思路,以及Kismet被动监测网络流量的方法论,将网络侧审计与应用侧日志交叉验证,能有效发现越权和异常行为。本文从日志采集、全链路追踪、基线预警到多租户隔离,系统梳理了AI Agent审计与合规落地的关键路径,帮

weixin_32234493的博客 264

记一次生产环境tomcat线程数打满情况分析

欢迎使用Markdown编辑器 现象重现 使用grafana监控发现服务某个节点的cur线程数会暴涨直至打满且一直无法回收 原因分析 解决方案与建议

4878

四旋翼滑模控制:从理论到Simulink实现

本文深入探讨了四旋翼滑模控制的理论与Simulink实现,对比了其相较于PID控制在抗干扰和鲁棒性方面的显著优势。文章详细介绍了从精确动力学建模、内外环滑模控制器设计到指令解算的完整流程,并分享了Simulink仿真搭建、参数调试及抗扰性能验证的实战经验,帮助工程师掌握在复杂环境下提升四旋翼稳定性的进阶技能。

weixin_29163581的博客 375

Tomcat 配置详解/优化方案

Service.xml Server.xml配置文件用于对整个容器进行相关的配置。 元素: 是整个配置文件的根元素。表示整个Catalina容器。 属性: className:实现了org.apache.catalina.Server接口的类名,标准实现类是org.apache.catalina.core.StandardServer类。 Port:Tomcat服务器监听用于关闭T

.    于思索中前行 8万+

Paypal开发者中心获取“ClientId”和“ClientSecret”参数

正式环境设置 1、登录到 paypal开发者中心 网址:https://developer.paypal.com/developer/ 点击右上角登录按钮登录 2、左侧栏 - 我的应用程序和凭证 - 点击“创建新应用” 新注册的paypal账号,需要进行邮箱验证,验证通过后,需要等待一段时间(或重新登录),才会出现相关设置项位置 验证邮箱通过后,点击创建新应用 3、按提示填写,保存创建应用 4、点击刚创建的应用进入应用详情页 5、应用详情页获得网站开发人员所需要的“ClientId”和“Client

龚清林的博客 1万+

Arcgis填补栅格空缺值Nodata

Arcgis填补栅格空缺值Nodata

pass17的博客 1万+

prometheus实战使用四种Metrics指标

项目中四种指标的配置,和大家详细分享: 配置项目基本信息参考:参考基本配置 1、springboot 配置四种指标: package com.nandao.demo.config; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.MeterRegistry; import io.micromet

nandao158的博客 5281

mos管结电容等效模型_MOS管的防冲击防反接电路

MOS管的反接和抑制冲击一:原理分析MOS管由于生产工艺等因素,会产生相应的寄生电容,体二极管等。Mos管的寄生电容如图1所示,可以看到其具有三个寄生电容:G和S的电容Cgs;G和D的电容:Cgd,也称为反向传输电容、米勒电容、Crss;D和S的电容Cds。D和S之间的体二极管D1.图 1:MOS管等效模型寄生电容的数值可以从元器件的datasheet中得到,如图2,图3:Ciss(输入电容)=C...

weixin_29179583的博客 1856

tomcat根据繁忙线程数对keepalive进行动态调整

众所周知,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。我们经常所用的tomcat服务器就支持HTTP Keep-Alive。在http1.1中,keepalive默认是开启的。如果需要自定义配置keepalive参数,我们可以在tomcat的server.xml中做如下配置: &lt;Connector...

p312011150的博客 980

Modelsim:LPDDR5仿真(含美光仿真模型官方sv&vcs代码)

虽然,三星在设计跟量产上,早于其他家存储产商,但是镁光后来居上了,是业界首家支持全速 LPDDR5 的供应商,并且开发者在做开发的时候,也是用美光颗粒比较多,所以这里就先以美光的仿真模型为主进行仿真。 本工程为美光官方工程,支持Modelsim、VCS、ncverilog三种仿真器仿真。模型破解过,为完整system-verilog代码。

千歌叹尽执夏的博客 1281

从零实现深度学习框架【实现自己的PyTorch(已完结)】

本着“凡我不能创造的,我就不能理解”的思想,此系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。

日积月累,天道酬勤 6862

详解Tomcat线程池原理及参数释义

tomcat线程池有如下参数: maxThreads, 最大线程数,tomcat能创建来处理请求的最大线程数 maxSpareTHreads,最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若空闲时间大于最大空闲时 间,则回收,小于则继续存活,等待被调度。 minSpareTHreads,最小空闲线程数,无论如何都会存活的最小线程数 acceptCount,最大等待队列数 ,请求并发大于tomcat线程池的处理能力,则被放入等待队列等待被处理。 max...

dhklsl的专栏 2369

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

大模型大数据攻城狮的专栏 1469

Tomcat相关信息含义

一、maxThreads最大线程数二、maxConnections最大连接数三、acceptCount最大排队数(默认值100)acceptCount的经验值的范围为50-300,当tomcat的处理能力不够快的时候,可以调整该值,比较有用。当系统的并发量比较大的时候,关闭keep alive,然后适当调整该值当连接建立之后,经常得不到worker线程处理时,可以适当降低该值,开启keep ali...

mao_xiaoxi的博客 301

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Tomcat(三)——Tomcat的Connector及线程池配置

Connector参数配置 port,端口号。Tomcat默认端口号是8080。 address,配置Connector在监听网络请求时监听在哪一个地址上。在很多服务器上,服务器上的IP是不止一个的,会有很多,如果不配置address的话,默认会在所有的IP上监听请求,有时由于安全上的原因是不被允许的。这时,通过address来指定仅仅监听哪几个地址。 protocol,协议。http1.1,...

Meteor_0723的专栏 2418

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

tomcat并发峰值,JVM参数查看

Servlet:servlet会在调用(http请求)的时候初始化,在构造函数,或者init中打印一句话可以验证而且只有一个实例,所以如果要在servlet中使用成员变量,要处理并发的问题,避免原始类型,使用原子类型。tomcat后台管理系统:前提需配置管理员账号(conf/tomcat-user.xml):&lt;role rolename="manager-gui"/&gt; &lt;role...

nano-dhh 4081

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

zabbix监控tomcat

zabbix-server对java程序的数据采集需要使用java gateway组件 配置zabbix-server的配置文件 zabbix-agent端添加tomcat中的JXM参数 zabbix页面设置 这里使用zabbix自带模板。如果开启了用户认证连接,需要配置宏的值。 这里是刚配好显示的最新数据...

weixin_43847170的博客 1414

tomcat mysql 访问量_如何查找Tomcat目前的并发访问量和mysql的并发操作量

如何查找Tomcat目前的并发访问量和mysql的并发操作量(2010-04-06 09:36:30)标签:ittomcat查看TOMCAT的并发访问量:进入TOMCAT服务管理页面(http://localhost:8080/manager/status),可以看到下面这段文字http-8080 Max threads: 1000 Min spare threads: 0 Max spare t...

weixin_31151281的博客 456

java jmx 监控tomcat_jmx监控之Tomcat

非堆内存 存取代码,方法,类等堆内存 存取程序数据,变量,对象等1、Tomcat versionjmx["Catalina:type=Server",serverInfo] tomcat版本2、th Thread Countjmx["java.lang:type=Threading",ThreadCount] 线程数报警:连续三次最小资大于1000报警3、th Peak Thread ...

weixin_42465158的博客 1613

Tomcat监控

1.监控项 tomcat JVM内存:关注GC回收频率,FullGC次数越少越好 最大线程数:线程池连接数长期大于80%以上,建议优化 数据库连接数:活动连接数长期大于80%以上,建议优化连接池 请求数/请求状态:线程数,线程状态,大量Blokked状态线程可以Dump线程栈信息进行分析 应用服务器架构分析 web应用服务器是互联网应用系统的基础架构软件,通常也称为“中间件”,它负责处...

八块腹肌的猫咪 353

最大线程数和最小线程数

最大线程数和最小线程数

qqnbsp的博客 851

SpringBoot2使用Jetty容器(替换默认Tomcat)

Jetty和tomcat的比较 Tomcat和Jetty都是一种Servlet引擎,他们都支持标准的Servlet规范和JavaEE规范。 架构比较 Jetty的架构比Tomcat的更为简单。 Jetty的架构是基于Handler来实现的,主要的扩展功能都可以用Handler来实现,扩展简单。 Tomcat的架构是基于容器设计的,进行扩展是需要了解Tomcat的整体设计结构,不易扩展。 性能比较 ...

韩超的博客 (hanchao5272) 3354

详解tomcat线程池原理及参数释义

tomcat线程池有如下参数: maxThreads, 最大线程数,tomcat能创建来处理请求的最大线程数 maxSpareTHreads, 最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若空闲时间大于最大空闲时 间,则回收,小于则继续存活,等待被调度。 minSpareTHreads,最小空闲线程数 acceptCount, 最大等待队列数 maxIdleTime, 最大空闲时间,超过这个空闲时间,且线程数大于最小空闲数的,都会被回收

Java高手真经 1万+

浅析tomcat nio 配置

tomcat的运行模式有3种.修改他们的运行模式.3种模式的运行是否成功,可以看他的启动控制台,或者启动日志.或者登录他们的默认页面http://localhost:8080/查看其中的服务器状态。 1)bio 默认的模式,性能非常低下,没有经过任何优化处理和支持. 2)nio 利用java的异步io护理技术,no blocking IO技术. 想运行在该模式下,直接修改se...

java开发指南博客 【转载】 488

查看TOMCAT的运行状况

熟悉J2EE开发的人应该对此不屑一顾吧,俺是Java新手,没办法……做个笔记先。Tomcat 5.5下测试通过。 首先要添加管理员用户。打开 conf/tomcat-users.xml,在其中加入这样一行: 然后重启Tomcat。 之后访问以下地址: http://localhost:8080/manager/status 输入刚才设置好的管理员用户名和密码,就能看到服务器状态的页面

wzhw2008的专栏 9239
上一篇: mysql数据库主从判断
下一篇: java实现文件下载
海之沐
博客等级 码龄12年 1536粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值