2016-01-22 54 views
4

我们有一个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个终止的任务没有跟踪数据。

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

+0

您可以尝试启用[Cloud Trace](https://cloud.google.com/trace/),然后添加一个您的缓慢请求的跟踪吗? – David

+0

@David我编辑了我的问题以包含cron作业的跟踪数据:http://imgur.com/a/H5wGG。他包含跟踪摘要以及时间线的开始/结束。 8个终止的任务没有跟踪数据。 – Avital

+0

一个标准的做法是首先找出问题。你可以直接对数据库进行查询,查看查询运行需要多长时间?使用Google App Engine可能并不简单,因此您可能希望在将本地计算机的IP授权给Cloud SQL实例后,从本地计算机运行查询。 – Herman

回答

1

我们最终设法通过以下步骤来解决问题:

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

是否在处理任务时看到任何缓慢,因为您将并发任务设置为2.您使用此方法时面临的任何其他问题??。 – Rams

+0

我们对这种方法没有任何问题,我们发现任务的吞吐量对我们来说足够好。 – Avital

相关问题