首页 文章

谷歌App Engine奇怪的延迟

提问于
浏览
6

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

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

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

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

BTW:我用Java编写代码 .

appstats statistics

2 回答

  • 2

    通常,在appstats中间的"hole"的未计入代码是您的代码执行 .
    Appstats记录每个rpc入口和出口,他无法记录的区域是您运行的实际代码 .

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

  • 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就会随时可用 .

相关问题