处理 AWS EC2 上的 CPU 使用率突然激增

问题描述 投票:0回答:1

我们有一个设置,运行 2 个 EC2 实例(具有大量 CPU、c7i 或 M5zn 的实例类型),每个实例运行一个 ECS 任务。该任务运行针对车辆和作业的优化算法 - 这意味着它将定期且突然需要处理单个大请求,从而导致 CPU 使用率非常高。

由于程序运行的性质,它会使用您投入的所有 CPU,只要需要计算解决方案,就会跳转到 100% CPU。如果我们给它更多的 CPU,它仍然会达到 100% - 它只会更快地完成任务。

当我们还使用该程序运行大量小得多的请求时,就会出现问题。目前,我们每秒处理约 50 个较小的请求。当我们运行大型请求时,EC2 CPU 达到 100%,然后我们在尝试处理大量较小请求的系统上出现一系列超时。即使我们有多个 EC2 实例,每个实例上都有多个 ECS 任务 - 一些请求将不可避免地被路由到 CPU 利用率为 100% 的 ECS/EC2 任务,这意味着响应时间会受到巨大影响。响应时间将从约 50 毫秒变为数秒。

我们不能仅仅增加受影响系统的超时时间,因为需要维持它们的响应时间。

我还没有找到一个好的解决方案,有谁知道一种聪明的方法来以某种方式限制这些大请求的 CPU 使用率 - 允许其他请求仍然得到服务,同时减慢较大请求的处理时间(这是可以接受的)。或者可能迫使 AWS 将流量从当前处于 100% 状态的 ECS/EC2 实例路由出去 - 这必须对突然的峰值做出非常快速的反应。

请注意,处理这些非常大的请求是在我们的控制范围内,因为我们决定何时触发它们 - 目前计划在夜间发生,因此会随着 CPU 需求的突然激增而影响系统。

amazon-web-services amazon-ec2 amazon-ecs load-balancing cpu
1个回答
0
投票

任务放置约束和任务组可用于根据资源需求隔离工作负载,这确保 CPU 密集型任务不会影响较小的任务。

在您的 ECS 实例 ASG 中(我假设您正在使用一个包含一组混合实例的实例),您可以根据工作负载类型来标记实例,比如说

Type=tinyTask
,其他则使用
Type=bigTask

在 ECS 定义中,您可以指定

placementConstraints
并且您应该使用如下约束:

"placementConstraints": [
    {
      "type": "memberOf",
      "expression": "attribute:Type == bigTask"
    }
  ],

对于较小的:

  "placementConstraints": [
    {
      "type": "memberOf",
      "expression": "attribute:Type == tinyTask"
    }
  ],

请注意,放置约束具有约束力,它们可以阻止任务放置,docs

任务安排策略是尽最大努力。 Amazon ECS 仍在尝试 即使最佳放置选项是放置任务 不可用。然而,任务放置限制具有约束力,并且它们 可以阻止任务放置。

还有一个问题是,为什么在这种情况下不使用 ECS Fargate ?

© www.soinside.com 2019 - 2024. All rights reserved.