调度GAE实例和JDO初始化

时间:2012-10-19 16:16:00

标签: google-app-engine google-cloud-datastore

我知道GAE调度程序是受到严格审查和关注的主题。我也知道它对我的应用程序的性能至关重要。我花了最后一周优化和分析我的应用程序。

我也理解调度程序设计用于跨越各种应用程序大小,并且就并发用户而言,算法可能不会针对我的相对较小规模的应用程序进行优化。

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

  

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

如果可能出现15秒的等待延迟和2个空闲实例,当我连续执行10个请求时,所有需要1-3秒(启用多线程),它会旋转新的情况?

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

我的问题如下:

是否有其他人遇到过与调度程序行为有关的以下情况,以及与DS初始化的相互作用,如果是,您是否可以建议解决方案以避免产生此类延迟?

具体来说,情况是:

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

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

  1. 迁移到hibernate或类似的东西 - 这是一项巨大的事业,并且不清楚它是否会解决问题。
  2. 修改我的应用程序架构,使用Backends提供所有数据库功能,因为至少我可以控制运行的数量等。
  3. 也许有一些我缺少的JDO配置会避免上述开销?

1 个答案:

答案 0 :(得分:0)

是的,JDO会在您第一次访问时导致延迟。这是由于JDO规范要求实现能够提供只能通过内省数据库收集的信息;即使你不想要这些信息,它仍然需要收集它。对于在App Engine上使用Java的任何人来说,我的建议是不使用JDO - 使用更适合App Engine的东西,比如Objectify。

待处理的延迟设置不太可能导致新情况在您的情况下被启动;更有可能是Min Idle实例;如果它大于0,则只要实例占用了请求,调度程序就会启动一个额外的实例。