为什么Google App Engine上运行的流程会挂起?

时间:2016-01-22 17:10:05

标签: java google-app-engine cron google-cloud-sql task-queue

我们有一个cron作业,它在后端模块上每小时运行一次并创建任务。 cron作业在Cloud SQL数据库上运行查询,并且任务对其他服务器进行HTTP调用并更新数据库。通常它们运行得很好,即使创建了数千个任务,但有时它会被卡住。日志中没有任何内容可以解释这种情况。 例如,昨天我们监控了cron作业,同时它创建了几十个任务,然后停止了,还有8个任务也被卡在了队列中。当很明显没有发生任何事情时,我们再多次运行该过程并且每次都成功完成。

在一天之后,原始任务被DeadlineExceededException杀死,然后显然在同一实例中运行的其他8个任务被以下消息杀死: 处理此请求的进程遇到问题,导致它退出。这可能会导致新进程用于您的应用程序的下一个请求。如果经常看到此消息,则可能会在应用程序初始化期间抛出异常。 (错误代码104)

在进程被杀死之前,我们在日志中看不到它们的记录,现在我们看到它们在DeadlineExceededException之前没有日志记录,所以我们不知道它们在什么时候被卡住了。 我们怀疑数据库中存在一些锁定,但我们在以下链接中看到查询有10分钟的限制,因此这会导致进程比一天更早失败:https://cloud.google.com/appengine/docs/java/cloud-sql/#Java_Size_and_access_limits

我们的模块的类和缩放配置是:

<instance-class>B4</instance-class>
<basic-scaling>
    <max-instances>11</max-instances>
    <idle-timeout>10m</idle-timeout>
</basic-scaling>

队列的配置是:

<rate>5/s</rate>
<max-concurrent-requests>100</max-concurrent-requests>
<mode>push</mode>
<retry-parameters>
    <task-retry-limit>5</task-retry-limit>
    <min-backoff-seconds>10</min-backoff-seconds>
    <max-backoff-seconds>200</max-backoff-seconds>
</retry-parameters>

我上传了一些cron作业的跟踪数据图像: http://imgur.com/a/H5wGG。 这包括跟踪摘要以及时间线的开头/结尾。 8个已终止的任务没有跟踪数据。

这可能是什么原因以及我们如何进一步调查呢?

1 个答案:

答案 0 :(得分:1)

我们最终通过以下步骤解决了问题:

  1. 我们将模块分成两个 - 一个模块来运行cron作业和 一个模块来处理生成的任务。这让我们看到了 问题是处理任务,因为那是唯一的 模块一直卡住。
  2. 我们将并发任务的数量限制为2,这似乎是在没有系统卡住的情况下可以同时处理的最大任务量。