2012-04-29 58 views
6

我提高了很多我的代碼現在所有的API跑的真快,我還添加了內存緩存和我有一個偉大的命中率.. 但有時我得到無意義的延遲。谷歌App Engine的怪延遲

我連着這裏最顯著將Appstats截圖:在總運行的RPC 90毫秒超過20秒;這怎麼可能?我應該在哪裏尋找這些延誤的起源?

我真的很堅持,因爲我不明白有什麼之間的RPC發生,我不知道還有什麼我可以爲了獲得更多的信息做。

只是一個想法:每個HTTP調用是相同的GAE實例處理,對不對?因爲我的情況下,花了很多的時間來熱身。但我不認爲這是有關

BTW:我在Java編碼。

appstats statistics

回答

2

通常,在appstats中間未完成的「漏洞」是您的代碼正在執行。
Appstats記錄每個rpc條目並退出,而他無法記錄的區域是您正在運行的實際代碼。

你有兩個電話之間的應用程序的時間日誌?

+0

謝謝謝謝..是的,我用log.fine(..)記錄了很多東西,所以我應該啓用該級別,然後再看一遍。 –

+0

我不相信100%是一個HTTP調用由不同的實例處理。可能嗎?因爲這可能是另一個問題,因爲花了很長時間來預熱新實例! –

+0

@MicheleOrsi你不能在處理程序執行期間跳過實例 –

2

巨大的,「不明原因」延遲幾乎總是熱身吞噬資源的請求。檢查你的appengine日誌,看看有多少api_ms和cpu_ms被用於熱身。

您可以通過在AppEngine上的控制面板增加你的最大未決延遲避免熱身。允許更高的等待時間意味着請求將在更新實例之前等待更長的時間。這可能會使每個請求稍慢一些,但您將避免重量級加載請求。

爲了幫助預熱請求,請確保您的AppEngine-web.xml中有:

<warmup-requests-enabled>true</warmup-requests-enabled> 

這將導致的AppEngine調度搶先火了新的情況下,當電流那些被超載{即它在請求轉到新實例之前開始加載)。

然後,在受影響的緩慢的servlet,請確保你把時加載的啓動在你的web.xml:

<servlet> 
    <servlet-name>my-servlet</servlet-name> 
    <servlet-class>com.company.MyServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

時加載的啓動僅僅是確保您的高優先級servlet是隨時準備在熱身請求結束後立即去。

+0

謝謝,但我已經在做所有的建議:啓用了熱啓動請求,加載啓動和我的待處理延遲設置爲11.5秒 - 自動.. –

+0

您可以再次運行測試,並觀察如何許多實例被解僱?檢查您是否正在獲取日誌中的請求,以及其中有多少。另外,你是否在同一時間發射所有的rpcs?如果您的瀏覽器打開了兩個以上的連接,它將阻塞未決的連接,這會導致您的servlet阻塞。 觀察螢火蟲的請求,以及看看你是否可以挑選哪些請求推動你在90ms的請求20秒。 – Ajax

+0

另外,11.5s的掛起延遲意味着每個連接的延遲可能超過10秒。衡量您的加載請求。如果一個加載請求是15秒,並且最大待定延遲是11秒,那麼您的第一個加載請求將等待10秒,然後再花15秒啓動一個新實例。您可能想要關閉待定延遲,只是在加載請求上咬一口。 – Ajax