我的 EC2 实例很慢、无响应或不可访问,但我的 CPU 和内存消耗并不高,这是为什么?

上次更新日期:2022 年 8 月 25 日

我在连接到使用 Amazon Elastic Block Store (Amazon EBS) 通用型 SSD (gp2) 根卷的 Amazon Elastic Compute Cloud (Amazon EC2) 实例时遇到问题。尽管 CPU 和内存并未被完全使用,但连接速度很慢或发生超时。

简短描述

当 CPU 和内存未被充分使用时,导致 EC2 实例缓慢或无响应的可能原因有很多种,具体包括:

  • 您的实例所依赖的外部服务出现问题。
  • 磁盘受到重击。
  • 网络连接出现问题。

本解决方案讨论一个常见的原因:gp2 根卷上的 I/O 突增积分耗尽。在大多数区域,gp2 是根卷的默认存储驱动器。有关更多信息,请参阅 Amazon EBS 卷类型

解决方案

检查 I/O 突增积分余额

  1. 打开 Amazon EC2 控制台
  2. 在导航窗格中选择 Instances(实例),然后选择该实例。
  3. Storage(存储)选项卡上,选择根设备的卷 ID
  4. 选择该 EBS 卷的 Monitoring(监控)选项卡,然后找到Burst Balance(突增余额)指标。如果突增余额为 0%,说明所有的突增积分已经用完,该卷无法突增到超出基准性能水平的水平。

使用以下任意一种方法来解决此问题。

    估算 IOPS 需求,然后修改卷来支持该负载

    1. 在 Amazon CloudWatch 中找到根 EBS 卷的 VolumeReadOpsVolumeWriteOps 指标。有关更多信息,请参阅搜索可用指标
    2. 使用 CloudWatch Sum 统计数据来获取 VolumeReadOpsVolumeWriteOps 的峰值水平。然后将这两个数字相加。例如:
      VolumeReadOps = 737000
      VolumeWriteOps
      = 199000
      合计 = 936,000
    3. 要估算您需要的 IOPS 数量,用测量期间内的秒数除以上一步中的合计值。
      示例:
      测量期间 = 5 分钟(300 秒)
      936000/300 = 3120 IOPS

    gp2 卷的基准性能以每 GiB 卷大小 3 IOPS 的速度线性扩展。这意味着,一个 3120 IOPS 的卷必须扩展至 1040GiB 才能提高性能 (3120/3 = 1040)。

    或者,您也可以更改卷,将 gp2 改为预置 IOPS SSD (io1)。使用 io1 卷时,您无需增加卷大小即可指定需要的 IOPS 数量。有关何时使用 io1 卷的更多信息,请参阅预置 IOPS SSD 卷。有关 gp2io1 卷的成本比较,请参阅 Amazon EBS 定价

    更改工作负载的分配方式

    如果一个 EC2 实例上有多个应用程序,这些应用程序会竞争根 EBS 卷的 IOPS。随着工作负载的逐渐增长,IOPS 需求也会增加。要提高实例性能,请考虑为您的应用程序使用额外的非根 EBS 卷。此外,请考虑将根卷仅用于操作系统。

    如果在调整卷大小和工作负载分配后仍遇到 EC2 实例连接问题,请参阅排查实例的连接问题