我们有一个cron作业,每小时在后端模块上运行并创建任务。 cron作业在Cloud SQL数据库上运行查询,并且这些任务使HTTP调用到其他服务器并更新数据库。通常情况下,他们运行的很好,即使创建了数以千计的任务,但有时却会“卡住”,并且日志中没有任何内容可以说明情况。 例如,昨天我们监视了cron作业,同时创建了数十个任务,然后停止,同时还有8个任务也停滞在队列中。当很明显没有发生任何事情时,我们再次运行该过程几次,并且每次都成功完成。为什么在Google App Engine上运行的进程挂起?
经过一天原始任务被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个终止的任务没有跟踪数据。
这可能是什么原因以及我们如何进一步调查?
您可以尝试启用[Cloud Trace](https://cloud.google.com/trace/),然后添加一个您的缓慢请求的跟踪吗? – David
@David我编辑了我的问题以包含cron作业的跟踪数据:http://imgur.com/a/H5wGG。他包含跟踪摘要以及时间线的开始/结束。 8个终止的任务没有跟踪数据。 – Avital
一个标准的做法是首先找出问题。你可以直接对数据库进行查询,查看查询运行需要多长时间?使用Google App Engine可能并不简单,因此您可能希望在将本地计算机的IP授权给Cloud SQL实例后,从本地计算机运行查询。 – Herman