如何解决 Amazon MSK 集群中一个或多个代理上的 CPU 利用率高的问题?
我需要解决我的 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 指标 BytesInPerSec 和 BytesOutPerSec 监控集群的传入和传出流量。如果代理的这些指标值较高或存在偏差,则该代理可能会遇到 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 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前