本章节从批处理大小、是否跨AZ生产、副本数、同步/异步复制的维度进行分布式消息服务Kafka版的性能测试,对比客户端消息生产速率和服务端CPU消耗,得出性能测试结果。
- 测试场景一(批处理大小):相同的Kafka实例和Topic,不同的消息大小
- 测试场景二(是否跨AZ生产):相同的Kafka实例和Topic,生产客户端和服务端在不同的AZ中
- 测试场景三(副本数):相同的Kafka实例,不同的Topic副本数
- 测试场景四(同步/异步复制):相同的Kafka实例,不同复制机制的Topic
表1 测试参数
分区数 |
副本数 |
是否同步复制 |
batch.size |
是否跨AZ生产 |
3 |
1 |
否 |
1KB |
否 |
3 |
1 |
否 |
16KB |
否 |
3 |
1 |
否 |
1KB |
是 |
3 |
3 |
是 |
1KB |
否 |
3 |
3 |
否 |
1KB |
否 |
测试环境
进行性能测试前,您需要先构建如下的测试环境:
- 购买一个Kafka实例,参数信息如下,其他参数保持默认,购买方法请参考购买Kafka实例。
表2
参数名称 |
示例取值 |
区域 |
中国-香港 |
可用区 |
可用区1 |
版本 |
2.7 |
部署架构 |
集群 |
代理规格 |
kafka.2u4g.cluster |
代理数量 |
3 |
单代理存储空间 |
超高I/O,200GB |
虚拟私有云 |
选择虚拟私有云 |
子网 |
选择子网 |
安全组 |
选择安全组 |
访问方式 |
保持默认 |
实例名称 |
kafka-test |
企业项目 |
default |
购买完成后,在实例详情页获取Kafka实例的内网明文连接地址。

