更新时间:2024-10-25 GMT+08:00

测试Kafka生产速率和CPU消耗

本章节从批处理大小、是否跨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

测试环境

进行性能测试前,您需要先构建如下的测试环境:

  1. 购买一个Kafka实例,参数信息如下,购买方法请参考购买Kafka实例
    • 区域:中国-香港
    • 项目:中国-香港
    • 可用区:可用区1
    • 实例名称:kafka-test
    • 企业项目:default
    • 版本:2.7
    • 代理规格:kafka.2u4g.cluster
    • 代理个数:3
    • 存储空间:超高I/O,200GB
    • 容量阈值策略:自动删除
    • 虚拟私有云:选择虚拟私有云
    • 安全组:选择安全组
    • 内网访问:开启“明文接入”
    • 公网访问:不开启
    • 更多配置:不开启“Smart Connect”和“Kafka自动创建Topic”

    购买完成后,在实例详情页获取Kafka实例的内网明文连接地址。

  2. 在购买的Kafka实例中,创建如下参数的3个Topic,具体步骤请参考创建Kafka Topic
    • Topic-01:3分区1副本,异步复制
    • Topic-02:3分区3副本,异步复制
    • Topic-03:3分区3副本,同步复制
  3. 获取测试工具。

    获取Kafka命令行工具2.7.2版本

  4. 购买客户端服务器。
    购买如下参数的2台ECS服务器,具体步骤请参考购买弹性云服务器
    • 区域、可用区、虚拟私有云、子网、安全组与Kafka实例保持一致,规格为4U8G,Linux系统的ECS。
    • 区域、虚拟私有云、子网、安全组与Kafka实例保持一致,“可用区”为“可用区2”,规格为4U8G,Linux系统的ECS。

    购买完成ECS后,需要在ECS中完成以下配置:

    • 安装Java JDK,并配置JAVA_HOME与PATH环境变量。
      export JAVA_HOME=/root/jdk1.8.0_231 
      export PATH=$JAVA_HOME/bin:$PATH
    • 下载Kafka命令行工具2.7.2版本,并解压。
      tar -zxf kafka_2.12-2.7.2.tgz

测试脚本

./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
  • bootstrap.servers:购买Kafka实例中获取的Kafka实例的地址。
  • acks:消息主从同步策略,acks=1表示异步复制消息,acks=-1表示同步复制消息。
  • batch.size:每次批量发送消息的大小(单位为字节)。
  • linger.ms:两次发送时间间隔。
  • topic:创建Topic中设置的Topic名称。
  • num-records:总共需要发送的消息数。
  • record-size:每条消息的大小。
  • throughput:每秒发送的消息数。

测试步骤

测试场景一:批处理大小

  1. 登录客户端服务器,进入“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, 37696.729809 records/sec (36.81 MB/sec), 796.54 ms avg latency, 3838.00 ms max latency, 322 ms 50th, 2282 ms 95th, 2745 ms 99th, 3593 ms 99.9th.

    客户端消息生产速率=37697

    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.62 ms avg latency, 751.00 ms max latency, 1 ms 50th, 3 ms 95th, 164 ms 99th, 406 ms 99.9th.

    客户端消息生产速率=102399

  2. 登录Kafka实例控制台,单击测试实例名称,进入实例详情页。
  3. 在左侧导航栏单击“监控”,进入监控页面。
  4. 在“节点”页签,查看服务端节点的CPU使用率。

    图1 broker-0的CPU使用率(batch.size=1KB)

    CPU消耗=54%

    图2 broker-0的CPU使用率(batch.size=16KB)

    CPU消耗=26%

    图3 broker-1的CPU使用率(batch.size=1KB)

    CPU消耗=55%

    图4 broker-1的CPU使用率(batch.size=16KB)

    CPU消耗=25%

    图5 broker-2的CPU使用率(batch.size=1KB)

    CPU消耗=51.65%

    图6 broker-2的CPU使用率(batch.size=16KB)

    CPU消耗=36.45%

