3

Tomcat 6 的 MBeanCatalina:type=GlobalRequestProcessor,name=http-0.0.0.0-8080对属性的意义是什么processingTime

据我了解,这意味着自启动以来特定连接器的处理时间(以毫秒为单位)。但是当我每分钟测量一次这个值时,我偶尔会得到比 60k 大得多的值(即,我得到的 delta 值高达 1000k)。

我的问题是,测量的毫秒数。实时还是 CPU 时间?所有连接器线程的处理时间累计?

什么是监控的良好阈值processingTime

4

1 回答 1

4

查看代码,这是处理每个传入请求所需的挂钟经过时间的累积毫秒数。System.currentTimeMillis()因此,对于始终忙碌的单个 http 连接器线程(在具有稳定系统时钟的系统上)的此测量值的增量不应超过每分钟 60,000。但是,对于GlobalRequestProcessor,它的增长速度可能比这要快得多,具体取决于正在处理的并发请求数。

如果在给定的一分钟内,您在一秒钟内收到 100 个满足的请求,另外 100 个在返回值之前阻塞 10 秒的请求,则该计数器GlobalRequestProcessor将在该分钟内增加 100x1x1000 + 100x10x1000 = 1,100,000。

请注意,由于这会测量挂钟经过的时间,因此如果您的服务器上的时钟向前跳,它将导致您错误地获得经过时间的大值。也就是说,如果在给定 servlet 的处理过程中时间向前跳了一分钟,并且 servlet 用了 20 秒来处理请求,那么这个度量将告诉您 servlet 用了 80 秒来处理请求。如果您在 DST“Spring Forward”发生时碰巧有一个实时请求,那么您将被告知该请求花费了一个多小时,这意味着此 JMX 测量将增加一个多小时。对于我查看的版本,如果时钟向后跳,您最终可以递减这个计数器!希望 Tomcat 6System.nanoTime()能够避免这种对系统时钟稳定性的依赖。

在 Java 1.5 之前,没有一种很好的方法来测量真实的经过时间(与经过的挂钟时间相反)。由于 Tomcat 6.x 和更早版本都不需要 Java 5 或更高版本,因此它们实际上没有办法测量毫秒以外的任何东西,或者测量与时钟变化无关的真实经过时间。(除非使用反射来做到这一点。我没有注意到,但我也没有搜索过。)

于 2012-03-01T03:53:28.477 回答