跳至内容

如何解决 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 使用率高的情况。

当大量主题的分区分布不均匀时,代理可能会遇到高流量。或者,生产者无法将数据均匀地分配到所有分区。要解决此问题,请检查您的生产者分区键并更新集群配置。然后配置分区键,使一个分区获得的数据不会超过其他分区。

当使用者组非常频繁地提交偏移量时,您也可能会遇到高流量。来自偏移量提交的流量会影响代理。要解决此问题,请减少使用者组的数量或升级您的实例的大小。

每个代理的分区数超过推荐值

如果每个代理的分区数超过推荐值,则您的集群过载。当您的集群过载时,您无法执行以下操作:

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

当分区过多时,CPU 利用率可能会很高并出现性能下降的情况。

要解决此问题,请执行以下操作:

  • 删除陈旧或未使用的主题,使分区数保持在建议的限值范围内。要识别未使用的主题,请打开主题级监控,并在主题级别检查 BytesInPerSecBytesOutPerSec 指标,以查看是否有流量流经该主题。如果没有流量流过,则可以删除未使用的主题。
  • 将代理实例类型纵向扩展到可容纳所需分区数的类型。此外,添加更多代理并重新分配分区。

**注意:**必须运行 kafka-reassign-partitions 命令来重新分配分区。当您添加代理时,Amazon MSK 不会自动重新分配分区。

使用 T 实例类型

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

请务必监控 Amazon CloudWatch 中可突增实例的 CPU 积分余额指标

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

其他可能的原因

与客户端的连接数偏多

以下任何 Amazon CloudWatch 指标的峰值都可能导致代理 CPU 使用率增加:

  • ConnectionCount
  • ConnectionCreationRate
  • ConnectionCloseRate

要对此问题进行故障排除,请在 Amazon CloudWatch 上监控这些指标。然后,根据需要减少连接数或纵向扩展代理类型。

Amazon MSK 检测到代理故障并从中恢复

当 Amazon MSK 检测到代理故障并执行补丁等自动维护操作时,CPU 使用率会增加。一旦 Amazon MSK 完成集群操作,CPU 使用率就会降至正常使用水平。

用户请求更改代理类型或版本升级

当用户请求更改代理类型或版本升级时,Amazon MSK 会部署滚动工作流程,一次只能让一个代理离线。当具有主分区的代理脱机时,Apache Kafka 会重新分配分区领导权,以将工作重新分配给集群中的其他代理。监控这些代理的 CPU 使用率并确保集群中有足够的 CPU 余量来容忍操作事件。

由于数据分配偏差,一个或多个代理的 CPU 使用率偏高

由于数据分配偏差,一个或多个代理的 CPU 使用率可能偏高。例如,如果您写入六个代理中的两个代理,并且这些代理消耗最多,则它们的 CPU 使用率就会更高。要解决此问题,请确保使用轮询技术来使集群中的分区分布良好。

要查看 Apache Kafka 集群控制器如何在集群中分配分区,请运行以下命令:

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 使用率。要解决此问题,请增大抓取间隔。最佳做法是每个代理每分钟不超过 1 次抓取,以保持 Amazon MSK 集群的性能。默认情况下,抓取间隔每 10-15 秒出现一次。

AWS 官方已更新 3 个月前