我改进了很多我的代码,现在所有的API都运行得非常快,我还添加了memcache,并且我的命中率很高 . 但有时我会得到毫无意义的延迟 .
我在这里附上最重要的appstats截图:总共运行90ms的RPC超过20秒;这怎么可能?我应该在哪里找到这些延误的起源?
我真的被困了,因为我不明白RPC之间发生了什么,我不知道我还能做些什么才能获得更多信息 .
只是一个想法:每个HTTP调用都由同一个GAE实例处理,对吧?因为我的实例花了很多时间来预热..但我不认为这是相关的
BTW:我用Java编写代码 .
2 回答
通常,在appstats中间的"hole"的未计入代码是您的代码执行 .
Appstats记录每个rpc入口和出口,他无法记录的区域是您运行的实际代码 .
您是否有应用程序在这两个呼叫之间的日志?
巨大的,“无法解释的”延迟几乎总是热身请求吞噬资源 . 检查你的appengine日志,看看在热身时使用了多少api_ms和cpu_ms .
您可以通过增加appengine控制面板中的最大挂起延迟来避免预热 . 允许更高的延迟意味着请求将在触发新实例之前等待更长时间 . 这可能会使每个请求变慢,但您将避免重量级加载请求 .
要帮助处理预热请求,请确保您的appengine-web.xml具有:
这将导致appengine调度程序在当前的实例过载时抢先启动新实例(即它在请求转到新实例之前开始加载} .
然后,在受影响的慢速servlet中,确保将load-on-startup放在web.xml中:
load-on-startup仅确保一旦热身请求完成,您的高优先级servlet就会随时可用 .