1

我知道 GAE 调度程序是备受关注和关注的主题。我也知道这对我的应用程序的性能至关重要。上周我一直在优化和分析我的应用程序。

我还了解调度程序旨在跨应用程序大小的范围工作,并且就并发用户而言,该算法可能不会针对我相对较小规模的应用程序进行优化。

我认为以下对待处理延迟的描述是错误的,这会导致不可避免的延迟:

Pending Latency 滑块控制请求在由应用程序的默认版本的实例提供服务之前在待处理队列中花费的时间。如果最小挂起延迟很高,App Engine 将允许请求等待而不是启动新实例来处理它们。这可以减少您的应用程序使用的实例小时数,但会导致更多用户可见的延迟。

当我串行执行 10 个请求(全部需要 1-3 秒(启用多线程))时,如果等待延迟为 15 秒,并且有 2 个空闲实例,它怎么可能会启动新实例?

我为什么在乎?我可以把我所有的初始化都放在我的热身代码中吗?错误的。我正在将 GAE/J 与 JDO 一起使用。似乎每个实例第一次遇到实体类型时,它第一次会产生几秒钟的“验证”开销。大多数情况下,除非您将 JDO 日志记录设置为 INFO 级别,否则您甚至不会知道这种情况正在发生。

我的问题如下:

是否有其他人经历过以下与调度程序行为及其与 DS 初始化的交互有关的情况,如果是这样,您能否提出一个解决方案,以便我可以避免发生此类延迟?

具体来说,情况是:

  • 使用 JDO - 每次新实例第一次“接触”实体类型时,都会产生初始化开销(如果您有疑问,请将 JDO 日志记录级别设置为 INFO)。此开销约为 2-3 秒
  • 这种开销导致的延迟增加,加上调度程序明显忽略 Pending Latency 参数的事实意味着它更有可能启动一个新实例,而不是计算现有实例可以处理请求。
  • 因为新请求正在由新实例处理,所以上述初始化开销是重复的。这样恶性循环就一直存在。

请注意,我已经考虑了以下补救措施:

  1. 迁移到休眠或类似 - 一项艰巨的任务,并且不清楚它是否会解决问题。
  2. 修改我的应用程序架构以使用后端来提供所有数据库功能,因为至少我可以控制我正在运行的数量等。
  3. 也许我缺少一些 JDO 配置可以简单地避免上述开销?
4

1 回答 1

0

是的,JDO 在你第一次访问它时会造成延迟。这是因为 JDO 规范要求实现能够提供只能通过自省 DB 收集的信息;即使您不想要这些信息,它仍然必须收集它。对于在 App Engine 上使用 Java 的任何人,我的建议是不要使用 JDO - 使用更适合 App Engine 的东西,例如 Objectify。

在您的情况下,未决延迟设置不太可能导致新实例启动;Min Idle 实例的可能性更大;如果该值大于 0,则一旦实例被请求占用,调度程序就会启动一个额外的实例。

于 2012-10-24T15:22:42.037 回答