Java 出现突然的503错误

Java 出现突然的503错误,java,google-app-engine,servlets,Java,Google App Engine,Servlets,我们正在经历一些奇怪的AppEngine行为,当应用程序停止服务请求,直到它被重新部署。 这看起来像此图上的平坦区域: 当这种情况发生时,应用程序仍将提供静态内容,但所有servlet和谷歌云端点将返回503错误 最近,我从StackDriver中添加了端点监控,它正在检查非常简单的servlet: public class HealthCheckServlet extends HttpServlet { @Override public void doGet(HttpServ

我们正在经历一些奇怪的AppEngine行为,当应用程序停止服务请求,直到它被重新部署。 这看起来像此图上的平坦区域: 当这种情况发生时,应用程序仍将提供静态内容,但所有servlet和谷歌云端点将返回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运行时的托管虚拟机,并且严重依赖于Cron和TaskQueue

更新:

一些调查

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

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

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

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

要检查这种现象,我需要找到一些自动缩放日志,但我仍然找不到


另外,看到托管虚拟机的内存使用情况也很好,但看起来GAE控制台和StackDriver都无法提供内存使用情况。或者我找不到它。

是的,目前托管虚拟机是beta版,尽管有时它们感觉更像alpha版。顺便说一句,我们正在经历类似的情况

我们似乎有一个内存耗尽(并得到OOM)的问题,这使得JVM完全没有响应-健康检查也不可用。结果是GAE正在重新启动实例-这需要大约4-5分钟

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


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

感谢您的回答,这非常有帮助,我更新了一些调查的帖子。关于healthcheck中有意义的工作,你是指我的healthcheck,我在端点监控中使用它,还是有某种方法覆盖内置的healthcheck?是的,MVM上的文档分散在: