【问题标题】:Out of memory in GAE devserverGAE 开发服务器内存不足
【发布时间】:2015-05-11 07:43:23
【问题描述】:

我正在开发一个目录应用程序,使用 Google Apps API 将 API 中的所有数据(用户、组、组织单位)存储到数据存储中,然后查询数据存储以显示用户进行搜索和查看。

我正在使用任务加载用户和组。我遵循的方法是从 API 读取数据,然后在循环中创建每个用户的实体,然后查找 nextPageToken,如果它不为空,则分配另一个加载用户的任务。组和 OU 也采用相同的方法。

现在的问题是,如果我在拥有 2k 用户的谷歌域上运行它,它工作正常,但是当我在有 90K 用户的环境中运行它时,它工作正常,直到它达到 12-13k 用户,然后它停止响应并且任务停止响应,并且我的机器上的内存使用率更高,我的本地开发服务器就是这种情况,因为我还没有在 appengine 上部署它。

按照我上面描述的方法有很多后端代码,但是我不确定在这里提供什么,所以请提出您可能认为可能导致问题的问题。我将在此处粘贴 sn-p,无论要求什么!

实际生产服务器的用户数量将翻倍,即接近 200K,这让我很担心。请帮忙!

【问题讨论】:

  • 你试过在他们的服务器上运行这个吗?它可能会在测试服务器上遇到一些瓶颈。
  • @gaurav-sachdeva 如果您使用任务队列来完成工作,那么当您降低吞吐量时会发生什么?如果您尝试将 max-concurrent-requests 值设置为 1?
  • 不幸的是,设置 max-concurrent-requests 不是一个选项,因为完成 20 万用户需要很长时间。

标签: java google-app-engine jakarta-ee google-api google-apps


【解决方案1】:

不要试图在一个循环中创建所有用户/实体,然后一步保存,这是不必要的,并且(当你遇到它时)需要更多内存。

而是将其分成更小的组,例如例如,将您的周期限制为 100 个实体,保存这 100 个并继续。这样处理请求的实例就不必在内存中保留数千个实体。

您提到您正在通过任务执行此操作。你的瓶颈是内存。通过减少任务创建和保存的实体数量,您将有效地增加执行任务的请求数量,并且由于任务处理的实体数量减少,您不仅会增加请求数量,还会增加请求率。这将导致任务使用更少的内存,这将建议 GAE 平台更频繁地启动新实例,这意味着您将拥有更多的内存。

因此,在任务中处理较少的实体是减少内存需求的好方法。

【讨论】:

  • 我正在使用任务加载用户/组,每个任务只处理 500 个用户,而不是更多。我相信,500 不应该太多以增加内存负载。会不会是别的东西?
  • @GauravSachdeva 我会降低 500 个限制(例如降低到 100 个),因为保存 500 个实体可能会导致达到某些数据存储超时。但理论上它应该适用于 500。也许您没有清除存储它们的列表?
  • 每次在每个新任务中都会根据服务器的响应创建一个新的对象列表,那么我应该在哪里清除它?
  • 在这种情况下你不应该,但我不知道,因为你还没有发布任何代码。
  • @GauravSachdeva 编辑了问题,请参阅为什么您应该尝试在任务中处理更少的实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2012-07-05
  • 2014-07-05
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
相关资源
最近更新 更多