Tomcat零星延迟

时间:2013-02-21 16:44:17

标签: java performance tomcat tomcat6 low-latency

我一直在微观优化我们在Tomcat上的页面响应时间,几乎在所有情况下,如果我一遍又一遍地刷新,我会看到 50ms 的响应时间但如果页面没有被点击一两秒钟的响应时间会跳回到 500ms

无论本地,非本地,APR,NIO,JIO,静态或动态响应(即提供静态文件或动态处理响应),我都看到过相同的行为。到目前为止,我还没有看到这种行为在Tomcat上发生(无论频率如何,都是400ms的一致)。

我也使用Visual VM查看是否有任何线索。

我认为它有点活着,但是当我运行Apache Bench时,我的响应时间更快(超过50毫秒)(显然是因为它频繁地击中它)。

那么如何在Tomcat中保留低延迟不频繁命中的URL?也许这个问题对ServerFault更好?

更新:我几乎肯定是Tomcat 6问题。我以为我已经在Tomcat 7上进行了测试,但我刚刚对它进行了测试并且没有问题(见下面的结果)。即使是最新的Tomcat 6仍然存在这个问题。

以下是Tomcat 6的ab输出(注意最大值):

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    14   39  45.2     30     314
Waiting:       14   38  45.2     30     314
Total:         14   39  45.2     30     314

这是Tomcat 7的ab输出通知最大值:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    25   38   8.8     37      67
Waiting:       25   37   8.7     36      66
Total:         25   38   8.8     37      67

Tomcat版本是唯一的区别(相同的机器,相同的JDK等...)。 我确信最新的Tomcat 6会很好但是在第一次请求时它有类似的延迟。

1 个答案:

答案 0 :(得分:1)

偷看tomcat代码我决定在理论上搜索“弱”这个词,你的问题是当你没有快速重新请求时,会收集弱引用中的某些东西。

我想出了以下猜测......我找到了这个有趣的课程:

http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/javax/el/BeanELResolver.java?revision=1027187&view=markup

似乎维护了BeanProperties对象的缓存,其中一部分由WeakHashMap处理,每当缓存填满时,所有内容都放在WeakHashMap中,并且可以进行垃圾收集。如果请求弱地图中的项目,则将它们放回主地图中(这不是弱点)。如果您的页面在处理结束时突然发生此行为(通过添加类似BeanProperties中缓存大小的内容,您最终可能会丢弃几乎所有缓存的bean描述。

方便地调整此属性:

private static final String CACHE_SIZE_PROP =
    "org.apache.el.BeanELResolver.CACHE_SIZE";

所以也许尝试使用它,看看它是否会影响行为?然而,这可能不是它,因为我在Tomcat 7中没有看到这个类中的大变化(快速查看),你说你的问题消失了。 (您之前的调整工作中是否一直在调整此属性?)