测量Tomcat排队请求的数量

16

使用Tomcat,您可以设置acceptCount值(默认为100),这意味着当所有工作线程都忙时,新连接将被放置在队列中(直到队列已满,此后它们将被拒绝)。

我想要的是监视此队列中项目的大小 - 但我无法确定是否有一种通过JMX获取它的方法(即不是队列最大大小 - 那只是配置,而是当前项目数量在队列中)。

欢迎任何想法。

Tomcat的配置:http://tomcat.apache.org/tomcat-6.0-doc/config/http.html(搜索“acceptCount”)

2个回答

12

根据邮件列表上的线程Charles的回复,没有这样的JMX存在。

Chuck说:“请注意,由于接受队列是由操作系统的通信堆栈维护的,因此Tomcat看不到它。”

David说:"不幸的是,由于Tomcat对接受队列中的请求一无所知,..."

没有办法获取此信息(接受队列中有多少请求?)吗?

没有,接受队列完全不可见。只有通信堆栈知道其中的内容,并且我不知道任何可以排队内容的API,因为内容尚未接收,只有连接请求。

根据您实际的问题(即测量Tomcat尚未开始处理的接受队列中的请求),如果您正在寻找“限流解决方案”,请参阅同一线程的后续讨论


有趣,我就猜到了。我知道使用Jetty可以将请求排队(这听起来像是ML上某些人提出的解决方案之一),但这似乎与Tomcat目前的做法有些不同。 - Michael Neale
@Michael:我对你的使用情况很感兴趣。你想要过滤掉某些URL模式或者优先考虑某些servlet吗?也就是说,为什么有人想要监视挂起的请求呢? - JoseK
实际上,我更感兴趣的是服务器整体“负载”指标 - 即触发监视器事件。 - Michael Neale
1
如果我没记错,Jetty 可以排队请求(即以可衡量的方式进行处理),这就是激发我兴趣的原因——看看 Tomcat 是否也有类似的功能(我不知道这是否是个好主意,只是好奇!) - Michael Neale
3
换个角度思考—— 接受队列本身就是当没有更多的工作线程可用时的备份解决方案。 监控可用的工作线程并在长时间没有可用工作线程时生成警报要比仅使用接受队列更有用。 这意味着服务器无法处理负载。 - rustyx

7

无法监视接受队列,但您可以使用Executor获取Tomcat排队请求的数量。

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="20" minSpareThreads="10" maxQueueSize="30" />
<Connector port="8080" protocol="HTTP/1.1" executor="tomcatThreadPool" connectionTimeout="20000" redirectPort="8443" maxConnections="50" />

配置 maxThreads="20" 表示线程池最多有20个工作线程,可以同时处理20个请求。

maxQueueSize="30" 表示线程池可以最多排队30个未处理的请求。因此,您可以通过 JMX 监控队列大小属性,获得排队请求的数量。

但默认情况下,线程池队列将不会持有任何请求,因为 maxConnections 的默认值是 maxThreads 的值,这意味着当所有工作线程都忙碌时,新请求将在接受队列中排队。

通过设置 maxConnections="50",Tomcat 可以接受比 maxThreads(20) 更多的请求。在上面的示例中,Executor 线程池可以处理20个请求,额外的30个请求将保留在线程池队列中,更多的请求将进入接受队列排队。

因此,现在您可以通过 MBean 'Catalina:type=Executor,name=tomcatThreadPool' 和属性名称 'queueSize' 监视线程池中排队的请求数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接