我改进了很多代码,现在所有的API都运行得非常快,我还添加了memcache,而且我的命中率很高。 但有时我会得到毫无意义的延迟。
我附上了最重要的appstats截图:总共运行90ms的RPC超过20秒;这怎么可能?我应该在哪里找到这些延误的起源?
我真的被困了,因为我不明白RPC之间发生了什么,我不知道我还能做些什么才能获得更多信息。
只是一个想法:每个HTTP调用都由同一个GAE实例处理,对吧?因为我的实例花了很多时间来预热..但我不认为它是相关的
BTW:我是用Java编写的。
答案 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进入和退出,他无法记录的区域是您运行的实际代码。
您是否有应用程序在这两个电话之间的日志?