kafka(十五:kafka的监控和优化)

高吞吐TPS:    Broker 端进程或 Client 端应用程序每秒能处理的字节数或消息数。

如下是kafka吞吐量优化

Broker 端参数 num.replica.fetchers 表示的是 Follower 副本用多少个线程来拉取消息,默认使用 1 个线程。如果你的 Broker 端 CPU 资源很充足,不妨适当调大该参数值,加快 Follower 副本的同步速度。因为在实际生产环境中,配置了 acks=all 的 Producer 程序吞吐量被拖累的首要因素,就是副本同步性能。增加这个值后,可以看到 Producer 端程序的吞吐量增加。

避免经常性的 Full GC。目前不论是 CMS 收集器还是 G1 收集器,其 Full GC 采用的是 Stop The World 的单线程收集策略,非常慢,因此一定要避免。

在 Producer 端,如果要改善吞吐量,通常的标配是增加消息批次的大小以及批次缓存时间,即 batch.size 和 linger.ms。目前它们的默认值都偏小,特别是默认的 16KB 的消息批次大小一般都不适用于生产环境。假设你的消息体大小是 1KB,默认一个消息批次也就大约 16 条消息,显然太小了。我们还是希望 Producer 能一次性发送更多的消息。

除了这两个,最好把压缩算法也配置上,以减少网络 I/O 传输量,从而间接提升吞吐量。当前,和 Kafka 适配最好的两个压缩算法是LZ4 和 zstd。

同时优化目标是吞吐量,最好不要设置 acks=all 以及开启重试。前者引入的副本同步时间通常都是吞吐量的瓶颈,而后者在执行过程中也会拉低 Producer 应用的吞吐量。

最后,如果多个线程中共享一个 Producer 实例,就可能会碰到缓冲区不够用的情形。倘若频繁地遭遇 TimeoutException:Failed to allocate memory within the configured max blocking time 这样的异常,那么你就必须显式地增加buffer.memory参数值,确保缓冲区总是有空间可以申请的。

Consumer 端提升吞吐量的手段是有限的,可以利用多线程方案增加整体吞吐量,也可以增加 fetch.min.bytes 参数值。默认是 1 字节,表示只要 Kafka Broker 端积攒了 1 字节的数据,就可以返回给 Consumer 端,这实在是太小了。

 

低延迟:    Producer 端发送消息到 Broker 端持久化完成之间的时间间隔。这个指标也可以代表端到端的延时,也就是从 Producer 发送消息到 Consumer 成功消费该消息的总时长。

在 Broker 端要增加 num.replica.fetchers 值以加快 Follower 副本的拉取速度,减少整个消息处理的延时。

在 Producer 端,我们希望消息尽快地被发送出去,因此不要有过多停留,所以必须设置 linger.ms=0,同时不要启用压缩。因为压缩操作本身要消耗 CPU 时间,会增加消息发送的延时。另外,最好不要设置 acks=all。Follower 副本同步往往是降低 Producer 端吞吐量和增加延时的首要原因。

在 Consumer 端保持 fetch.min.bytes=1 即可,也就是说,只要 Broker 端有能返回的数据,立即令其返回给 Consumer,缩短 Consumer 消费延时。

 

kafka优化的点:

1 JVM层   

1. 设置堆大小。

如何为 Broker 设置堆大小,将 JVM 堆大小设置成 6~8GB

这个大小已经被证明是非常合适的。如果想精确调整的话可以查看 GC log,特别是关注 Full GC 之后堆上存活对象的总大小,然后把堆大小设置为该值的 1.5~2 倍。如果你发现 Full GC 没有被执行过,手动运行 jmap -histo:live < pid > 就能人为触发 Full GC。

2.GC 收集器的选择。

使用 G1 收集器方便省事,至少比 CMS 收集器的优化难度小得多。另外,不论使用哪种收集器,都要竭力避免 Full GC。在 G1 中,Full GC 是单线程运行的,它真的非常慢。如果你的 Kafka 环境中经常出现 Full GC,你可以配置 JVM 参数 -XX:+PrintAdaptiveSizePolicy,来探查一下到底是谁导致的 Full GC。

