kafka性能调优解密(三)-- Consumer端

举报
步步清风 发表于 2017/08/22 20:26:46 2017/08/22
【摘要】 前期PUMA千节点系列,讲的是通过扩展节点资源,来达到千万TPS等海量吞吐诉求,实际上,我们大部分业务可能不需要那么大规模,对于集群资源有限,如何最大可能调优kafka集群性能,下面我们从broker、producer、consumer 3个方面性能相关参数详细解析,实测解密PUMA集群如何最大性能化。

Consumer篇

1  fetch.message.max.bytes

1.1 参数描述

1.2 原理分析

这个参数是Consumer每次发起获取消息请求的时候,会发往给broker端指导broker端每次读取partition日志时的最大消息长度。这个值越大有利于减少日志读取的次数,提升broker端获取数据的速度,但越大占的内存也越大。在读取数据时,BoundedByteBufferReceive.readFrom用来申请读取缓存的总大小(byteBufferAllocate), 同时这个设置是针对每个分区的,即共需要的内存为fetch.size * partitionNum
1.3 实测分析

1. broker 创建10个分区的topic

2. 同时启动ProducerConsumer,一起测试

3. 测试Consumer scoket.receiver.buffer.bytes取值为256k 或者2M 这两者在不同fetch.message.max.bytes的区别

10G网卡下,10分区,2k数据,发送1000000, ack都为1, NProducerNConsumer一起跑, Consumer每次从队列开始读取数据,10个线程, bufferMemory32M, Producer默认send buf128k

10分区,4k数据,发送1000000, ack都为1, NProducerNConsumer一起跑, Consumer每次从队列开始读取数据,10个线程, bufferMemory32M, Producer默认send buf128k:

可以看出无论是2k或者4k数据,fetch.size1M~8M之间,Consumer性能都是在峰值范围

结论:

1. 需要根据业务最大消息来配置,比如业务最大4M 这个参数至少配置4M

2. 实测证明,在内存足够的情况下,也不是越大越好。从目前来看1M~8M性能都稳定在峰值附近

2 num.consumer.fetchers

2.1 参数描述

2.2 原理分析

 该参数是用于指定Consumer端用于fetcht数据的线程数(fetch threads),如下图:

Consumer跟根据这个线程个数和Topic的分区数,均匀地分布在这些fetch threads上。增大这些线程能起到一定的提升性能,但是多于分区个数后,就会有线程空闲。

2.3 实测分析

1. 2broker 创建10个分区的topic

2. 同时启动ProducerConsumer,一起测试

3. 通过指定Consumer不同的fetch threads,查看性能结果

10G网卡下,10分区,2k数据,发送1000000, ack都为1, 10Producer10Consumer一起跑, Consumer每次从队列开始读取数据,bufferMemory32M

结论:

1. 从性能上看,10Consumer线程配10Fetch 线程,性能最优

2. 10Fetch线程后面就会有空闲的线程分配不到partition

3  offsets.storage

3.1 参数描述

3.2 原理分析

kafka会记录offsetzk中。但是,zk client apizk的频繁写入是一个低效的操作。0.8.2 kafka引入了native offset storage,将offset管理从zk移出,并且可以做到水平扩展。其原理就是利用了kafkacompacted topicoffsetconsumer group,topicpartion的组合作为key直接提交到compacted topic中。同时Kafka又在内存中维护了的三元组来维护最新的offset信息,consumer来取最新offset信息的时候直接内存里拿即可。当然,kafka允许你快速的checkpoint最新的offset信息到磁盘上。
3.3 实测分析

1. 2broker 创建10个分区的topic

2. 同时启动ProducerConsumer,一起测试

3. 在不同的压力下, 查看offsets.storage保存在zk上性能好还是broker上好

10G网卡下,10分区,2k数据,发送1000000, ack都为1, NProducerNConsumer一起跑, Consumer每次从队列开始读取数据,10个线程, bufferMemory32M, Consumer receiver buffer大小为2M:

从上面的数据来看,存储在zookeeper与存储在kafka,性能峰值相差不

结论:

1.broker节点数不是很多并且对zk节点写入不大的情况下,这个选项对性能影响不是很大,但以后社区会推用存储在kafka,为了避免以后修改,建议值为kafka

尾声

   性能相关的核心参数详解到处就结束了,希望对大家业务应用有帮助。对于应用PUMA或者kafka作为消息总线的用户,应该在实施过程关注过这样的问题:具体业务不同可靠模式下,对于特定硬件及网络,需要多少资源,才能达到业务需要的吞吐量。这个PUMA经过大量实践验证及理论分析,证明可以通过简单测试及公式计算就可以完成业务资源部署评估,相关进一步信息欢迎联系PUMA或持续关注后续的解密,谢谢~

【版权声明】本文为华为云社区原创内容,未经允许不得转载,如需转载请发送邮件至hwclouds.bbs@huawei.com;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。