测量 tomcat 的排队请求数

2022-09-03 06:47:09

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

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

任何想法都值得赞赏。

Config for tomcat: http://tomcat.apache.org/tomcat-6.0-doc/config/http.html (搜索 “acceptCount”)


答案 1

邮件列表上的这个帖子Charles的回复表明不存在这样的JMX。

引用Chuck的话:“请注意,接受队列对Tomcat不可见,因为它是由操作系统的comm堆栈维护的。

引用David的话:“不幸的是,由于Tomcat对接受队列中的请求一无所知,....”

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

否,接受队列是完全不可见的。只有通信堆栈知道有关它的任何事情,并且我所知道的没有API来对内容进行排队 - 因为内容尚未收到,只有连接请求。

根据你真正的问题是什么(即测量Tomcat尚未开始处理的接受队列中的请求),如果你正在寻找一个“限制解决方案”,请参阅同一线程上的后续工作


答案 2

无法监视接受队列,但您可以使用 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 监视 queueSize 属性,以获取排队请求的数量。

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

通过设置 maxConnections=“50”,tomcat 可以接受比 maxThreads(20) 更多的请求。在上面的示例中,执行器线程池可以处理 20 个请求,额外的 30 个请求将保留在线程池队列中,任何更多的请求将进一步在接受队列中排队。

因此,现在您可以使用 MBean 'Catalina:type=Executor,name=tomcatThreadPool' 和属性名称 'queueSize' 来监控 threadpool 中排队的请求数。


推荐