如何解决 Amazon MSK 集群中一个或多个代理上的 CPU 利用率高的问题?

2 分钟阅读
0

我需要解决我的 Amazon Managed Streaming for Apache Kafka(Amazon MSK)集群中一个或多个代理上的 CPU 利用率高的问题。

解决方法

Amazon MSK 集群的 CPU 总利用率按以下各项之和计算:

  • CPU 在用户空间中所占百分比,由指标 CpuUser 定义
  • CPU 在内核空间中所占百分比,由 CpuSystem 定义

最佳做法是将 CPU 总利用率保持在 60% 以下,以便集群 40% 的 CPU 可用。Apache Kafka 可以根据需要在集群中的代理之间重新分配 CPU 负载。例如,当 Amazon MSK 从代理错误中恢复时,可使用可用 CPU 执行自动维护,如安装补丁。

以下是 Amazon MSK 集群中 CPU 利用率高的一些最常见的原因:

  • 传入或传出流量高。
  • 超过了每个代理的分区数,使集群超载。
  • 您使用的是 T 类型实例。

传入或传出流量高

您可以使用 Amazon CloudWatch 指标 BytesInPerSecBytesOutPerSec 监控集群的传入和传出流量。如果代理的这些指标值较高或存在偏差,则该代理可能会遇到 CPU 使用率高的情况。以下是传入和传出流量高的一些原因:

  • 流量较高的主题的分区数在代理之间分布不均匀。或者,生产者没有将数据均匀地发送到所有分区。请务必检查您的生产者分区密钥并相应地更新集群配置。在配置分区密钥时,确保一个分区获得的数据不会比其他分区多。
  • 使用者组非常频繁地提交偏移。来自偏移提交的流量会影响代理。在这种情况下,您会看到作为 _consumer_offset 主题分区领导者的代理的 MessagesInPerSec 值明显偏高。这是使用者组偏移提交至的目标分区。要解决此问题,请减少使用者组的数量或升级您的实例的大小。

已超过每个代理的分区数

如果每个代理的分区数超过推荐值,则您的集群超载。在这种情况下,您可能无法执行以下操作:

  • 更新集群配置。
  • 更新集群的 Apache Kafka 版本。
  • 将集群更新为更小的代理类型。
  • 将 AWS Secrets Manager 密钥与具有 SASL/SCRAM 身份验证的集群相关联。

由于 CPU 利用率高,分区过多会导致性能下降。这意味着,即使流量极少,每个分区也会使用一定数量的代理资源。要解决此问题,请尝试以下操作:

  • 删除陈旧或未使用的主题,使分区数保持在建议的限值范围内。
  • 将代理实例类型纵向扩展到可容纳所需分区数的类型。另外,尝试添加更多代理并重新分配分区。

请注意,添加代理时不会自动重新分配分区。您必须运行 kafka-reassign-partitions 命令。有关详细信息,请参阅更改集群大小后重新分配分区

您使用的是 T 类型实例

请注意,T 类型实例的基准性能有一些可突增功能。这些实例允许您的基准性能为 20% 的 CPU 利用率。如果超过此值,实例类型就开始使用 CPU 积分。当利用率低于 20% 时,就累积 CPU 积分。

务必在 Amazon CloudWatch 中监控 CPU 积分余额指标。在获得积分后,积分将累积到积分余额中;在花费积分时,即从积分余额中扣除。积分余额的最大限值由实例大小决定。达到此限值后,获得的任何新积分都不再计入余额。对于 T2 标准实例类型,启动积分不计入限值。

CPUCreditBalance 指标显示的 CPU 积分可供实例消费,以突破其基准 CPU 利用率实现突增。实例运行时,CPUCreditBalance 中的积分不会过期。T4g、T3a 或 T3 实例停止后,CPUCreditBalance 值将继续存在七天。七天后,所有累积的积分清零。T2 实例停止后,CPUCreditBalance 值不会继续存在,所有累积的积分清零。CPU 积分指标每五分钟提供一次。

确保监控在 T 类型实例上运行的任何集群的基准 CPU 使用率和积分余额。如果 CPU 使用率超过基线,且再无更多的积分可供花费,则集群会遇到性能问题。

其他原因

  • 与客户端的连接数多: 以下任何 CloudWatch 指标的峰值都可能导致代理的 CPU 使用率增加。要解决此问题,请在 CloudWatch 上监控这些指标。然后,根据需要减少连接数或纵向扩展代理类型。
    • ConnectionCount
    • ConnectionCreationRate
    • ConnectionCloseRate
  • 使用者组的数量多: 如果使用者组的数量多(例如,超过 1000 个),则代理的 CPU 使用率可能会增加。当使用者组提交偏移过于频繁时,也可能导致 CPU 使用率偏高。要解决此问题,请减少使用者组的数量或升级您的实例的大小。
  • Amazon MSK 检测到代理错误并从中恢复: 在这种情况下,Amazon MSK 会执行自动维护操作,如安装补丁,从而增加 CPU 使用率。
  • 用户请求更改代理类型或版本升级: 在这种情况下,Amazon MSK 会部署滚动工作流,一次让一个代理脱机。当具有主分区的代理脱机时,Apache Kafka 会重新分配分区领导权,以将工作重新分配给集群中的其他代理。监控这些代理的 CPU 使用率,确保集群中有足够的 CPU 余量来容忍操作事件。
  • 由于数据分配偏差,一个或多个代理的 CPU 使用率偏高: 例如,如果六个代理中有两个是写入和消耗最多的,它们的 CPU 使用率看起来就会更高。要解决此问题,请确保使用轮循技术来使集群中的分区分布良好。运行 topic describe 命令以查看集群中分区的分布情况。输出可能类似于以下内容:
bin/kafka-topics.sh -bootstrap-server $MYBROKERS --describe --topic my-topic
    Topic:my-topic    PartitionCount:7 ReplicationFactor:3 Configs:
    Topic: my-topic    Partition: 0 Leader: 1 Replicas: 1,3,2 Isr: 1,3,2
    Topic: my-topic    Partition: 1 Leader: 2 Replicas: 2,1,3 Isr: 2,1,3
    Topic: my-topic    Partition: 2 Leader: 3 Replicas: 3,2,1 Isr: 3,2,1
    Topic: my-topic    Partition: 3 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
    Topic: my-topic    Partition: 4 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
    Topic: my-topic    Partition: 5 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
  • 您启用了开放式监控: 如果您使用 Prometheus 启用了开放式监控,并且抓取间隔很短,则可能导致有大量发出的指标。这会导致 CPU 使用率增加。要解决此问题,请增大抓取间隔。
AWS 官方
AWS 官方已更新 1 年前