Kafka 两个高性价比的参数调优
Kafka 集群上的流量越来越大,有些用到Kafka的应用在压测时,发现性能波动较大(具体指标是produce请求的响应时间),因此需要进行问题定位和性能调优。
其实有些参数需要调优是已知的,只不过集群压力不大时没有动力去做,现在时机成熟了。
Kafka 版本:2.0.0
测试集群配置:三台机器,机器上无其它服务
本文主要介绍两个参数调优的方法和效果,一是IO线程数,二是Java Heap大小。
num.io.threads 参数调优
根据我的粗浅理解,Kafka 的 IO 线程就是实际上处理请求的线程。
我们监控了集群的JMX指标,从监控上看,有些机器的 IO 线程空闲百分比已经比较低了(小于0.3,这里名字不太准确,其实是小于 30%的意思,流量大的时候这个值更小):
看起来需要增加线程数量,对应的参数为 num.io.threads
,根据官方文档:https://kafka.apache.org/20/documentation.html#brokerconfigs,这个参数的默认值是8,从Ambari里查看也确实是这个值,调整生产集群前需要先在测试环境验证一下。
测试验证
未调整参数时,依次逐个在多台测试机器上启动kafka-producer-perf-test脚本,观察IO线程空闲比的变化,随着发送消息的机器数增多,这个参数应该会不断下降,当下降到0或非常接近0时停止启动脚本,记下此时测试机的数量,11台机器。
调整参数,将
num.io.threads
从 8 修改为16,调整一台重启一台,两次重启之间间隔一段时间,避免服务中断;同样在11台测试机上,执行上面的测试命令,参数保持一致,观察IO线程空闲比指标的变化。
修改参数前:
修改参数后:
可以看到,调整了 num.io.threads
后,以同样的压力向集群发送数据,IO线程的空闲比稳定在0.4左右,而不是之前的0,说明调整此参数是有效的。
Java Heap 调优
Kafka broker 默认的堆大小是1G,不是很大,感觉是需要增大一点的,同样的,在调整前后需要观察一下相关的指标,这里我选择GC相关的指标。
使用 jstat 查看 GC 情况
对某个Java进程使用jstat命令时,要使用启动该Java进程的用户,不然root也没用。
登录到某台broker上,先用 ps
获取到 Kafka 的进程号,一般Kafka进程是kafka用户起的,切换到kafka用户:
接下来就可以使用 jstat 命令了,jstat 参数挺多,此处不一一列举,我就用一个我觉得有用的:
实际的执行结果:
每一列的含义:
看起来比较值得关注的两个指标是 YGC 和 YGCT,需要在调整Java Heap大小前后观察这两个指标的变化。
在Ambari中调整Kafka Java Heap的方法是,在Advanced kafka-env下修改kafka-env template,添加一行:
从1G增大到6G。
调整前后YGC和YGCT的变化如下表所示:
从结果看,增大Heap确实减少了Young GC的次数和时间。
公众号:dashujuxuetu
版权声明: 本文为 InfoQ 作者【大数据学徒】的原创文章。
原文链接:【http://xie.infoq.cn/article/2ca3cbeb4a366ca29826974b9】。
本文遵守【CC BY-NC-SA】协议,转载请保留原文出处及本版权声明。
评论