因为对kafka做了新特性, 需要进行压测, 工作如下:

  1. 机器选择
  2. kafka配置
  3. jmx 指标
  4. prometheus
  5. grafana

详细

1.机器选择

根据 kafka官网配置, 我申请了如下的机器配置

CPU:48c RAM:256G HDD:10T*8 Nic:25G
  • faq: 为什么要这么大内存?

    • 因为kafka通过mmap读写文件, 为了保证写入的数据能够及时、快速的被读取, 依赖OS Cache, 将mmap写入的数据缓存在系统中, 这样, 读取的数据就会在内存中, 而不是磁盘上. 在高并发写+大量partition部署的时候, 为了保证及时、高效的读取, 系统的缓存需要很大. 在线上, 也经常由于 partition数量过多[申请的topic很多, 每个topic的partition混布在不同的broker上,单个broker上的partition负载过多], 会导致读取性能下降, consumer延时升高.

2.Kafka配置

参照 https://docs.confluent.io/current/kafka/deployment.html, 配置gc参数

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx6G -Xms6G"
    export KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:MetaspaceSize=96m -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true"
fi

3.Jmx 指标

在kafka的启动脚本 kafka-server-start.sh 中, 添加如下信息

export JMX_PORT=9999
export KAFKA_OPTS=" -javaagent:$base_dir/jmx_prometheus_javaagent-0.11.0.jar=9990:$base_dir/kafka-agent.yaml"

将[依赖的jar包](“https://github.com/prometheus/jmx_exporter")下载到bin目录下, 同时, 在bin目录下创建配置文件 kafka-agent.yaml

hostPort: 127.0.0.1:9999 # 这里9999为设置的jmx端口
lowercaseOutputName: true

关于魔数:

  • 9999: kafka jmx堆外暴露的端口, jmx_exporter从9999端口从kafka获取jmx数据
  • 9990: jmx_exporter对外暴露的端口, prometheus从 9990端口拉取数据

根据脚本启动后, 可以通过 http://localhost:9990/metrics 进行验证

4.Prometheus

根据官网安装: https://prometheus.io/docs/prometheus/latest/getting_started/ 配置文件添加如下配置

scrape_configs:
  .....  
  - job_name: 'kafka'
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
    - targets: ['KAFKA_IP:9990']

通过浏览器 http://{PROMETHEUS_IP:9090}/graph?g0.range_input=1h&g0.expr=jvm_gc_collection_seconds_sum&g0.tab=0 进行访问

5.Grafana