【发布时间】:2015-01-20 15:59:29
【问题描述】:
我们遇到了一些奇怪的 AppEngine 行为,当应用程序停止为请求提供服务时,直到它被重新部署。 这看起来像这张图上的平坦区域: 发生这种情况时,应用程序仍会提供静态内容,但所有 servlet 和 Google Cloud Endpoints 都会返回 503 错误。
最近我从 StackDriver 添加了端点监控,它正在检查非常简单的 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 运行时的托管 VM,并且严重依赖 Cron 和 TaskQueue。
更新:
一些OOM调查。
我将其中一个卡住的虚拟机切换为由用户管理,并检查了 /var/log 中的所有日志是否存在 OOM - 什么也没找到。然后我检查是否有任何 java 进程正在运行 - 没有 java 进程正在运行。这看起来很奇怪,因为如果没有响应健康检查的 java 进程,它应该重新启动,但这个特定的 VM 是在 >5 小时前启动的。
然后我将此虚拟机切换回由 Google 管理,GAE 重新启动它,然后我将其切换回由用户管理并检查 java 进程 - 这次有一个占用 77% 的内存并且还在增加。平均负载开始增加,直到达到峰值 90,然后虚拟机重新启动。
现在很明显我有内存问题,但我在日志中没有发现任何与内存相关的内容。不在 GAE 控制台中,也不在服务器上。
我目前的假设是自动缩放过程会在一段时间后失败。可能有太多与 OOM 相关的 VM 重新启动或来自 VM 的一些意外行为。否则如何解释没有java进程的VM几个小时没有重新启动?
要检查这个假设,我需要找到一些自动缩放日志,但我仍然找不到。
此外,很高兴看到托管 VM 的内存使用情况,但看起来它在 GAE 控制台和 StackDriver 中都不可用。或者我找不到。
【问题讨论】:
标签: java google-app-engine servlets