8

我一直在对 Tomcat 上的页面响应时间进行微优化,并且在几乎所有情况下,如果我一遍又一遍地刷新,我会看到50 毫秒的响应时间,但如果页面在一两秒内没有被点击,响应时间就会回升到500 毫秒

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

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

我认为这是某种保持活力,但是当我运行 Apache Bench 时,我得到了更快的响应时间(低于 50 毫秒)(显然是因为它经常点击它)。

那么如何在 Tomcat 中保持低延迟不经常点击的 URL?也许这个问题更适合ServerFault?

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

这是abTomcat 6 的输出(注意最大值):

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

这是abTomcat 7 的输出,请注意最大值:

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 会很好,但它在第一次请求时有类似的延迟。

4

1 回答 1

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 的这个类中没有看到很大的变化(快速查看),你说你的问题消失了。(您在之前的调优工作中是否一直在调整此属性?)

于 2013-03-09T03:19:05.380 回答