理解GAEJ上的内存使用和前端实例类

时间:2012-03-17 09:02:33

标签: google-app-engine

我正在尝试找到在GAE上配置我的App实例的最佳方法。

我在GWT / GAEJ上运行Saas。我有少量高级用户全天使用该应用程序(而不是每天使用该应用程序的大量用户)。

因此,我正在尝试找到配置我使用前端实例类的最佳方法,以使其最有效,并提供最佳用户体验。

我启用了计费功能,发现我需要运行空闲实例,以避免在启动实例时出现延迟。我使用JDO,每次启动时,每个实例都需要很长时间来初始化数据存储访问。所以我启动了许多应用程序实例,让它们以空闲模式运行。这提供了良好的用户体验,但显然意味着我为只是闲置的实例付费 - 不理想。

我将调查是否可以更有效地做到这一点。

然而这是背景,我真正的问题如下; 如果我查看我的实例的内存使用情况,他们会经常说136MB等(它们的起始值约为66MB)。所以我想我有一些内存泄漏要找。但具体来说我想知道:

  1. 我也使用Memcache,大概是在上面的计算中考虑了这个记忆?

  2. 我目前使用F1实例类,其内存大小为128MB。那么对于我的实例来说,这似乎意味着大约136MB的大小是什么意思呢?他们会一直运行得更慢,因为他们会一直交换到磁盘吗?出于这个原因,我会更好地运行单个F2实例而不是2个F1实例吗?

  3. 我非常恼火地发现即使我有2个空闲实例,GAE也会启动新实例。尽管我将最小延迟设置得非常高(7.5秒)。我在文档中读到这个设置在使用空闲实例时效果不大,但是如何确保只使用空闲实例,而不需要启动新的(由于数据存储初始化问题,这总是会导致更长的延迟)上文提到的)? (并通过更多的实例时间增加了我的成本)

  4. 我误解了什么吗? 非常感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

很少注意到:

一个。 JVM按需获取内存,但rarely releases it back to OS。这不是内存泄漏。

湾您可以调整待处理实例的数量和响应时间。这使您可以控制正在运行的实例数。请参阅performance settings上的文档。

℃。如果您的代码启动缓慢,并且您不希望在启动期间需要很长的响应时间,则可能需要使用warmup requests

现在回答问题:

  1. Memcache是​​前端实例外部的服务,AFAIK不在前端实例上存储对象。所以Memcache中的对象总数不应该反映在前端实例使用的内存中。

  2. 前端实例的实际底层实现尚不清楚(至少在谷歌之外),但我怀疑他们使用本地磁盘进行交换。您始终可以尝试使用F2实例,看看它是如何工作的。

  3. 延迟设置指令启动新实例。如果请求在队列中停留的时间太长,则新实例将被启动。如果你的实例需要很长时间才能启动,这可能会造成恶性循环。尝试使用预热请求。

答案 1 :(得分:2)

我还遇到JDO / DataNucleus初始化对实例的第一个请求非常慢的问题。我使用MemCache来缓存几乎所有数据存储区中的内容。在热身请求中预加载所有内容(现在,当数据增长时我会将其更改为预加载重要内容并且只触摸不那么重要的对象来初始化JDO)解决了我的问题,即我只有一些常驻实例请求。现在,我的1驻留和其他按需实例的使用分布得更好 - 仍然驻留实例只获得三分之一的请求。

我认为当第一个请求比后来的请求花费更长时间时,调度程序会出现延迟计算的问题。