AWS Elastic Beanstalk Worker 在长时间计算期间不活动后超时

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk Worker 在长时间计算期间不活动后超时【英文标题】:AWS Elastic Beanstalk Worker timing out after inactivity during long computation 【发布时间】:2014-08-21 16:59:32 【问题描述】:

我正在尝试使用 Amazon Elastic Beanstalk 运行一个非常长的数值模拟 - 长达 20 小时。当我告诉它做一个简短的 20 秒模拟时,代码运行良好。但是,当运行更长的时间时,我收到错误“以下实例在允许的命令超时时间内没有响应(它们最终可能仍会自行完成)”。

浏览网页后,在我看来,问题在于 Elastic Beanstalk 允许工作进程最多运行 30 分钟,然后由于实例没有响应(即完成模拟)而超时。一些人提出的解决方案是每 30 秒左右发送一条消息,以便“ping”Elastic Beanstalk,让它知道模拟进展顺利,因此它不会超时,这会让我运行一个很长的工作进程。所以我有几个问题:

    这是正确的方法吗? 如果是这样,我将向项目添加什么代码或配置以使其停止提前终止? 如果没有,我如何才能在 AWS 或更一般的云上顺利运行 12 小时以上的模拟?

添加信息 谢谢你的反馈,罗希特。为了提供更多信息,我将 Python 与 Flask 一起使用。

• 我确实在使用带有 SQS 队列的 Elastic Beanstalk 工作层

• 在我的代码中,我正在运行可变长度的模拟 - 从短至 20 秒到长达 20 小时。 Elastic Beanstalk 所做的工作中有 99% 是运行模拟。另外 1% 涉及保存结果、发送电子邮件等。

• 模拟本身涉及使用生成许多随机数和使用我定义的对象。我在这里大量使用 numpy。

如果我能提供更多信息,请告诉我。我非常感谢您的帮助:)

【问题讨论】:

您是否将 Elastic Beanstalk 工作程序层与 SQS 队列一起使用?代码的哪一部分需要 20 秒?你能澄清一下吗? 【参考方案1】:

在与比我更了解这方面的朋友交谈后,我解决了这个问题。这有点粗略,但完成了工作。为了将来参考,这里是我所做的概要:

1) 编写了一个使用 Amazon 的 boto 库连接到我的 SQS 队列的主脚本。编写了一个无限 while 循环以每 60 秒轮询一次队列。当队列中有消息时,运行模拟,然后继续循环

2) 借用一个漂亮的 /etc/init.d/ 模板将我的脚本作为守护进程运行 (http://blog.scphillips.com/2013/07/getting-a-python-script-to-run-in-the-background-as-a-service-on-boot/)

3) 使我的主脚本和 (2) 中的脚本可执行

4) 设置一个 cron 作业,以确保脚本在失败时能够重新启动。

再次感谢 Rohit 抽出时间帮助我。我很高兴我仍然使用 Amazon,即使 Elastic Beanstalk 不是适合这项工作的工具

【讨论】:

这是否意味着工作实例不断轮询并因此被收取使用费?【参考方案2】:

根据您的问题,您似乎遇到了启动超时,因为启动期间在您的实例上运行的某些命令需要 30 多分钟。 正如here 所解释的,您可以调整aws:elasticbeanstalk:command 命名空间中的Timeout 选项。这可以具有 1 到 1800 之间的值。这意味着如果您的命令在 30 分钟内完成,您将不会看到此错误。这些命令最终可能会如错误消息所述完成,但由于 Elastic Beanstalk 在指定时间段内未收到响应,因此它不知道您的实例发生了什么。

如果您可以添加有关您的用例的更多详细信息,将会很有帮助。你在启动过程中运行了哪些命令?显然您正在使用 ebextensions 来启动需要很长时间的命令。是否可以在后台运行这些命令,或者您是否需要在服务器启动期间运行这些命令?

如果您正在运行 Tomcat Web 应用程序,您还可以使用类似 servlet init 方法来运行应用程序引导代码。此代码可能需要很长时间,而不会给您此错误消息。

【讨论】:

Rohit,感谢您的帮助。我在启动期间运行的命令到底是什么意思?消息从 Amazon SQS 传递到我称为“run_model()”的函数,该函数执行各种操作。它的主要工作是调用另一个函数——这是所有繁重的工作所在——并保存该函数的结果,然后返回一个响应。我可以异步调用这个函数吗? 感谢您澄清您正在使用工作层。上面的解释是针对 ebxtensions 中的命令超时的。根据您的说明,在您的工作人员环境中处理 SQS 消息似乎需要 20 秒到 20 小时。我理解正确吗? Rohit,我不确定你在 ebextensions 中的命令是什么意思。我没有 .ebextensions 文件夹(也许这是我的问题?)。执行工作进程应该处理的模拟可能需要 20 秒到 20 小时(但我控制需要多长时间)。是否有可能正在运行其他我不知道的命令? .ebextensions 是可选的。你在需要的时候使用它。我怀疑你有 ebextensions,它的命令需要很长时间。但既然你没有这一点,那就没有实际意义了。要深入研究此错误:“以下实例在允许的命令超时时间内没有响应(它们最终可能仍会自行完成)”,您能否对日志进行快照:docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 以查看详细的日志消息? 这里是日志文件。我在那里搜索了大量消息,但没有成功:(elasticbeanstalk-us-east-1-277193063490.s3.amazonaws.com/…【参考方案3】:

不幸的是,无法从 SQS 队列中“处理消息”超过 12 小时(参见ChangeVisibilityTimeout 的描述)。 在这种情况下,这种方法不太适合您的应用程序。我遇到了同样的问题。

正确的做法:我不知道。但是,我建议另一种方法,您从队列中获取消息,分离线程或进程以运行长时间运行的模拟,然后删除消息(表示成功处理)。在这种方法中,请注意不要在一台机器上关闭过多线程,还要注意在模拟结束之前关闭机器,因为队列消息已被删除。 最后说明:您的问题措辞出色且足​​够详细:)

【讨论】:

谢谢杰森,感谢您的意见。我上周通过吃青蛙解决了这个问题并学习了如何使用裸 EC2 实例【参考方案4】:

对于那些希望运行短于 10 小时的作业的人,需要提及的是,当前的不活动超时限制为 36000 秒,因此正好是 10 小时,而不是 30 分钟,就像在网络上的帖子中提到的那样(导致我认为需要如上所述的解决方法)。

查看文档:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features-managing-env-tiers.html

可以在这里找到一篇非常好的文章:https://dev.to/rizasaputra/understanding-aws-elastic-beanstalk-worker-timeout-42hi

【讨论】:

以上是关于AWS Elastic Beanstalk Worker 在长时间计算期间不活动后超时的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk CLI 安装错误

text AWS Elastic Beanstalk

HTTPS Elastic Beanstalk (AWS) 到 Android

AWS Elastic Beanstalk 无法担任角色

AWS Elastic Beanstalk

AWS Elastic Beanstalk chown PythonPath 错误