当应用程序停止提供请求时,我们遇到了一些奇怪的AppEngine行为,直到重新部署为止。 这看起来像此图表上的平坦区域: 发生这种情况时,应用程序仍会提供静态内容,但所有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。或者我找不到它。
答案 0 :(得分:2)
是的,目前托管虚拟机是测试版,虽然有时他们感觉更像是alpha。顺便说一下,我们遇到了类似的情况。
看起来我们遇到了内存耗尽(并且获得OOM)的问题,这使得JVM完全没有响应 - 运行状况检查也不可用。结果是GAE重新启动了实例 - 大约需要4-5分钟。
由于您的实例提供了大量的cron和Task Queue请求,我的假设是它运行长时间运行的任务,可能会占用大量内存。
提示:启用healthcheck并使其实际执行一些有意义的工作 - 实例化一些类,检查一些内部状态等。还要将healthcheck settings设置为一些合理的值,以便服务器错误在分钟。例如 - 文档中列出的默认设置将在大约10分钟(5秒+4秒)* 60 = 9分钟+重新启动时间(2-3分钟)内重新启动无响应的实例。