使用 G1 还很容易碰到的一个问题,就是大对象,反映在 GC 上的错误,就是“too many humongous allocations”。所谓的大对象,一般是指至少占用半个区域大小的对象。举个例子,如果你的区域尺寸是 2MB,那么超过 1MB 大小的对象就被视为是大对象。要解决这个问题,除了增加堆大小之外,还可以适当地增加区域大小,设置方法是增加 JVM 启动参数 -XX:+G1HeapRegionSize=N。默认情况下,如果一个对象超过了 N/2,就会被视为大对象,从而直接被分配在大对象区。如果 Kafka 环境中的消息体都特别大,就很容易出现这种大对象分配的问题。

2 框架层

Broker 端调优就是合理地设置 Broker 端参数值以匹配生产环境。尽力保持客户端版本和 Broker 端版本一致。不要小看版本间的不一致问题,它会令 Kafka 丧失很多性能收益,比如 Zero Copy。

图中蓝色的 Producer、Consumer 和 Broker 的版本是相同的,它们之间的通信可以享受 Zero Copy 的快速通道;相反,一个低版本的 Consumer 程序想要与 Producer、Broker 交互的话,就只能依靠 JVM 堆中转一下,丢掉了快捷通道,就只能走慢速通道了。因此,在优化 Broker 这一层时,只要保持服务器端和客户端版本的一致,就能获得很多性能收益了。

3 应用程序层 

  • 不要频繁地创建 Producer 和 Consumer 对象实例。构造这些对象的开销很大,尽量复用它们。
  • 用完及时关闭。这些对象底层会创建很多物理资源,如 Socket 连接、ByteBuffer 缓冲区等。不及时关闭的话,势必造成资源泄露。
  • 合理利用多线程来改善性能。Kafka 的 Java Producer 是线程安全的,你可以放心地在多个线程中共享同一个实例;而 Java Consumer 虽不是线程安全的。

 

kafka监控工具AdminClient 

  1. 主题管理:包括主题的创建、删除和查询。
  2. 权限管理:包括具体权限的配置与删除。
  3. 配置参数管理:包括 Kafka 各种资源的参数设置、详情查询。所谓的 Kafka 资源,主要有 Broker、主题、用户、Client-id 等。
  4. 副本日志管理:包括副本底层日志路径的变更和详情查询。
  5. 分区管理:即创建额外的主题分区。
  6. 消息删除:即删除指定位移之前的分区消息。
  7. Delegation Token 管理:包括 Delegation Token 的创建、更新、过期和详情查询。
  8. 消费者组管理:包括消费者组的查询、位移查询和删除。
  9. Preferred 领导者选举:推选指定主题分区的 Preferred Broker 为领导者。

kafka监控的点:

1 CPU的使用率    top  查看的 %CPU   真实含义是进程使用的所有 CPU 的平均使用率,只是 top 命令在显示的时候转换成了单个 CPU。因此,如果是在多核的主机上,这个值就可能会超过 100。在这个例子中,我的主机有 4 个 CPU 核,总 CPU 使用率是 102.3,那么,平均每个 CPU 的使用率大致是 25%。

2  JVM监控    监控 JVM 进程主要是全面了解 Broker 进程。比如,Broker 进程的堆大小是多少、各自的新生代和老年代是多大?用的是什么 GC 回收器?这些监控指标和配置参数林林总总,至少要搞清楚 Broker 端 JVM 进程的 Minor GC 和 Full GC 的发生频率和时长、活跃对象的总大小和 JVM 上应用线程的大致总数,因为这些数据都是日后调优 Kafka Broker 的重要依据。

 JVM 进程监控 3 个指标:

  1. Full GC 发生频率和时长。这个指标评估 Full GC 对 Broker 进程的影响。长时间的停顿会令 Broker 端抛出各种超时异常。
  2. 活跃对象大小。这个指标是设定堆大小的重要依据,同时它还能细粒度地调优 JVM 各个代的堆大小。
  3. 应用线程总数。这个指标帮助了解 Broker 进程对 CPU 的使用情况。

自 0.9.0.0 版本起,社区将默认的 GC 收集器设置为 G1,而 G1 中的 Full GC 是由单线程执行的,速度非常慢。因此一定要监控 Broker GC 日志,即以 kafkaServer-gc.log 开头的文件。注意不要出现 Full GC 的字样。一旦发现 Broker 进程频繁 Full GC,可以开启 G1 的 -XX:+PrintAdaptiveSizePolicy 开关。

 

kafka监控框架: kafka manager算是比较nice的。

JMXTrans + InfluxDB + Grafana    kafka manager

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值