4

我正在編寫基準測試工具以針對Web應用程序運行。我面臨的問題是,對服務器的第一次請求總是比後續請求花費更長的時間。 我遇到了這個問題與Apache的HTTP客戶端3.x,4.x和Google http client。 apache http client 4.x顯示出最大的區別(第一次請求比後續時間大7倍,對於Google和3.x,它大約延長了3倍)Java - 首先向特定主機發送http請求的速度明顯較慢

我的工具必須能夠對同時發生的請求進行基準測試我不能使用例如HttpClient的一個實例並從所有線程中調用它,因爲這會引發一個Concurrent異常,因此我必須在每個線程中使用一個單獨的實例,它將只執行一個請求。我認爲這不是由於服務器上的緩存機制造成的,因爲a)考慮中的webapp沒有使用任何緩存(據我所知)和b )這個效果在第一次重放時也是可見的查詢www.hostxy.com和www.hostxy.com/my/webapp。

我分別在調用client.execute(get)get.execute()之前和之後立即使用System.nanoTime()。

有沒有人有這種行爲源於何處?這些httpclient本身是否執行任何緩存?我會非常感謝任何提示。

回答

0

閱讀:http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html用於連接池。

您的第一次連接可能需要最長的時間,因爲它的Connect:keep-alive連接,因此一旦連接建立後,可以重新使用該連接。這只是猜測

+0

我試着禁用保持活着,但我不知道我是否成功。不過,如果我在後續請求之間等待25秒,也會發生差異 - 此時應該發生保持活動超時,不應該嗎?我也不明白爲什麼apache http客戶端4.x需要比3.x – feob

+0

嗯。如果我是你,我會掏出Wireshark,看看線路上發生了什麼。另外,請閱讀有關HttpClient的PoolingClientConnectionManager。這可能會給你一個關於如何完全避免這個問題的想法 –

0

服務器啓動後你第一次打到JSP嗎?如果服務器在每次啓動時刷新它的工作目錄,那麼首先打開JSP編譯並且需要很長時間。

對第一個事務也做了如下處理:如果事務使用ca cert信任存儲,它將被加載並緩存。

0

如果你的問題是,「第一個HTTP請求特定的主機顯著慢」,此症狀的可能原因是在服務器上,而你所關心的客戶。

如果您要調用的「特定主機」是Google App Engine應用程序(或任何其他雲平臺),那麼通常情況下第一次調用該應用程序會讓您多等一會。這是因爲Google在閒置狀態下將其置於休眠狀態。

最近一次調用(通常需要更長的響應時間)之後,隨後的調用響應速度更快,因爲服務器實例都處於喚醒狀態。

看看這個: Google App Engine Application Extremely slow

我希望它可以幫助你,祝你好運!