通过扩展节点资源,来达到千万TPS等海量吞吐诉求,实际上,我们大部分业务可能不需要那么大规模,对于集群资源有限,如何最大可能调优kafka集群性能,下面我们从broker、producer、consumer 3个方面性能相关参数详细解析,实测解密集群如何最大性能化

网络模型相关参数

关于kafka网络模型的原理请查看上一篇博客:Kafka 源码解析之 Server 1+N+M 网络处理模型(一)

参数描述

参数 默认值 说明
num.network.threads 3 Broker用来处理网络请求的网络线程数目;主要处理网络io,读写缓冲区数据,基本没有io等待,配置线程数量为cpu核数加1.
num.io.threads 8 broker用来处理请求的I/O线程的数目;主要进行磁盘io操作,高峰期可能有些io等待,因此配置需要大些。配置线程数量为cpu核数2倍,最大不超过3倍
queued.max.requests 500 在网络线程停止读取新请求之前,可以排队等待I/O线程处理的最大请求个数;超过该值,network thread阻塞

Kafka网络通信层的完整框架图如下图所示:
Kafka Server 网络通信框架图

Kafka使用NIO自己实现了网络层的代码, 而不是采用netty, mina等第三方的网络框架。从性能上来讲,这一块的代码不是性能的瓶颈。

它采用IO多路复用和多线程下的Reactor模式,主要实现类包括SocketServer, Acceptor, Processor和RequestChannel。

Kafka的服务器由SocketServer实现,它是一个NIO的服务器,线程模型如下:

  • 1个Acceptor线程负责处理新连接
  • N个Processor线程, 每个processor都有自己的selector,负责从socket中读取请求和发送response
  • M个Handler线程处理请求,并产生response给processor线程

可以从上面的图形中看到Acceptor, Processor和Handler的功能
其中num.network.threads是控制上图中的Processor Thread的个数, num.io.threads是控制API Thread的个数,queued.max_requests是控制Request Channel队列的容量

日志保存策略

参数 默认值 说明
log.retention.hours 168 当kafka broker的被写入海量消息后,会生成很多数据文件,占用大量磁盘空间,kafka默认是保留7天,建议根据磁盘情况配置,避免磁盘撑爆
log.segment.bytes 1GB 段文件配置1GB,有利于快速回收磁盘空间,重启kafka加载也会加快(如果文件过小,则文件数量比较多,kafka启动时是单线程扫描目录(log.dir)下所有数据文件)

Replica 副本配置

参数 默认值 推荐值 说明
replica.socket.receive.buffer.bytes 64*1024 256k~2M 备份时向leader发送网络请求时的socket receive buffer
replica.fetch.max.bytes 1024*1024 根据业务实际配置 备份时每次fetch的最大值
num.replica.fetchers 1 默认值 从leader备份数据的线程数
  1. replica.socket.receive.buffer.bytes: 同TCP buffer的分析,不少于BDP 窗口大小,时延高的可以设大一点
  2. replica.fetch.max.bytes: 不得少于发往broker消息的最大长度(message.max.bytes),需要根据业务实际消息的大小,然后设大一点即可。

  3. num.replica.fetchers: 复制fetch线程设置大一点可以提升获取性能,同时增加备机的IO并行性,但设置太大也没用反而导致空闲,这个同Consumer的fetch thread一样。

在ACK=1的情况下,Produce/Consumer的性能与复制关系不是很大,除非受到网络的瓶颈

参考

  1. kafka性能调优解密(一)– Broker端
  2. Kafka Broker配置(0.10版)
  3. Kafka测试及性能调优详细总结
  4. kafka性能参数和压力测试揭秘
  5. kafka性能调优