Google AppEngine将所有请求发送到同一个实例

时间:2012-02-05 15:26:38

标签: google-app-engine latency

最近,我看到GAE处理请求的时间比一周前要长得多。我的代码没有任何变化,但GAE现在需要4000-12000毫秒来响应请求。更糟糕的是,我有大量的实例可以提供0个请求 还有其他人看到过这种情况吗? 我该怎么做才能解决这个问题?我已经做了15个额外的实例(并通过鼻子为他们付费),但似乎没有任何东西可靠地向其他空闲实例发送请求。 我的账单从70-90c /天变为$ 5-8 /天,没有任何代码更改或流量增加。事实上,由于存在巨大的延迟,我正在失去流量。

    QPS*    Latency*    Requests    Errors  Age Memory  Availability
    0.000   0.0 ms  1378    0   10:10:09    57.9 MBytes Dynamic
    0.000   0.0 ms  1681    0   15:39:57    57.2 MBytes Dynamic
    0.017   9687.0 ms   886 0   10:19:10    56.7 MBytes Dynamic

2 个答案:

答案 0 :(得分:1)

我建议安装AppStats,以了解每个请求中需要花费多长时间的内容。我猜你有一些争用问题或一些新数据配置引起的大量读/写。

空闲实例无助于减少延迟 - 看起来每个请求都需要很长时间,每分钟少于一个请求(无论如何都是这个样本),10s请求可以在同一个实例上串行运行。

答案 1 :(得分:0)

我们的应用程序中存在类似的问题。在我们的例子中,我们认为GAE的调度程序在平衡对现有实例的请求方面表现不佳。

在某些情况下,调度程序决定启动新实例,而不是重新使用现有实例。由于旋转一个新实例需要5到> 45秒,我怀疑这可能是你发生的事情。

尝试调查以下内容并查看它是否对您有所帮助:

  1. 确保您的应用已启用线程安全,以便您可以处理并发请求。如果您使用的是Python,则可以在app.yaml中进行配置,如果使用Java,则可以在appengine-web.xml中进行配置。当然,您还需要确保应用中的代码是线程安全的。
  2. 在您的应用程序设置中,如果它仍然设置为自动,将最小待处理延迟更改为非自动设置。我建议现在大约10秒,但您可以稍后进行实验哪种设置最适合你。这会强制调度程序等待一段时间,以便在启动新实例之前查看是否有任何实例可用。
  3. 现在,回答关于sending all requests to same instance的原始问题,据我所知,没有办法解决特定的前端实例,以便将请求定向到该特定实例。

    您可以做的是迁移您的应用以使用后端实例而不是常规前端实例。后端提供了directly target any particular instance within it的方法。您可以在单个后端部署应用程序,以便更好地控制您生成的实例数。由于使用后端绕过调度程序,因此不会遇到因新实例启动而导致的延迟。

    使用此方法的主要缺点是您失去了使用前端实例的自动扩展性优势。但是从低每日结算量来看,我认为可扩展性还不是您应用规模的主要问题。