AppEngine突然出现503错误

时间:2015-01-20 15:59:29

标签: java google-app-engine servlets

当应用程序停止提供请求时,我们遇到了一些奇怪的AppEngine行为,直到重新部署为止。 这看起来像此图表上的平坦区域:CPU Utilization 发生这种情况时,应用程序仍会提供静态内容,但所有servlet和Google Cloud Endpoints都将返回503错误。

最近我从StackDriver添加了Endpoint监控,它正在检查非常简单的servlet:

public class HealthCheckServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        PrintWriter writer = resp.getWriter();
        writer.print("ok");
    }
}

结果使我更加困惑:

...
2015-01-19 18:05:04 UTC - failed 
2015-01-19 18:10:02 UTC - resolved - gave an error for 4 minutes 
2015-01-19 18:45:04 UTC - failed   - worked for 35 minutes  
2015-01-19 18:49:03 UTC - resolved - gave an error for 3 minutes 
2015-01-19 18:51:03 UTC - failed   - worked for 2 minutes 
2015-01-19 19:24:03 UTC - resolved - gave an error for 33 minutes 
2015-01-19 19:31:07 UTC - failed   - worked for 7 minutes 
2015-01-19 19:48:02 UTC - resolved - gave an error for 16 minutes 
2015-01-19 20:19:04 UTC - failed   - worked for 31 minutes
2015-01-20 03:25:03 UTC - resolved - gave an error for 425 minutes
2015-01-20 03:46:05 UTC - failed   - worked for 21 minutes
2015-01-20 06:50:04 UTC - resolved - gave an error for 183 minutes
2015-01-20 07:21:04 UTC - failed   - worked for 31 minutes
2015-01-20 07:26:02 UTC - resolved - gave an error for 4 minutes
2015-01-20 09:21:02 UTC - failed   - worked for 115 minutes
2015-01-20 09:26:02 UTC - resolved - gave an error for 5 minutes
2015-01-20 14:25:02 UTC - failed   - worked for 301 minutes    
2015-01-20 14:31:02 UTC - resolved - gave an error for 6 minutes
2015-01-20 15:09:02 UTC - failed   - worked for 28 minutes    
2015-01-20 15:14:05 UTC - resolved - gave an error for 5 minutes

看起来它有50%的时间工作,50%的时间甚至更多都失败了!

不知道它是否重要,但我们的应用程序使用具有标准java7运行时的托管虚拟机,并且依赖于Cron和TaskQueue。

更新

一些OOM调查。

我将其中一个卡住的VM切换为由用户管理并检查/ var / log中的所有日志以查找OOM - 什么也没找到。然后我检查了是否有任何java进程正在运行 - 没有运行java进程。这看起来很奇怪,因为如果没有java进程来响应运行状况检查它应该重新启动,但是这个特定的VM是在5小时前启动的。

然后我将此VM切换回由Google管理,GAE重新启动它,然后我将其切换回用户管理并检查java进程 - 这次有一个占用了77%的内存并且增加了。负载平均值开始增加,直到达到峰值90,然后重新启动VM。

现在很明显我的内存有问题,但我没有在日志中找到任何与内存相关的内容。既不在GAE控制台中,也不在服务器上。

我目前的假设是自动缩放过程在一段时间后失败。可能有太多与OOM相关的VM重启或VM的一些意外行为。否则如何解释没有java进程的VM几个小时没有重启?

要检查这个hypothisis我需要找到一些自动缩放日志,我仍然找不到。

同样很高兴看到托管虚拟机的内存使用情况,但看起来它不是来自GAE控制台,也不是来自StackDriver。或者我找不到它。

1 个答案:

答案 0 :(得分:2)

是的,目前托管虚拟机是测试版,虽然有时他们感觉更像是alpha。顺便说一下,我们遇到了类似的情况。

看起来我们遇到了内存耗尽(并且获得OOM)的问题,这使得JVM完全没有响应 - 运行状况检查也不可用。结果是GAE重新启动了实例 - 大约需要4-5分钟。

由于您的实例提供了大量的cron和Task Queue请求,我的假设是它运行长时间运行的任务,可能会占用大量内存。

提示:启用healthcheck并使其实际执行一些有意义的工作 - 实例化一些类,检查一些内部状态等。还要将healthcheck settings设置为一些合理的值,以便服务器错误在分钟。例如 - 文档中列出的默认设置将在大约10分钟(5秒+4秒)* 60 = 9分钟+重新启动时间(2-3分钟)内重新启动无响应的实例。