Tomcat监控技术咨询:连接数、线程数与活跃会话数疑问
问题1:连接数远多于线程数的原因,以及三个指标的正确解读
先把这三个指标的本质说清楚,搞懂了它们统计的是什么,问题的答案就一目了然了:
currentThreadCount:Tomcat线程池的总线程数,包括正在干活的忙碌线程和等着接活的空闲线程。线程池是有上限的(默认200,可通过maxThreads配置),它直接决定了Tomcat同时处理请求的最大能力。currentThreadBusy:线程池里正在处理请求的线程数量,这个数是Tomcat当前负载的直接体现——数值越高,说明忙的线程越多,要是快追上currentThreadCount了,那新请求就得排队等着了。connectionCount:Tomcat连接器(比如常用的HTTP/1.1连接器)统计的当前所有处于打开状态的TCP连接数,这里面分两种:- 正在被线程处理请求的活跃连接;
- 处于**Keep-Alive(长连接)**状态的空闲连接——这类连接已经处理完上一个请求,但因为和客户端约定了保持连接一段时间(默认20秒,可通过
keepAliveTimeout调整),所以还没关闭,等着客户端发下一个请求。
为啥连接数会比线程数多那么多?
最核心的原因就是HTTP长连接的存在:
- 一个线程可以先后处理同一个长连接上的多个请求,不用每个请求都新建线程;
- 请求处理完后,长连接不会立刻关闭,会在服务器端留一会儿,这段时间里它依然算在
connectionCount里,但不会占用线程(线程已经回到池里待命了)。 - 如果你的生产环境里客户端(浏览器、APP、前端网关)都开了长连接,那随着请求越来越多,会攒下大量空闲的长连接,自然就会出现连接数远大于线程数的情况。
另外还有个可能:如果你的Tomcat开了多个连接器(比如同时有HTTP和HTTPS端口),connectionCount可能是所有连接器的连接数总和,而线程池要是每个连接器单独配置的,那线程数是单个池的大小,总和也会超过线程数。
问题2:
connectionCount和activeSessions的关联,以及数值不匹配的疑问 先明确这俩指标的根本区别,别搞混了:
connectionCount:是TCP层面的连接统计,属于Tomcat连接器的全局指标,跟具体哪个Web应用没关系;Manager/localhost/myapp/activeSessions:是Web应用层面的会话统计,指的是myapp这个应用里当前处于活跃状态的HttpSession数量——也就是用户访问应用时创建的会话实例,这些会话会在超时(默认30分钟)后被销毁。
二者的关联
它们之间没有严格的一一对应关系,但有间接联系:
- 一个活跃会话可能对应多个连接:比如用户开了同一个应用的3个标签页,每个标签页都建了长连接,这些连接都关联同一个用户会话;或者用户在会话有效期内多次发请求,每次用不同的长连接(或者新建连接)。
- 一个连接对应多个会话?这种情况很少见,但理论上存在:比如代理服务器的连接池复用了一个连接,不同的请求带着不同的Session ID,就会对应不同的活跃会话,但生产中这种场景不多。
- 很多连接根本不对应活跃会话:比如用户关了浏览器,但会话还没到超时时间(依然算活跃),但对应的长连接已经关了;或者用户离开后,长连接还在Keep-Alive超时时间内,但会话已经超时销毁了。
你的场景:活跃会话1125,二者是否相关?
当然可能相关,但数值上没必要匹配。举几个例子:
- 如果每个活跃用户平均开3个标签页,每个标签页保持1个长连接,那
connectionCount可能就有3000+,远高于1125; - 如果很多用户打开应用后没操作,会话还活跃,但长连接已经关了,那
connectionCount可能比1125还低; - 还有可能存在大量爬虫、网关的空闲长连接,这些连接根本没对应的用户会话,也会拉高
connectionCount。
所以完全不用纠结二者数值对不对得上,它们统计的是完全不同层面的东西——一个是TCP连接,一个是应用层的用户会话,概念上没重叠,不存在误解,各自理解清楚含义就行。
内容的提问来源于stack exchange,提问作者Alexandre Ferreira
相关产品推荐
相关产品推荐

