【问题标题】:AppEngine sudden 503 errorsAppEngine 突然出现 503 错误
【发布时间】: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


    【解决方案1】:

    是的,托管虚拟机目前处于测试阶段,尽管有时它们感觉更像是 Alpha 版本。顺便说一句,我们正在经历类似的情况。

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

    由于您的实例处理大量 cron 和任务队列请求,我的假设是它运行长时间运行的任务,这可能会占用大量内存。

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

    【讨论】:

    • 感谢您的回答,这非常有帮助,我更新了一些调查的帖子。关于健康检查中有意义的工作,您是指我与端点监控一起使用的健康检查,还是有某种方法可以覆盖内置的健康检查?
    • 是的,MVM 上的文档分散在:cloud.google.com/appengine/docs/managed-vms/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2016-03-16
    • 2021-01-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多