- 在购买的Kafka实例中,创建如下参数的3个Topic,具体步骤请参考创建Kafka Topic。
- Topic-01:3分区1副本,异步复制
- Topic-02:3分区3副本,异步复制
- Topic-03:3分区3副本,同步复制
- 获取测试工具。
获取Kafka命令行工具2.7.2版本。
- 购买客户端服务器。
购买如下参数的2台ECS服务器,具体步骤请参考
购买弹性云服务器。
- 区域、可用区、虚拟私有云、子网、安全组与Kafka实例保持一致,规格为4U8G,Linux系统的ECS。
- 区域、虚拟私有云、子网、安全组与Kafka实例保持一致,“可用区”为“可用区2”,规格为4U8G,Linux系统的ECS。
购买完成ECS后,需要在ECS中完成以下配置:
测试脚本
./kafka-producer-perf-test.sh --producer-props bootstrap.servers={连接地址} acks=1 batch.size={batch.size} linger.ms=0 --topic {Topic名称} --num-records {num-records} --record-size 1024 --throughput 102400
表3 脚本参数说明
参数名称 |
说明 |
bootstrap.servers |
购买Kafka实例中获取的Kafka实例的地址。 |
acks |
消息主从同步策略,acks=1表示异步复制消息,acks=-1表示同步复制消息。 |
batch.size |
每次批量发送消息的大小(单位为字节)。 |
linger.ms |
两次发送时间间隔。 |
topic |
创建Topic中设置的Topic名称。 |
num-records |
总共需要发送的消息数。 |
record-size |
每条消息的大小。 |
throughput |
每秒发送的消息数。 |
测试步骤
- 登录客户端服务器,进入“kafka_2.12-2.7.2/bin”目录下,执行以下脚本。
batch.size=1KB,执行脚本如下:
./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-01 --num-records 8000000 --record-size 1024 --throughput 102400
执行结果如下:
8000000 records sent, 34128.673632 records/sec (33.33 MB/sec), 879.91 ms avg latency, 4102.00 ms max latency, 697 ms 50th, 2524 ms 95th, 2888 ms 99th, 4012 ms 99.9th.
客户端消息生产速率=34128
batch.size=16KB,执行脚本如下:
./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=16384 linger.ms=0 --topic Topic-01 --num-records 100000000 --record-size 1024 --throughput 102400
执行结果如下:
100000000 records sent, 102399.318430 records/sec (100.00 MB/sec), 4.72 ms avg latency, 914.00 ms max latency, 1 ms 50th, 5 ms 95th, 162 ms 99th, 398 ms 99.9th.
客户端消息生产速率=102399
- 登录Kafka控制台。
- 单击测试实例名称,进入实例详情页。
- 在左侧导航栏单击“监控 > 监控详情”,进入监控页面。
- 在“节点”页签,查看服务端节点的CPU使用率。
图1 broker-0的CPU使用率(batch.size=1KB)
CPU消耗=58.10%
图2 broker-0的CPU使用率(batch.size=16KB)
CPU消耗=24.10%
图3 broker-1的CPU使用率(batch.size=1KB)
CPU消耗=56.70%
图4 broker-1的CPU使用率(batch.size=16KB)
CPU消耗=25%
图5 broker-2的CPU使用率(batch.size=1KB)
CPU消耗=53.30%
图6 broker-2的CPU使用率(batch.size=16KB)
CPU消耗=23.30%
- 登录客户端服务器,进入“kafka_2.12-2.7.2/bin”目录下,执行以下脚本。
客户端服务器和实例在相同的AZ中,执行脚本如下:
./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-01 --num-records 8000000 --record-size 1024 --throughput 102400
执行结果如下:
8000000 records sent, 34128.673632 records/sec (33.33 MB/sec), 879.91 ms avg latency, 4102.00 ms max latency, 697 ms 50th, 2524 ms 95th, 2888 ms 99th, 4012 ms 99.9th.
客户端消息生产速率=34128
客户端服务器和实例在不同的AZ中,执行脚本如下:
./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-01 --num-records 4000000 --record-size 1024 --throughput 102400
执行结果如下:
4000000 records sent, 8523.042044 records/sec (8.32 MB/sec), 3506.20 ms avg latency, 11883.00 ms max latency, 1817 ms 50th, 10621 ms 95th, 11177 ms 99th, 11860 ms 99.9th.
客户端消息生产速率=8523
- 登录Kafka控制台。
- 单击测试实例名称,进入实例详情页。
- 在左侧导航栏单击“监控 > 监控详情”,进入监控页面。
- 在“节点”页签,查看服务端节点的CPU使用率。
图7 broker-0的CPU使用率(客户端服务器和实例在相同的AZ中)
CPU消耗=58.10%
图8 broker-0的CPU使用率(客户端服务器和实例在不同的AZ中)
CPU消耗=17.20%
图9 broker-1的CPU使用率(客户端服务器和实例在相同的AZ中)
CPU消耗=56.70%
图10 broker-1的CPU使用率(客户端服务器和实例在不同的AZ中)
CPU消耗=16.70%
图11 broker-2的CPU使用率(客户端服务器和实例在相同的AZ中)
CPU消耗=53.30%
图12 broker-2的CPU使用率(客户端服务器和实例在不同的AZ中)
CPU消耗=18.80%
- 登录客户端服务器,进入“kafka_2.12-2.7.2/bin”目录下,执行以下脚本。
1副本,执行脚本如下:
./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-01 --num-records 8000000 --record-size 1024 --throughput 102400
执行结果如下:
8000000 records sent, 34128.673632 records/sec (33.33 MB/sec), 879.91 ms avg latency, 4102.00 ms max latency, 697 ms 50th, 2524 ms 95th, 2888 ms 99th, 4012 ms 99.9th.
客户端消息生产速率=34128
3副本,执行脚本如下:
./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-02 --num-records 4000000 --record-size 1024 --throughput 102400
执行结果如下:
4000000 records sent, 14468.325219 records/sec (14.13 MB/sec), 2069.99 ms avg latency, 7911.00 ms max latency, 846 ms 50th, 6190 ms 95th, 6935 ms 99th, 7879 ms 99.9th.
客户端消息生产速率=14468
- 登录Kafka控制台。
- 单击测试实例名称,进入实例详情页。
- 在左侧导航栏单击“监控 > 监控详情”,进入监控页面。
- 在“节点”页签,查看服务端节点的CPU使用率。
图13 broker-0的CPU使用率(1副本)
CPU消耗=58.10%
图14 broker-0的CPU使用率(3副本)
CPU消耗=86.70%
图15 broker-1的CPU使用率(1副本)
CPU消耗=56.70%
图16 broker-1的CPU使用率(3副本)
CPU消耗=80.60%
图17 broker-2的CPU使用率(1副本)
CPU消耗=53.30%
图18 broker-2的CPU使用率(3副本)
CPU消耗=86.20%
- 登录客户端服务器,进入“kafka_2.12-2.7.2/bin”目录下,执行以下脚本。
异步复制,执行脚本如下:
./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-02 --num-records 4000000 --record-size 1024 --throughput 102400
执行结果如下:
4000000 records sent, 14468.325219 records/sec (14.13 MB/sec), 2069.99 ms avg latency, 7911.00 ms max latency, 846 ms 50th, 6190 ms 95th, 6935 ms 99th, 7879 ms 99.9th.
客户端消息生产速率=14468
同步复制,执行脚本如下:
./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=-1 batch.size=1024 linger.ms=0 --topic Topic-03 --num-records 1000000 --record-size 1024 --throughput 102400
执行结果如下:
1000000 records sent, 3981.937930 records/sec (3.89 MB/sec), 7356.98 ms avg latency, 19013.00 ms max latency, 6423 ms 50th, 14381 ms 95th, 18460 ms 99th, 18975 ms 99.9th.
客户端消息生产速率=3981
- 登录Kafka控制台。
- 单击测试实例名称,进入实例详情页。
- 在左侧导航栏单击“监控 > 监控详情”,进入监控页面。
- 在“节点”页面,查看服务端节点的CPU使用率。
图19 broker-0的CPU使用率(异步复制)
CPU消耗=86.70%
图20 broker-0的CPU使用率(同步复制)
CPU消耗=60%
图21 broker-1的CPU使用率(异步复制)
CPU消耗=80.60%
图22 broker-1的CPU使用率(同步复制)
CPU消耗=55.20%
图23 broker-2的CPU使用率(异步复制)
CPU消耗=86.20%
图24 broker-2的CPU使用率(同步复制)
CPU消耗=50%
测试结果
表4 测试结果
分区数 |
副本数 |
是否同步复制 |
batch.size |
是否跨AZ生产 |
客户端消息生产速率 |
服务端CPU消耗(broker-0) |
服务端CPU消耗(broker-1) |
服务端CPU消耗(broker-2) |
3 |
1 |
否 |
1KB |
否 |
34128 |
58.10% |
56.70% |
53.30% |
3 |
1 |
否 |
16KB |
否 |
102399 |
24.10% |
25.00% |
23.30% |
3 |
1 |
否 |
1KB |
是 |
8523 |
17.20% |
16.70% |
18.80% |
3 |
3 |
是 |
1KB |
否 |
3981 |
60.00% |
55.20% |
50.00% |
3 |
3 |
否 |
1KB |
否 |
14468 |
86.70% |
80.60% |
86.20% |
通过上表的测试结果,得出以下结论,仅供参考:
- 生产请求的batch.size变大16倍时,客户端消息生产速率增加,服务端CPU消耗减少。
- 同AZ生产和跨AZ生产相比,客户端消息生产速率增加,服务端CPU消耗也随之增加。
- 副本从1变成3时,客户端消息生产速率下降较多,服务端CPU消耗增加。
- 异步复制的Topic和同步复制的Topic相比,客户端消息生产速率增加,服务端CPU消耗也随之增加。