Java 为什么运行在谷歌应用程序引擎上的进程会挂起?

Java 为什么运行在谷歌应用程序引擎上的进程会挂起?,java,google-app-engine,cron,google-cloud-sql,task-queue,Java,Google App Engine,Cron,Google Cloud Sql,Task Queue,我们有一个cron作业,它在后端模块上每小时运行一次,并创建任务。cron作业在云SQL数据库上运行查询,任务对其他服务器进行HTTP调用,并更新数据库。正常情况下,它们运行得很好,即使创建了数千个任务,但有时它会“卡住”,日志中没有任何东西可以说明情况。 例如,昨天我们监视了cron作业,它创建了几十个任务,然后停止了,还有8个任务也卡在了队列中。当很明显什么都没有发生时,我们又运行了几次这个过程,每次都成功地完成了 一天后,原始任务被一个DeadLineExceedexception终止,然

我们有一个cron作业,它在后端模块上每小时运行一次,并创建任务。cron作业在云SQL数据库上运行查询,任务对其他服务器进行HTTP调用,并更新数据库。正常情况下,它们运行得很好,即使创建了数千个任务,但有时它会“卡住”,日志中没有任何东西可以说明情况。 例如,昨天我们监视了cron作业,它创建了几十个任务,然后停止了,还有8个任务也卡在了队列中。当很明显什么都没有发生时,我们又运行了几次这个过程,每次都成功地完成了

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

在进程被终止之前,我们在日志中完全看不到它们的记录,现在我们看到它们,在deadlineExceedexception发生之前没有日志记录,所以我们不知道它们在什么时候卡住了。 我们怀疑数据库中存在一些锁,但我们在下面的链接中看到,查询有10分钟的限制,因此这将导致进程在一天之内失败:

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

<instance-class>B4</instance-class>
<basic-scaling>
    <max-instances>11</max-instances>
    <idle-timeout>10m</idle-timeout>
</basic-scaling>
B4
11
10米
队列的配置为:

<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>
5/s
100
推
5.
10
200
我为cron作业上载了一些跟踪数据的图像: . 这包括跟踪摘要和时间线的开始/结束。 8个终止的任务没有跟踪数据


原因可能是什么?我们如何进一步调查?我们最终通过以下步骤解决了问题:

  • 我们将模块分为两个一个模块来运行cron作业,然后 一个模块处理生成的任务。这让我们看到 问题在于处理任务,因为这是唯一的问题 不断卡住的模块
  • 我们将并发任务的数量限制为2,这似乎是可以同时处理的最大任务量,而不会使系统陷入停滞

  • 你能试着启用一个慢速请求,然后包括它的跟踪吗?@David我编辑了我的问题,将cron作业的跟踪数据包括在内:。his包括跟踪摘要和时间线的开始/结束。8个终止的任务没有跟踪数据。标准做法是首先隔离问题。您可以对数据库进行查询并查看查询运行所需的时间吗?使用Google App Engine可能不是直截了当的,因此您可能希望在将本地计算机的IP授权给云SQL实例等之后,从本地计算机运行查询。24小时超时是因为您正在使用手动缩放。您包含的跟踪排除了一些API问题,但不排除云sql(因为它不是简单的请求-响应协议,所以不会在跟踪中显示)。接下来,您可能希望在进程挂起时在云SQL主机上尝试“ShowProcessList”,以查看它是否已连接/正在做什么。这将允许我们确定它是否由于缓慢的云SQL查询或死锁而挂起。@David现在有一些任务已经被卡住了几个小时。“SHOW PROCESSLIST”显示17行,其中命令为“Sleep”,用户为“root”,主机为“localhost”。其中8个有“时间”10199(2+小时),8个有“时间”8656(2+小时),1个有“时间”243(4分钟,最后一个持续更新)。除了显示我运行此查询的记录之外,这些是“ShowProcessList”的唯一结果。此服务器上没有正在处理的其他请求。由于将“并发任务”设置为2,因此在处理任务时是否在中看到任何缓慢。您在使用此方法时还面临其他问题吗???。我们在使用此方法时没有遇到任何问题,并且我们发现任务的吞吐量对我们来说已经足够好了。我遇到过此问题,也没有完整的解决方案,但我发现它可能与数据库上的写争用问题有关。消除跨线程对相同对象的写入可能会有所帮助。