kafka 的配置先进,详尽,复杂,想要进行全面的性能调优需要的掌握信息,
这里只记录一下我在日常工作使用中走过的坑和经验来对kafka集群进行优化常用的几点。
1.JVM的优化
java相关系统自然离不开JVM的优化。首先想到的肯定是Heap Size的调整。
vim bin/kafka-server-start.sh
调整KAFKA_HEAP_OPTS="-Xmx16G -Xms16G”的值
2.推荐配置:一般HEAP SIZE的大小不超过主机内存的50%。
# broker处理消息的最大线程数
num.network.threads=9
# broker处理磁盘IO的线程数
num.io.threads=16
2.网络和ios操作线程配置优化:
num.network.threads主要的处理网络IO,读写缓冲区数据,基本没有io等待,配置线程数量为cpu核数加1。
num.io.threads主要进行磁盘io操作,高峰期可能有些io等待,因此配置需要大些。配置线程数量为cpu核数2。
socket.request.max.bytes=2147483600
3.socket server可接受数据大小(防止OOM异常):
4.推荐配置:
根据自己业务数据包的大小适当调大。这里取值是int类型的,而受限于java int类型的取值范围又不能太大:
java int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1,不能超出,超出之后报错:org.apache.kafka.common.config.ConfigException: Invalid value 8589934592 for configuration socket.request.max.bytes: Not a number of type INT。
# 每当producer写入10000条消息时,刷数据到磁盘
log.flush.interval.messages=10000
4.log数据文件刷盘策略
5.推荐配置:
每个follow从leader拉取消息进行同步数据,follow同步性能由这几个参数决定,分别为:
拉取线程数(num.replica.fetchers):fetcher配置多可以提高follower的I/O并发度,单位时间内leader持有更多请求,相应负载会增大,需要根据机器硬件资源做权衡,建议适当调大;
最小字节数(replica.fetch.min.bytes):一般无需更改,默认值即可;
最大字节数(replica.fetch.max.bytes):默认为1MB,这个值太小,推荐5M,根据业务情况调整:
最大等待时间(replica.fetch.wait.max.ms):follow拉取频率,频率过高,leader会积压大量无效请求情况,无法进行数据同步,导致cpu飙升。配置时谨慎使用,建议默认值,无需配置。
7.分区数量配置
num.partitions=5
推荐配置:
默认partition数量1,如果topic在创建时没有指定partition数量,默认使用此值。Partition的数量选取也会直接影响到Kafka集群的吞吐性能,配置过小会影响消费性能,建议改为5。