Kafka 生产集群监控调优之路
Kafka 生产集群监控调优之路
1. 参考
-
官方监控: https://kafka.apache.org/23/documentation.html#monitoring
-
参考 3: 基于 JMXConnectorFactory.connect(rmiUrl,null) 自定义获取 kafka producer/consumer/connect/stream 的监控指标
2. 部署监控
-
注:本文使用环境为 Jmx(openjdk8) + Prometheus-v2.30.3 + Grafana-8.2.2 + kafka_2.12_2.5.0,建议 kafka 不低于此版本,如低版本
0.10.0.2
不存在kafka_controller_kafkacontroller_controllerstate
等指标,会导致后续 grafana 表盘异常,需手动编辑 Kafka Metrics -> Settings -> Variables 替换为如label_values(kafka_controller_kafkacontroller_activecontrollercount{job="$job"}, instance)
才可以。 -
参考 Linkedin: Kafka - Monitor producer metrics using JMX, Prometheus and Grafana
2.1下载 jmx_exporter
# 方式1: 源码编译
cd /tmp
git clone https://github.com/prometheus/jmx_exporter.git
git checkout 0.16.1
mvn clean -DskipTests -T 2C
# 方式2: 从maven仓库下载
curl -OL https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar
2.2 Attach 到 Kafka 进程
- a) 停机
$KAFKA_HOME/bin/kafka-server-stop.sh
- b) 将下载或编译的 jar 包拷贝到 libs/
cp /tmp/jmx_prometheus_javaagent-0.16.1.jar $KAFKA_HOME/libs/
- c) 配置启动参数
KEY1='exec $base_dir/kafka-run-class.sh $EXTRA_ARGS kafka.Kafka "$@"'
KEY2='export KAFKA_OPTS="-javaagent:/etc/emr/agent-conf/jmx_prometheus_javaagent-0.16.1.jar=10105:/etc/emr/agent-conf/kafka20-jmx-rules.yml"'
sed -i "s#$KEY1#$KEY2\n$KEY1#g" $KAFKA_HOME/bin/kafka-server-start.sh
- d) 下载指标配置
sudo mkdir -p /etc/emr/agent-conf
sudo curl -L -o /etc/emr/agent-conf/kafka20-jmx-rules.yml https://raw.githubusercontent.com/wl4g/prometheus-integration/master/prometheus/kafka/kafka20-jmx-rules.yml
# 或
sudo curl -L -o /etc/emr/agent-conf/kafka20-jmx-rules.yml https://gitee.com/wl4g/prometheus-integration/raw/master/prometheus/kafka/kafka20-jmx-rules.yml
- e) 重启
$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties
- f) 访问指标(prometheus标准格式)
curl http://localhost:10105/
2.3 配置 Grafana dashboard
-
推荐模版
- 11962: Kafka Metrics (2.4k),或从 kafka-metrics-rev4.json 下载然后 Import
3. 总结
-
2.1 使用
jstat <pid>
查看,如果 M 区使用不大、或频繁 FGC 则通常是 Metaspace 区设置过小(默认21M),需增大它:-XX:MetaspaceSize=96m
。 -
2.2 如果是普通 GC 频繁,则可能是并发过大建议调大堆内存 (默认1G) :
# 调大堆内存
sed -i 's/-Xmx1G -Xms1G/-Xmx3G -Xms3G/g' $KAFKA_HOME/bin/kafka-server-start.sh
# 检查配置
cat $KAFKA_HOME/bin/kafka-server-start.sh | grep KAFKA_HEAP_OPTS
# 重启生效
$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/conf/server.properties
-
2.3 查看运行中 JVM 的参数,如:
jinfo -flag MetaspaceSize <pid>
-
2.4 官方 linkedin 生产最繁忙之一的集群配置供参考 (JDK8): https://kafka.apache.org/23/documentation.html#java
-Xmx6g -Xms6g -XX:+UseG1GC
-XX:InitiatingHeapOccupancyPercent=35
-XX:MaxGCPauseMillis=20 -XX:G1HeapRegionSize=16M
-XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80
-XX:MetaspaceSize=96m