2013-02-21 81 views
8

我一直在微型優化我們在Tomcat上的頁面響應時間,並且在幾乎所有情況下,我都會看到響應時間爲50ms如果我一遍又一遍刷新,但是如果頁面沒有一秒鐘或兩個響應時間跳回500msTomcat零星等待時間

我已經看到了與本地,非本地,APR,NIO,JIO,靜態或動態響應(即服務靜態文件或動態響應響應)相同的行爲。到目前爲止,我還沒有看到這種行爲而不是發生在Tomcat上(即無論頻率如何都是一致的子400ms)。

我已經使用Visual VM來查看是否有任何線索。

我認爲這是某種活生生的,但是當我運行Apache Bench時,我的響應時間甚至更快(顯然是因爲它頻繁響應)。

那麼如何在Tomcat中保持低延遲而不是頻繁命中URL呢?也許這個問題對於ServerFault更好?

更新:我幾乎肯定它的Tomcat 6問題。我以爲我在Tomcat 7上進行過測試,但我只是再次測試過,沒有問題(請參閱下面的結果)。即使是最新的Tomcat 6仍然存在這個問題。

這裏是ab輸出爲Tomcat 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 

這裏是ab輸出爲Tomcat 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會很好,但它在首次請求時會有類似的延遲。

+0

這真的取決於你的請求在做什麼我會這麼想。你只是抓取一個.html文件,或者你正在初始化某種數據服務等。 – aglassman 2013-02-21 16:53:49

+0

你使用openjdk嗎?當我交換到Oracle JDK時,我遇到了一些奇怪的問題。 – Jaydee 2013-02-21 16:57:47

+0

也許有某種全GC'停止世界'...你檢查垃圾收集器輸出(詳細GC)? – home 2013-02-21 17:03:57

回答

1

在tomcat代碼中偷看我決定搜索「Weak」這個詞,理論上你的問題是當你沒有很快重新請求時收集的是一個弱引用中的內容。

我想出了以下猜測...我發現這個有趣的類別:

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你說你的問題消失了。(你在之前的調整工作中是否調整了這個屬性?)