【kafka学习之四】kafka集群性能测试
kafka集群的性能受限于JVM参数、服务器的硬件配置以及kafka的配置,因此需要对所要部署kafka的机器进行性能测试,根据测试结果,找出符合业务需求的最佳配置。
1、kafka broker jVM参数
kafka broker jVM 是由脚本kafka-server-start.sh中参数KAFKA_HEAP_OPTS来控制的,如果不设置,默认是1G
可以在首行添加KAFKA_HEAP_OPTS配置,注意如果要使用G1垃圾回收器,堆内存最小4G,jdk至少jdk7u51以上
举例:
export KAFKA_HEAP_OPTS="-Xmx4G -Xms4G -Xmn2G -XX:PermSize=64m -XX:MaxPermSize=128m -XX:SurvivorRatio=6 -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly"
2、kafka集群性能测试工具 (基于kafka_2.11-0.11.0.0)
kafka自带的测试工具:针对生产者的kafka-producer-perf-test.sh和针对消费者的kafka-consumer-perf-test.sh
2.1 kafka-producer-perf-test.sh
参数说明:
--help 显示帮助
--topic topic名称
--record-size 每条消息的字节数
--throughput 消息吞吐量,每秒钟发送的消息数
--producer-props 生产者相关的配置属性, 如bootstrap.servers,client.id等,这些配置优先于--producer.config
--producer.config 生产者配置文件,producer.properties
--print-metrics 在测试结束时打印出度量值。(默认值: false)
--num-records 总共需要发送的消息数量
--payload-file 要发送消息所在的文件名,文件里是要发送消息数据,与num-records两者至少选一个
--payload-delimiter payload-file中消息分隔符
--transactional-id 用于测试并发事务的性能 (默认值:performance-producer-default-transactional-id)
--transaction-duration-ms 事务最大值,当超过这个时间 就会提交事务 (默认值: 0)
举例:
./bin/kafka-producer-perf-test.sh --topic test-pati3-rep2 --throughput 500000 --num-records 1500000 --record-size 1000 --producer.config config/producer.properties --producer-props bootstrap.servers=10.1.8.16:9092,10.1.8.15:9092,10.1.8.14:9092 acks=1
测试维度:可以调整JVM、分区数、副本数、throughput--吞吐量、record-size--消息大小、acks--副本响应模式、compression-codec--压缩方式
[cluster@PCS101 bin]$ ./kafka-producer-perf-test.sh --topic REC-CBBO-MSG-TOPIC --throughput 50000 --num-records 150000 --record-size 102400 --producer-props bootstrap.servers=134.32.123.101:9092,134.32.123.102:9092,134.32.123.103:9092 acks=all --print-metrics
12786 records sent, 2556.7 records/sec (249.68 MB/sec), 122.1 ms avg latency, 231.0 max latency.
14827 records sent, 2965.4 records/sec (289.59 MB/sec), 109.4 ms avg latency, 291.0 max latency.
14587 records sent, 2917.4 records/sec (284.90 MB/sec), 111.6 ms avg latency, 374.0 max latency.
14292 records sent, 2858.4 records/sec (279.14 MB/sec), 114.8 ms avg latency, 389.0 max latency.
14557 records sent, 2910.8 records/sec (284.26 MB/sec), 112.3 ms avg latency, 354.0 max latency.
14524 records sent, 2904.2 records/sec (283.62 MB/sec), 113.1 ms avg latency, 362.0 max latency.
14686 records sent, 2937.2 records/sec (286.84 MB/sec), 111.4 ms avg latency, 348.0 max latency.
14637 records sent, 2927.4 records/sec (285.88 MB/sec), 111.8 ms avg latency, 378.0 max latency.
15186 records sent, 3037.2 records/sec (296.60 MB/sec), 107.9 ms avg latency, 343.0 max latency.
14584 records sent, 2916.2 records/sec (284.79 MB/sec), 112.4 ms avg latency, 356.0 max latency.
150000 records sent, 2888.170055 records/sec (282.05 MB/sec), 112.78 ms avg latency, 389.00 ms max latency, 11 ms 50th, 321 ms 95th, 340 ms 99th, 375 ms 99.9th.
最后一条记录是个总体统计:发送的总记录数,平均的TPS(每秒处理的消息数),平均延迟,最大延迟, 然后我们将发送记录数最小的那一行作为生产者瓶颈(红色记录)
如果加上--print-metrics 最后会打印metrics统计信息:
Metric Name Value
kafka-metrics-count:count:{client-id=producer-} : 84.000
producer-metrics:batch-size-avg:{client-id=producer-} : 102472.000
producer-metrics:batch-size-max:{client-id=producer-} : 102472.000
producer-metrics:batch-split-rate:{client-id=producer-} : 0.000
producer-metrics:buffer-available-bytes:{client-id=producer-} : 33554432.000
producer-metrics:buffer-exhausted-rate:{client-id=producer-} : 0.000
producer-metrics:buffer-total-bytes:{client-id=producer-} : 33554432.000
producer-metrics:bufferpool-wait-ratio:{client-id=producer-} : 0.857
producer-metrics:compression-rate-avg:{client-id=producer-} : 1.000
producer-metrics:connection-close-rate:{client-id=producer-} : 0.000
producer-metrics:connection-count:{client-id=producer-} : 5.000
producer-metrics:connection-creation-rate:{client-id=producer-} : 0.091
producer-metrics:incoming-byte-rate:{client-id=producer-} : 87902.611
producer-metrics:io-ratio:{client-id=producer-} : 0.138
producer-metrics:io-time-ns-avg:{client-id=producer-} : 69622.263
producer-metrics:io-wait-ratio:{client-id=producer-} : 0.329
producer-metrics:io-wait-time-ns-avg:{client-id=producer-} : 166147.404
producer-metrics:metadata-age:{client-id=producer-} : 55.104
producer-metrics:network-io-rate:{client-id=producer-} : 1557.405
producer-metrics:outgoing-byte-rate:{client-id=producer-} : 278762290.882
producer-metrics:produce-throttle-time-avg:{client-id=producer-} : 0.000
producer-metrics:produce-throttle-time-max:{client-id=producer-} : 0.000
producer-metrics:record-error-rate:{client-id=producer-} : 0.000
producer-metrics:record-queue-time-avg:{client-id=producer-} : 110.963
producer-metrics:record-queue-time-max:{client-id=producer-} : 391.000
producer-metrics:record-retry-rate:{client-id=producer-} : 0.000
producer-metrics:record-send-rate:{client-id=producer-} : 2724.499
producer-metrics:record-size-avg:{client-id=producer-} : 102487.000
producer-metrics:record-size-max:{client-id=producer-} : 102487.000
producer-metrics:records-per-request-avg:{client-id=producer-} : 3.493
producer-metrics:request-latency-avg:{client-id=producer-} : 7.011
producer-metrics:request-latency-max:{client-id=producer-} : 56.000
producer-metrics:request-rate:{client-id=producer-} : 778.702
producer-metrics:request-size-avg:{client-id=producer-} : 357989.537
producer-metrics:request-size-max:{client-id=producer-} : 614940.000
producer-metrics:requests-in-flight:{client-id=producer-} : 0.000
producer-metrics:response-rate:{client-id=producer-} : 778.731
producer-metrics:select-rate:{client-id=producer-} : 1979.326
producer-metrics:waiting-threads:{client-id=producer-} : 0.000
producer-node-metrics:incoming-byte-rate:{client-id=producer-, node-id=node--} : 19.601
producer-node-metrics:incoming-byte-rate:{client-id=producer-, node-id=node--} : 3.956
producer-node-metrics:incoming-byte-rate:{client-id=producer-, node-id=node-} : 31220.396
producer-node-metrics:incoming-byte-rate:{client-id=producer-, node-id=node-} : 29885.883
producer-node-metrics:incoming-byte-rate:{client-id=producer-, node-id=node-} : 26920.163
producer-node-metrics:outgoing-byte-rate:{client-id=producer-, node-id=node--} : 1.324
producer-node-metrics:outgoing-byte-rate:{client-id=producer-, node-id=node--} : 0.436
producer-node-metrics:outgoing-byte-rate:{client-id=producer-, node-id=node-} : 98518580.943
producer-node-metrics:outgoing-byte-rate:{client-id=producer-, node-id=node-} : 82114190.903
producer-node-metrics:outgoing-byte-rate:{client-id=producer-, node-id=node-} : 98518948.091
producer-node-metrics:request-latency-avg:{client-id=producer-, node-id=node--} : 0.000
producer-node-metrics:request-latency-avg:{client-id=producer-, node-id=node--} : 0.000
producer-node-metrics:request-latency-avg:{client-id=producer-, node-id=node-} : 6.891
producer-node-metrics:request-latency-avg:{client-id=producer-, node-id=node-} : 5.135
producer-node-metrics:request-latency-avg:{client-id=producer-, node-id=node-} : 11.202
producer-node-metrics:request-latency-max:{client-id=producer-, node-id=node--} : -Infinity
producer-node-metrics:request-latency-max:{client-id=producer-, node-id=node--} : -Infinity
producer-node-metrics:request-latency-max:{client-id=producer-, node-id=node-} : 56.000
producer-node-metrics:request-latency-max:{client-id=producer-, node-id=node-} : 46.000
producer-node-metrics:request-latency-max:{client-id=producer-, node-id=node-} : 55.000
producer-node-metrics:request-rate:{client-id=producer-, node-id=node--} : 0.036
producer-node-metrics:request-rate:{client-id=producer-, node-id=node--} : 0.018
producer-node-metrics:request-rate:{client-id=producer-, node-id=node-} : 279.365
producer-node-metrics:request-rate:{client-id=producer-, node-id=node-} : 340.136
producer-node-metrics:request-rate:{client-id=producer-, node-id=node-} : 160.233
producer-node-metrics:request-size-avg:{client-id=producer-, node-id=node--} : 36.500
producer-node-metrics:request-size-avg:{client-id=producer-, node-id=node--} : 24.000
producer-node-metrics:request-size-avg:{client-id=producer-, node-id=node-} : 352658.869
producer-node-metrics:request-size-avg:{client-id=producer-, node-id=node-} : 241415.634
producer-node-metrics:request-size-avg:{client-id=producer-, node-id=node-} : 614858.709
producer-node-metrics:request-size-max:{client-id=producer-, node-id=node--} : 49.000
producer-node-metrics:request-size-max:{client-id=producer-, node-id=node--} : 24.000
producer-node-metrics:request-size-max:{client-id=producer-, node-id=node-} : 614940.000
producer-node-metrics:request-size-max:{client-id=producer-, node-id=node-} : 512460.000
producer-node-metrics:request-size-max:{client-id=producer-, node-id=node-} : 614940.000
producer-node-metrics:response-rate:{client-id=producer-, node-id=node--} : 0.036
producer-node-metrics:response-rate:{client-id=producer-, node-id=node--} : 0.018
producer-node-metrics:response-rate:{client-id=producer-, node-id=node-} : 279.486
producer-node-metrics:response-rate:{client-id=producer-, node-id=node-} : 340.284
producer-node-metrics:response-rate:{client-id=producer-, node-id=node-} : 160.233
producer-topic-metrics:byte-rate:{client-id=producer-, topic=REC-CBBO-MSG-TOPIC} : 279184829.991
producer-topic-metrics:compression-rate:{client-id=producer-, topic=REC-CBBO-MSG-TOPIC} : 1.000
producer-topic-metrics:record-error-rate:{client-id=producer-, topic=REC-CBBO-MSG-TOPIC} : 0.000
producer-topic-metrics:record-retry-rate:{client-id=producer-, topic=REC-CBBO-MSG-TOPIC} : 0.000
producer-topic-metrics:record-send-rate:{client-id=producer-, topic=REC-CBBO-MSG-TOPIC} : 2724.548
2.2 kafka-consumer-perf-test.sh
参数说明:
--help 显示帮助
--batch-size 在单个批处理中写入的消息数。(默认值: 200)
--broker-list 使用新的消费者是必需的,如果使用老的消费者就不是必需的
--supported codec 压缩方式 NoCompressionCodec 为 0(默认0不压缩), GZIPCompressionCodec 为 1, SnappyCompressionCodec 为 2, LZ4CompressionCodec 为3
--consumer.config 指定消费者配置文件 consumer.properties
--date-format 用于格式化时间字段的格式化字符串 (默认: yyyy-MM-dd HH:mm:ss:SSS)
--fetch-size 单个消费请求获取的数据字节量(默认: 1048576 (1M))
--from-latest 如果消费者还没有已建立的偏移量, 就从日志中的最新消息开始, 而不是最早的消息。
--group 消费者组id (默认值: perf-consumer-29512)
--hide-header 跳过打印数据头的统计信息
--message-size 每条消息大小(默认: 100字节)
--messages 必需,要获取的消息总数量
--new-consumer 使用新的消费者 这是默认值
--num-fetch-threads 获取消息的线程数 (默认: 1)
--print-metrics 打印出指标。这只适用于新的消费者。
--reporting-interval 打印报告信息的间隔 (以毫秒为单位,默认值: 5000)
--show-detailed-stats 根据报告间隔配置的每个报告间隔报告统计信息。
--socket-buffer-size TCP 获取信息的缓存大小(默认: 2097152 (2M))
--threads 处理线程数 (默认: 10)
--topic 必需 主题名称
--zookeeper zk清单,当使用老的消费者时必需
测试维度:调整以上参数值
[cluster@PCS101 bin]$ ./kafka-consumer-perf-test.sh --topic REC-CBBO-MSG-TOPIC --messages 500000 --message-size 102400 --batch-size 50000 --fetch-size 1048576 --num-fetch-threads 17 --threads 10 --zookeeper 134.32.123.101:2181,134.32.123.102:2181,134.32.123.103:2181 --print-metrics
start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec
2018-10-01 09:50:43:707, 2018-10-01 09:51:40:553, 84487.7018, 1486.2559, 874167, 15377.8102
消费者瓶颈:1486.2559 MB.sec,15377nMsg.sec
3、可视化性能分析工具-Kafka Manager(Yammer Metrics)
--后续更新
【kafka学习之四】kafka集群性能测试的更多相关文章
- kafka学习总结之集群部署和zookeeper
1. 集群部署 kafka集群的瓶颈主要在网络和磁盘上:kafka依赖于zookeeper,zookeeper集群的节点采用奇数个,3个节点允许一个节点失败,5个节点允许2个节点失败. 图 1 ka ...
- kafka学习(二)-zookeeper集群搭建
zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是h ...
- Kafka学习之四 Kafka常用命令
Kafka常用命令 以下是kafka常用命令行总结: 1.查看topic的详细信息 ./kafka-topics.sh -zookeeper 127.0.0.1:2181 -describe -top ...
- ELK+Kafka学习笔记之搭建ELK+Kafka日志收集系统集群
0x00 概述 关于如何搭建ELK部分,请参考这篇文章,https://www.cnblogs.com/JetpropelledSnake/p/9893566.html. 该篇用户为非root,使用用 ...
- Kafka设计解析(十七)Kafka 0.11客户端集群管理工具AdminClient
转载自 huxihx,原文链接 Kafka 0.11客户端集群管理工具AdminClient 很多用户都有直接使用程序API操作Kafka集群的需求.在0.11版本之前,kafka的服务器端代码(即添 ...
- 在Centos 7上安装配置 Apche Kafka 分布式消息系统集群
Apache Kafka是一种颇受欢迎的分布式消息代理系统,旨在有效地处理大量的实时数据.Kafka集群不仅具有高度可扩展性和容错性,而且与其他消息代理(如ActiveMQ和RabbitMQ)相比,还 ...
- CentOS7.4搭建kafka单结点和集群
操作系统选择 CentOS7.4x86-64(操作系统的x86_64是跟CPU有关的,最早AMD公司开发出了一款向下兼容x86CPU,向上又扩充了指令集,具有了64位CPU的特性,这款CPU后来改名为 ...
- Kafka的3节点集群详细启动步骤(Zookeeper是外装)
首先,声明,kafka集群是搭建在hadoop1.hadoop2和hadoop3机器上. kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载.安装和配置(图文详细教程)绝对干货 如下分 ...
- RabbitMQ和Kafka的高可用集群原理
前言 小伙伴们,通过前边文章的阅读,相信大家已经对RocketMQ的基本原理有了一个比较深入的了解,那么大家对当前比较常用的RabbitMQ和Kafka是不是也有兴趣了解一些呢,了解的多一些也不是坏事 ...
随机推荐
- iOS - 开发一套代码多个app展示不同图标和名称
引言 公司项目重构之后,有了相对比较完善的开发体系,首先git分支分为日常.预发.生产三个主要分支,开发阶段都在日常(daily)分支下开相应功能的feature分支,开发完再合并. 我的iOS工程需 ...
- Docker 利用registry创建私有仓库
一.Docker-registry镜像 下载地址 官方镜像下载比较慢,因为人品问题一直下载不成功,所以选择了国内的镜像. daocloud: https://hub.daocloud.io/ 还有 ...
- 阿里云liunx-ubuntu安装中文
ubuntu安装中文支持--让你的ub真正变成中文作者: 来源:ubuntu在安装的时候会提示选择语言,但选择了中文之后,系统里面还有很多英文并不是ub对中文支持不好 你根本就没有安装中文支持~ 首先 ...
- 模拟线程安全的售票案例(java)
package try51.thread.safe; import java.util.ArrayList; import java.util.Random; import java.util.con ...
- 线性DP总结(LIS,LCS,LCIS,最长子段和)
做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...
- java 中静态变量(类变量)与实例变量 静态方法与实例方法
静态变量: 在类内部中,方法的外部声明的对象而且加上static; 实例变量: 在类内部中,声明不需要加static; 比如: public class Demo{ int i1=0; static ...
- MySQL复制日常维护与管理
一.复制一些常见设置 1.mysql复制启动时参数: mysql启动时的参数包括:master_host,master_port,master_user,master_password,master_ ...
- train_test_split, 关于随机抽样和分层抽样
https://zhuanlan.zhihu.com/p/49991313 在将样本数据分成训练集和测试集的时候,应当谨慎地考虑一下是采用纯随机抽样,还是分层抽样. 通常,数据集如果足够大,纯随机抽样 ...
- 火币Huobi API Websocket
本文介绍火币Huobi API Websocket WebSocket API简介 WebSocket协议是基于TCP的一种新的网络协议.它实现了客户端与服务器之间在单个 tcp 连接上的全双工通信, ...
- PHP、Lua中的 尾调用
在程序设计中,递归(Recursion)是一个很常见的概念,合理使用递归,可以提升代码的可读性,但同时也可能会带来一些问题. 下面以阶乘(Factorial)为例来说明一下递归的用法,实现语言是PHP ...