【问题标题】:Amazon Service to submit CPU intensive taskAmazon Service 提交 CPU 密集型任务
【发布时间】:2014-08-03 00:19:36
【问题描述】:

我有一个在 AWS 微实例中 24/7 全天候运行的 Web 应用程序,它运行良好。

有时(每天 10 到 50 次)我需要在 CPU 密集型任务中处理大量数据(存储在 RDS 上)。这对我的微型实例来说太过分了。

为此任务启动 EC2 服务器似乎不是一个好主意,因为这些任务必须在用户请求时按需执行,而且我需要低延迟(少于 10 秒)。

是否有任何亚马逊服务可以让我提交我的任务并利用更高的 CPU 容量?

请记住,我的任务需要从 RDS 读取大量数据。

【问题讨论】:

    标签: amazon-web-services amazon-ec2


    【解决方案1】:

    您可以在一天中的特定截止时间将所有这些任务 10 到 50 排队,并启动一个实例来处理它,并在您完成处理后终止该实例。其中的调度部分可以由 Micro 实例完成。

    一旦Micro实例启动High Compute Instance;然后其余的可以由 High Compute Instance 执行;一旦所有要处理的队列为空,您就可以终止该实例。

    这就像 0 Instance to 1 Instance over a schedule。

    【讨论】:

    • 谢谢。很抱歉,我没有明确说明这些任务必须在用户请求时按需完成,这就是我需要低延迟的原因。
    • 如果它是按需的,最好设置一个自动扩展设置来执行 CPU 密集型任务,你可以从单个小实例开始,如果你需要更多的权力,可以横向扩展;如果你没有负载,你可以回到单实例
    【解决方案2】:

    这取决于您愿意支付的成本、处理的复杂性、服务的未来规模、预先计算结果的能力等等。

    一种选择是拥有一个更大的实例(或在您的服务规模扩大的情况下的实例池),准备好您可以触发它们的处理。您可以通过使用预留实例定价 (http://aws.amazon.com/ec2/purchasing-options/reserved-instances/) 来降低这台机器的成本,或者使用 Spot 实例 (http://aws.amazon.com/ec2/purchasing-options/spot-instances/) 甚至更好。使用 Spot,您有时会面临无法启动和运行实例的风险,您需要使用按需实例来支持它。

    这可能是一个更昂贵的解决方案,但随着您有越来越多的此类工作在运行,“每个工作的成本”正在急剧下降。

    另一种选择是将处理卸载到不同的服务。例如,如果您可以使用 DynamoDB 或 Redis 等外部服务的查询语法运行计算,则可以继续使用您的微实例来触发查询。例如,带有 ElastiCache 的 Redis 可以进行复杂的数据操作,如排序集交集等。您确实需要确保您的数据也在其他数据存储中,然后编写查询。

    另一种选择是预先计算这些计算。这实际上取决于您需要运行的作业类型。如果您可以提前准备这些输出,并且仅使用从计算时间到请求时间的最新数据更新它们的结果,那么在没有这些不可预测的 CPU 峰值的情况下,您的计算机也可以更容易地为它做好准备。

    【讨论】:

    • 我不认为为几个任务保留实例具有成本效益,而且我已经按需丢弃了启动实例。这就是为什么我正在寻找可以提交任务的服务。我认为 Data Pipeline 可能是要走的路,但我不确定它是否合适,特别是它是否会立即启动我的任务。
    • Data Pipeline 可以使用现有资源(已运行的实例或集群)或为您启动它们。它没有在您的实例之外提供现成的资源。
    • 很高兴知道。我想我不会在 Amazon 服务之间找到我想要的东西,这都是关于 EC2 实例的。
    【解决方案3】:

    我们为此使用了 AWS Batch,主要是因为它优于其他选项。除了 AWS Batch,我们还考虑了其​​他服务器 AWS Lambda,为每个任务使用单独的服务器等等。

    但我们最终还是选择了 AWS Batch,原因有很多:

    1. 在 AWS Batch 中,所有进程都是完全隔离的。这意味着,这些任务不会相互影响,也不会破坏工作流程。
    2. 您可以设置最小值。和最大。你想用完的内存
    3. AWS Batch 支持容器,如果您已经使用容器,则可以更轻松地进行集成
    4. 您还可以为不同的任务创建队列,以更好地控制您的资源和费用。
    5. AWS Batch 非常经济实惠,这意味着您只需为所用的东西付费。

    它也很容易设置。这是关于如何为每个用户发射火箭的快速代码 sn-p。欲了解更多信息,请访问:https://fulcrum.rocks/blog/cpu-intensive-tasks

    `const comand = "npm run rocket"
    const newJob = await new Promise((resolve, reject) => {
        batch.submitJob(
            {
                jobName: "your_important_job",
                jobDefinition: "killer_process",
                jobQueue: "night_users",
                timeout: {
                    attemptDurationSeconds: 600
                },
                retryStrategy: {
                    attempts: 1
                },
                containerOverrides: {
                    vcpus: 2,
                    memory: 2048,
                    command: [comand]
                }
            },
            (err, data) => {
                if (err) {
                    console.error(err.message);
                    reject(err);
                }
                resolve(data);
            }
        );
    });
    `
    

    【讨论】:

    • 在 14 年中期最初提出这个问题时,Lambda 尚未启动。我认为对于我的用例而言,Lambda 将是完美的解决方案。感谢您介绍 AWS Batch,我不知道它的存在,它似乎是 Lambda 的一个非常灵活的替代方案。
    • 哦,对了。没有注意到这是在 14 年。是的,AWS Batch 非常方便,我们更喜欢它而不是 Lambda。但是,我不能否认 Lambda 也是一个出色的解决方案,非常适合小型任务。
    猜你喜欢
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2020-06-16
    • 2017-04-10
    • 2011-06-15
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多