Amazon Service提交CPU密集型任务

时间:2014-06-12 15:33:06

标签: amazon-web-services amazon-ec2

我在AWS微型实例中有一个24/7运行的Web应用程序,它运行正常。

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

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

这就像计划中的0实例到1实例。

答案 1 :(得分:0)

这取决于您愿意支付的费用,处理的复杂程度,服务的未来规模,预先计算结果的能力等等。

一个选项是拥有一个更大的实例(或在服务规模的情况下实例池),准备进行处理以触发它们。您可以使用竞价型实例(http://aws.amazon.com/ec2/purchasing-options/reserved-instances/)使用预留实例定价(http://aws.amazon.com/ec2/purchasing-options/spot-instances/)甚至更好地降低此计算机的成本。有了这些风险,您可能会遇到以下风险,即您无法启动并运行实例,并且您需要使用按需实例支持它。

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

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

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

答案 2 :(得分:0)

我们之所以使用AWS Batch,主要是因为它位于其他选项之上。除了AWS Batch,我们还考虑了其​​他服务器AWS Lambda,它们为每个任务使用单独的服务器,依此类推。

但是由于种种原因,我们最终选择了AWS Batch:

  1. 在AWS Batch中,所有进程都是完全隔离的。这意味着,这些任务不会互相影响,也不会破坏工作流程。
  2. 您可以设置最小值。和最大您要用完的内存
  3. AWS Batch支持容器,如果您已经使用容器,则使集成变得更容易
  4. 您还可以为不同的任务创建队列,以更好地控制您的资源和费用。
  5. AWS Batch具有很高的价格效益,这意味着您可以用所用的东西付费。

设置起来也很容易。这是有关如何为每个用户发射火箭的快速代码段。有关更多信息,请访问此处: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);
        }
    );
});
`