1

我在我的 Google Appengine 应用程序的后端实例中运行一个很长的任务(大约 6 小时)。

这是后端配置:

<backend name="backend_1">
    <class>B4_1G</class>
    <options>
        <public>true</public>
        <dynamic>false</dynamic>
    </options>
</backend>

当进程运行时(在默认线程或并行线程中,我都尝试了)在我得到随机量之后

2013-09-13 18:52:14.677
Process terminated because the backend took too long to shutdown.

我环顾四周寻找解决方案,我读到了我实现的后端实例的关闭挂钩,但它似乎不起作用。

LifecycleManager.getInstance().setShutdownHook(new ShutdownHook()
{
    public void shutdown()
    {
        log().info("Shutting down...");
        LifecycleManager.getInstance().interruptAllRequests();
    }
});

日志消息永远不会显示,只有Process terminated because...消息

我还实施了 isShuttingDown 检查

LifecycleManager.getInstance().isShuttingDown();

在我的流程的每个周期中,我首先检查的是后端是否正在关闭,但这个标志永远不会是真的。

该过程总是“残酷地”中断,没有任何钩子来控制关机(也许我可以停止操作,保存一些数据以备将来恢复)

我想到了“内存不足”错误,但我没有在内存中存储任何“大”对象。此外,在每个循环中,实例变量都设置为 NULL,从而强制释放内存。

另外,我期待这样的错误

Uncaught exception from servlet java.lang.OutOfMemoryError: Java heap space

如果这是问题

我是唯一遇到这种问题的人吗?

已经阅读了这篇文章,但没有解决方案

4

1 回答 1

0

我对python有同样的问题。就我而言,我看到的只是终止的消息。检查时,CPU,内存使用情况都很好。永远不会减少配置并降低内存消耗。看到的还是一样的。在您的情况下,它说内存问题,您可以尝试分析您的代码并降低内存占用。同样,正如我在大约 50 次后端运行中注意到的那样,不能保证调用关闭处理程序。Google 开发人员在后端的 Google IO 视频中明确说明了这一点。

在追踪这个错误一段时间后,AppEngine 开发范式似乎围绕着 url 处理程序,在时间、内存等方面有限制。这也适用于长时间运行的任务。我将我的长期任务重新安排为执行小任务。任务队列触发了较小的任务,这些任务在完成队列下一个任务之前依次运行。从来没有失败过一次!

优点是任务队列具有更好的故障保护/移交,而不仅仅是一个巨大的 cron 作业。一项任务失败并不意味着庞大任务列表的其余部分失败。

当接近带有队列的后端时,关闭钩子也可以完美地工作。与有时在 cron 作业中相比,每次都被解雇。

于 2013-12-01T16:26:07.430 回答