谷歌App Engine奇怪的延迟

时间:2012-04-29 19:01:14

标签: java google-app-engine appstats

我改进了很多代码,现在所有的API都运行得非常快,我还添加了memcache,而且我的命中率很高。 但有时我会得到毫无意义的延迟。

我附上了最重要的appstats截图:总共运行90ms的RPC超过20秒;这怎么可能?我应该在哪里找到这些延误的起源?

我真的被困了,因为我不明白RPC之间发生了什么,我不知道我还能做些什么才能获得更多信息。

只是一个想法:每个HTTP调用都由同一个GAE实例处理,对吧?因为我的实例花了很多时间来预热..但我不认为它是相关的

BTW:我是用Java编写的。

appstats statistics

2 个答案:

答案 0 :(得分:2)

巨大的,“无法解释的”延迟几乎总是需要吞噬资源的热身请求。检查你的appengine日志,看看在热身时使用了多少api_ms和cpu_ms。

您可以通过增加appengine控制面板中的最大待处理延迟来避免预热。允许更高的延迟意味着请求将在触发新实例之前等待更长时间。这可能会使每个请求变慢,但您将避免重量级加载请求。

要帮助处理预热请求,请确保您的appengine-web.xml具有:

<warmup-requests-enabled>true</warmup-requests-enabled>  

这将导致appengine调度程序在当前的实例超载时抢先启动新实例(即它会在请求转到新实例之前开始加载}。

然后,在受影响的慢速servlet中,确保将load-on-startup放在web.xml中:

<servlet>
  <servlet-name>my-servlet</servlet-name>
  <servlet-class>com.company.MyServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

load-on-startup只会确保您的高优先级servlet在预热请求完成后随时可以使用。

答案 1 :(得分:2)

通常,在appstats中间的“漏洞”下落不明是您的代码执行 Appstats记录每个rpc进入和退出,他无法记录的区域是您运行的实际代码。

您是否有应用程序在这两个电话之间的日志?