6

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

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

我真的被卡住了,因为我不明白 RPC 之间发生了什么,而且我不知道我还能做些什么来获取更多信息。

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

顺便说一句:我正在用 Java 编码。

appstats 统计

4

2 回答 2

2

通常,appstats 中间未解释的“漏洞”是您的代码正在执行。
Appstats 记录每一个 rpc 的进入和退出,他无法记录的区域是你实际运行的代码。

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

于 2012-04-29T22:14:10.853 回答
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 在预热请求完成后始终准备就绪。

于 2012-04-29T19:33:19.243 回答