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

Why do processes running on Google App Engine hang?

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

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

在进程被终止之前我们在日志中完全看不到它们的记录,现在我们看到它们在 DeadlineExceededException 之前没有日志记录,所以我们不知道它们是在什么时候卡住的. 我们怀疑数据库中有一些锁,但我们在下面的 link 中看到查询有 10 分钟的限制,因此这将导致进程在一天内失败:https://cloud.google.com/appengine/docs/java/cloud-sql/#Java_Size_and_access_limits

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

<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。 这包括跟踪摘要和时间线的 beginning/ending。 没有 8 个终止任务的跟踪数据。

这可能是什么原因造成的,我们如何进一步调查?

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

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