测试场景二:是否跨AZ生产

  1. 登录客户端服务器,进入“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, 37696.729809 records/sec (36.81 MB/sec), 796.54 ms avg latency, 3838.00 ms max latency, 322 ms 50th, 2282 ms 95th, 2745 ms 99th, 3593 ms 99.9th.

    客户端消息生产速率=37697

    客户端服务器和实例在不同的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, 15358.152107 records/sec (15.00 MB/sec), 1944.09 ms avg latency, 8179.00 ms max latency, 13 ms 50th, 6049 ms 95th, 6549 ms 99th, 8086 ms 99.9th.

    客户端消息生产速率=15358

  2. 登录Kafka实例控制台,单击测试实例名称,进入实例详情页。
  3. 在左侧导航栏单击“监控”,进入监控页面。
  4. 在“节点”页签,查看服务端节点的CPU使用率。

    图7 broker-0的CPU使用率(客户端服务器和实例在相同的AZ中)

    CPU消耗=54%

    图8 broker-0的CPU使用率(客户端服务器和实例在不同的AZ中)

    CPU消耗=28%

    图9 broker-1的CPU使用率(客户端服务器和实例在相同的AZ中)

    CPU消耗=55%

    图10 broker-1的CPU使用率(客户端服务器和实例在不同的AZ中)

    CPU消耗=28%

    图11 broker-2的CPU使用率(客户端服务器和实例在相同的AZ中)

    CPU消耗=51.65%

    图12 broker-2的CPU使用率(客户端服务器和实例在不同的AZ中)

    CPU消耗=23.35%

测试场景三:副本数

  1. 登录客户端服务器,进入“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, 37696.729809 records/sec (36.81 MB/sec), 796.54 ms avg latency, 3838.00 ms max latency, 322 ms 50th, 2282 ms 95th, 2745 ms 99th, 3593 ms 99.9th.

    客户端消息生产速率=37697

    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, 15245.877896 records/sec (14.89 MB/sec), 1963.88 ms avg latency, 7471.00 ms max latency, 306 ms 50th, 5854 ms 95th, 6682 ms 99th, 7439 ms 99.9th.

    客户端消息生产速率=15246

  2. 登录Kafka实例控制台,单击测试实例名称,进入实例详情页。
  3. 在左侧导航栏单击“监控”,进入监控页面。
  4. 在“节点”页签,查看服务端节点的CPU使用率。

    图13 broker-0的CPU使用率(1副本)

    CPU消耗=54%

    图14 broker-0的CPU使用率(3副本)

    CPU消耗=86%

    图15 broker-1的CPU使用率(1副本)

    CPU消耗=55%

    图16 broker-1的CPU使用率(3副本)

    CPU消耗=87%

    图17 broker-2的CPU使用率(1副本)

    CPU消耗=51.65%

    图18 broker-2的CPU使用率(3副本)

    CPU消耗=87.10%

测试场景四:同步/异步复制

  1. 登录客户端服务器,进入“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, 15245.877896 records/sec (14.89 MB/sec), 1963.88 ms avg latency, 7471.00 ms max latency, 306 ms 50th, 5854 ms 95th, 6682 ms 99th, 7439 ms 99.9th.

    客户端消息生产速率=15246

    同步复制,执行脚本如下:

    ./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, 5180.783438 records/sec (5.06 MB/sec), 5692.27 ms avg latency, 10312.00 ms max latency, 5579 ms 50th, 7538 ms 95th, 9481 ms 99th, 10219 ms 99.9th.

    客户端消息生产速率=5181

  2. 登录Kafka实例控制台,单击测试实例名称,进入实例详情页。
  3. 在左侧导航栏单击“监控”,进入监控页面。
  4. 在“节点”页面,查看服务端节点的CPU使用率。

    图19 broker-0的CPU使用率(异步复制)

    CPU消耗=86%

    图20 broker-0的CPU使用率(同步复制)

    CPU消耗=62%

    图21 broker-1的CPU使用率(异步复制)

    CPU消耗=87%

    图22 broker-1的CPU使用率(同步复制)

    CPU消耗=61%

    图23 broker-2的CPU使用率(异步复制)

    CPU消耗=87.10%

    图24 broker-2的CPU使用率(同步复制)

    CPU消耗=59.40%

测试结果

表2 测试结果

分区数

副本数

是否同步复制

batch.size

是否跨AZ生产

客户端消息生产速率

服务端CPU消耗(broker-0)

服务端CPU消耗(broker-1)

服务端CPU消耗(broker-2)

3

1

1KB

37697

54%

55%

51.65%

3

1

16KB

102399

26%

25%

36.45%

3

1

1KB

15358

28%

28%

23.35%

3

3

1KB

5181

62%

61%

59.40%

3

3

1KB

15246

86%

87%

87.10%

通过上表的测试结果,得出以下结论,仅供参考:

  • 生产请求的batch.size变大16倍时,客户端消息生产速率增加,服务端CPU消耗减少。
  • 同AZ生产和跨AZ生产相比,客户端消息生产速率增加,服务端CPU消耗也随之增加。
  • 副本从1变成3时,客户端消息生产速率下降较多,服务端CPU消耗增加。
  • 异步复制的Topic和同步复制的Topic相比,客户端消息生产速率增加,服务端CPU消耗也随之增加。