我们有一个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个已终止的任务没有跟踪数据。
这可能是什么原因以及我们如何进一步调查呢?
答案 0 :(得分:1)
我们最终通过以下步骤解决了问题: