kafka优化–JVM参数配置优化

原文:http://mdba.cn/2016/12/16/jvm%E5%8F%82%E6%95%B0%E9%85%8D%E7%BD%AE%E4%BC%98%E5%8C%96/

主要是启动脚本和log4j基本参数的设置和优化,这些参数藏的比较深。

1、JVM参数配置优化

如果使用的CMS GC算法,建议JVM Heap不要太大,在4GB以内就可以。JVM太大,导致Major GC或者Full GC产生的“stop the world”时间过长,导致broker和zk之间的session超时,比如重新选举controller节点和提升follow replica为leader replica。

JVM也不能过小,否则会导致频繁地触发gc操作,也影响Kafka的吞吐量。另外,需要避免CMS GC过程中的发生promotion failure和concurrent failure问题。CMSInitiatingOccupancyFraction=70可以预防concurrent failure问题,提前出发Major GC。

Kafka JVM参数可以直接修改启动脚本bin/kafka-server-start.sh 中的变量值。下面是一些基本参数,也可以根据实际的gc状况和调试GC需要增加一些相关的参数。

1
export KAFKA_HEAP_OPTS="-Xmx4G -Xms4G -Xmn2G -XX:PermSize=64m -XX:MaxPermSize=128m  -XX:SurvivorRatio=6  -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly"

需要关注gc日志中的YGC时间以及CMS GC里面的CMS-initial-mark和CMS-remark两个阶段的时间,这些GC过程是“stop the world”方式完成的。

2、打开JMX端口

主要是为了通过JMX端口监控Kafka Broker信息。可以在bin/kafka-server-start.sh中打开JMX端口变量。

1
export JMX_PORT=9999

3、调整log4j的日志级别

如果集群中topic和partition数量较大时,因为log4j的日志级别太低,导致进程持续很长的时间在打印日志。日志量巨大,导致很多额外的性能开销。特别是contoller日志级别为trace级别,这点比较坑。

Tips 通过JMX端口设置log4j日志级别,不用重启broker节点

1
2
3
4
5
6
7
设置日志级别:
java -jar cmdline-jmxclient-0.10.3.jar - localhost:9999 kafka:type=kafka.Log4jController setLogLevel=kafka.controller,INFO
java -jar cmdline-jmxclient-0.10.3.jar - localhost:9999 kafka:type=kafka.Log4jController setLogLevel=state.change.logger,INFO
 
检查日志级别:
java -jar cmdline-jmxclient-0.10.3.jar - localhost:9999 kafka:type=kafka.Log4jController getLogLevel=kafka.controller
java -jar cmdline-jmxclient-0.10.3.jar - localhost:9999 kafka:type=kafka.Log4jController getLogLevel=state.change.logger

你可能感兴趣的:(Kafka)