2012-03-17 33 views
1

我試圖找到在GAE上配置我的應用程序實例的最佳方法。瞭解GAEJ上的內存使用情況和前端實例類

我在GWT/GAEJ上運行Saas。我有一小部分使用應用程序的高級用戶整天都在使用應用程序(而不是每天使用應用程序幾分鐘的大量用戶)。

因此,我試圖找到最好的方式來配置我使用前端實例類,使其最有效率,並提供最佳的用戶體驗。

我啓用了計費功能,發現我需要運行空閒實例以避免實例啓動時出現延遲。我使用JDO,並且啓動每個實例需要很長時間來初始化數據存儲訪問。所以我啓動了一些應用程序實例並讓它們在空閒模式下運行。這給用戶帶來了不錯的體驗,但顯然意味着我爲閒置的實例付費 - 這並不理想。

我會調查我是否可以更有效地做到這一點。

但是,這是背景,我真正的問題如下; 如果我看看我的實例的內存使用情況,他們會經常說136MB等等(它們開始在66MB左右)。所以我想我有一些內存泄漏找到。但具體我想知道:

  1. 我也使用Memcache,大概這個記憶在上面的計算考慮到?

  2. 我目前使用的是F1實例類,它的內存大小爲128MB。那麼對於我的實例來說,這意味着什麼似乎解決了大約136MB的問題?他們會跑得慢多少,因爲他們會一直換到磁盤上?由於這個原因,我會更好地運行一個F2實例而不是2個F1實例嗎?

  3. 我發現非常惱人的是GAE開始新的實例,即使我有2個空閒的實例。儘管我設置了最小延遲非常高(7.5secs)。我在文檔中看過,當我使用空閒實例時,這個設置幾乎沒有影響,但是我怎樣才能確保只使用空閒實例,而不是訴諸於開始新的操作(由於數據存儲區初始化問題,這總會導致更大的延遲上文提到的)? (並通過更多的實例時間增加了我的成本)

我誤解了什麼嗎? 非常感謝您的任何幫助。

回答

5

附註:

a。 JVM按需獲取內存,但是rarely releases it back to OS。這不是內存泄漏。

b。您可以調整未決實例的數量和響應時間。這使您可以控制正在運行的實例的數量。請參閱performance settings上的文檔。

c。如果您的代碼啓動緩慢,並且啓動過程中不需要很長的響應時間,則可能需要使用warmup requests

現在到問題:

  1. Memcache的是外部給前端實例服務和AFAIK不會存儲在前端實例對象。因此,Memcache中的對象總數不應反映前端實例使用的內存。

  2. 前端實例的實際底層實現未知(至少在Google之外),但我懷疑它們使用本地磁盤進行交換。你總是可以嘗試使用F2實例,看看它是如何工作的。

  3. 新實例的啓動由延遲設置命令。如果一個請求位於隊列中太長時間,則將啓動一個新實例。如果你的實例花費太長時間,這可能會造成一個惡性循環。嘗試使用熱身請求。

+0

彼得,非常感謝。我會玩熱身請求,很可能是我的答案。但是我對我所擁有的實例體驗感到非常沮喪。我想知道是否有人遇到類似的問題。我試過跑F1而不是兩個F1,沒有明顯的改善。然而,現在真正煩人的是無論我開始多少個實例(現在例如我有3個空閒實例),每個請求都會啓動一個新實例。不管我是否實施了熱身請求,這不應該發生? (不是當我有空閒的情況下待命) – doright 2012-03-18 09:53:49

2

我也有問題,JDO/DataNucleus初始化對實例的第一個請求非常緩慢。我使用MemCache來緩存數據存儲區中的幾乎所有內容。在預熱請求中,預加載所有內容(現在,當數據增長時,我會改變它來預加載重要的東西,只接觸不是很重要的對象來初始化JDO)解決了我的問題,即我只有一些常駐實例請求。現在,我的常駐用戶和其他按需實例的使用情況分佈得更好 - 仍然駐留實例只獲得三分之一的請求。

我認爲當第一個請求比第一個請求花費更長的時間時,調度器會出現延遲計算問題。

+0

嗨保羅,這是非常有趣的,非常感謝。但我不完全明白。當然,你沒有一個只讀的應用程序?在這種情況下,你的實例的每分鐘需要更新數據庫,那麼它將需要引發你提到的JDO/DataNucleus命中?所以,這不就是拖延不可避免的嗎?但我對「我認爲調度程序在第一個請求比第一個請求需要更長時間時計算延遲時間有問題」感興趣。「以前我沒有想過,但聽起來很合理。 – doright 2012-05-10 07:51:50

+0

- 我認爲JDO/DataNucleus初始化大部分時間都是第一次請求。現在這發生在熱身請求中,這顯然不計入延遲平均值。 - 當請求啓動新實例時,它仍然需要很長時間。我只看到這與非默認版本,我希望默認版本將始終發送請求到現有的實例,直到新的啓動。 – paul 2012-05-17 17:01:43

+0

好吧,關於讀/寫行爲,您所說的是以下內容:將所有讀取請求放入高速緩存中,以便您甚至不需要爲大多數請求命中數據庫。然後在您的熱身請求中,確保您「觸摸」了所有寫入實體。這樣,當你真正寫了一些東西的時候應該很快,但是你應該得到實際上沒有太多滯後的情況。我會試試這個.. – doright 2012-05-22 06:36:15

相關問題