我需要解决我的 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 使用率高的情况。
当大量主题的分区分布不均匀时,代理可能会遇到高流量。或者,生产者无法将数据均匀地分配到所有分区。要解决此问题,请检查您的生产者分区键并更新集群配置。然后配置分区键,使一个分区获得的数据不会超过其他分区。
当使用者组非常频繁地提交偏移量时,您也可能会遇到高流量。来自偏移量提交的流量会影响代理。要解决此问题,请减少使用者组的数量或升级您的实例的大小。
每个代理的分区数超过推荐值
如果每个代理的分区数超过推荐值,则您的集群过载。当您的集群过载时,您无法执行以下操作:
- 更新集群配置。
- 更新集群的 Apache Kafka 版本。
- 将集群更新为更小的代理类型。
- 将 AWS Secrets Manager 密钥与具有 SASL/SCRAM 身份验证的集群相关联。
当分区过多时,CPU 利用率可能会很高并出现性能下降的情况。
要解决此问题,请执行以下操作:
- 删除陈旧或未使用的主题,使分区数保持在建议的限值范围内。要识别未使用的主题,请打开主题级监控,并在主题级别检查 BytesInPerSec 和 BytesOutPerSec 指标,以查看是否有流量流经该主题。如果没有流量流过,则可以删除未使用的主题。
- 将代理实例类型纵向扩展到可容纳所需分区数的类型。此外,添加更多代理并重新分配分区。
**注意:**必须运行 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 秒出现一次。