基础信息

  • kafka版本

2.11-0.10.2.2

  • 网络信息
  • 服务器信息 | 角色 | IP | 操作系统 | CPU | 内存 | 磁盘空间 | 顺序读 | 顺序写 | | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | CentOS Linux release 7.6.1810 | 4 | 8 | 300G | 238MB/s | 137MB/s | | kafka2 | 10.241.90.22 | CentOS Linux release 7.6.1810 | 4 | 8 | 300G | 142MB/s | 126MB/s | | kafka3 | 10.241.40.2 | CentOS Linux release 7.6.1810 | 4 | 8 | 300G | 267MB/s | 136MB/s | | 发压机 | 10.241.40.4 | CentOS Linux release 7.6.1810 | 4 | 8 | 36G | 261 MB/s | 193MB/s |

1.读写测试命令如下:

顺序写:

time dd if=/dev/zero of=/data/ddtest bs=1k count=10000000 conv=fdatasync

顺序读:

time dd if=/data/ddtest of=/dev/null bs=1k count=10000000 status=progress

测试场景1

  • 背景
    测试发送数据包大小对消费和生产性能的影响
  • 默认参数
    • 生产者关键参数
      acks=1
      buffer.memory=33554432
      batch.size=81920
      linger.ms=20
      compression.type=lz4
      request.timeout.ms=90000
    • 服务端关键参数
      default.replication.factor=2
      num.replica.fetchers=2
      replica.fetch.max.bytes=104857600
      replica.fetch.wait.max.ms=5000
      replica.high.watermark.checkpoint.interval.ms=5000
      replica.socket.timeout.ms=60000
      replica.socket.receive.buffer.bytes=102400
      replica.lag.time.max.ms=10000
      replica.lag.max.messages=4000
      leader.imbalance.check.interval.seconds=1800
    • 消费者关键参数
      session.timeout.ms= 90000
      max.poll.interval.ms=300000
      auto.commit.interval.ms=1000
      max.poll.records=50
      request.timeout.ms=305000
      fetch.min.bytes=1024
  • 案例1
    • 发压命令
      1. #生产命令
      2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
      3. #消费命令
      4. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 420293.3 records/sec (410.44 MB/sec) | 8950records/sec | 51.81 | 24.59 | 7.70 | 15.9M | 4.8M | | kafka2 | 10.241.90.22 | 420293.3 records/sec (410.44 MB/sec) | 8950records/sec | 15.74 | 24.29 | 11.40 | 20.1M | 4.5M | | kafka3 | 110.241.40.2 | 420293.3 records/sec (410.44 MB/sec) | 8950records/sec | 19.54 | 25.14 | 16.70 | 8.7M | 4.5M | | 发压机 | 10.241.40.4 | | | 5.87 | 8.73 | 0 | 572.2K | 13.9M |

  • 问题列表

  • 案例总结
    当发送数据包大小设置为1k时,生产TPS为420293.3 records/sec (410.44 MB/sec),消费TPS为8950records/sec
    • 案例2
  • 发压命令
    1. #生产命令
    2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 20000000 --record-size 10240 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
    3. #消费命令
    4. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 32694 records/sec (319.28 MB/sec) | 5750records/sec | 66.15 | 24.53 | 15.10 | 39.2M | 31.8M | | kafka2 | 10.241.90.22 | 32694 records/sec (319.28 MB/sec) | 5750records/sec | 58.18 | 24.13 | 18.90 | 52.5M | 22.6M | | kafka3 | 110.241.40.2 | 32694 records/sec (319.28 MB/sec) | 5750records/sec | 37.89 | 24.73 | 19.00 | 40.6M | 22.5M | | 发压机 | 10.241.40.4 | | | 63.08 | 65.76 | 0 | 20.1M | 70.8M |

  • 问题列表

  • 案例总结
    当发送数据包大小设置为10k时,生产TPS为32694 records/sec (319.28 MB/sec),消费TPS为5750records/sec
    • 案例3
  • 发压命令
    1. #生产命令
    2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 20000000 --record-size 102400 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config
    3. #消费命令
    4. /data/br/base/kafka/config/producer.properties
    5. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 505.5 records/sec (49.37 MB/sec) | 450records/sec | 46.15 | 23.21 | 98.70 | 48.0M | 39.6M | | kafka2 | 10.241.90.22 | 505.5 records/sec (49.37 MB/sec) | 450records/sec | 45.24 | 23.12 | 65.70 | 41.4M | 38.4M | | kafka3 | 110.241.40.2 | 505.5 records/sec (49.37 MB/sec) | 450records/sec | 49.73 | 24.30 | 51.90 | 40.7M | 44.8M | | 发压机 | 10.241.40.4 | | | 71.01 | 65.59 | 0 | 53.5M | 66.1M |

  • 问题列表

  • 案例总结
    当发送数据包大小设置为100k时,生产TPS为505.5 records/sec (49.37 MB/sec),消费TPS为450records/sec
    • 测试结论
  • 案例总结
    | 案例 | 参数 | 生产TPS | 消费TPS | | —- | —- | —- | —- | | 1 | record-size 1024 | 420293.3 records/sec (410.44 MB/sec) | 8950records/sec | | 2 | record-size 10240 | 32694 records/sec (319.28 MB/sec) | 5750records/sec | | 3 | record-size 102400 | 505.5 records/sec (49.37 MB/sec) | 450records/sec |

  • 案例分析
    通过案例1,案例2,案例3,生产TPS和消费TPS比较,当发送数据包约大,生产越慢,消费越慢。

  • 案例结果
    发送数据包大小影响生产TPS和消费TPS,发送数据包大小越大,生产TPS和消费TPS越小;发送数据包越小,生产TPS和消费TPS越大。

测试场景2

  • 背景
    测试buffer.memory参数对kafka性能的影响
  • 默认参数
    • 生产者关键参数
      acks=1
      buffer.memory=33554432
      batch.size=81920
      linger.ms=20
      compression.type=lz4
      request.timeout.ms=90000
    • 服务端关键参数
      default.replication.factor=2
      num.replica.fetchers=2
      replica.fetch.max.bytes=104857600
      replica.fetch.wait.max.ms=5000
      replica.high.watermark.checkpoint.interval.ms=5000
      replica.socket.timeout.ms=60000
      replica.socket.receive.buffer.bytes=102400
      replica.lag.time.max.ms=10000
      replica.lag.max.messages=4000
      leader.imbalance.check.interval.seconds=1800
    • 消费者关键参数
      session.timeout.ms= 90000
      max.poll.interval.ms=300000
      auto.commit.interval.ms=1000
      max.poll.records=50
      request.timeout.ms=305000
      fetch.min.bytes=1024
  • 案例1
    • 压测参数
      buffer.memory=16777216
    • 压测命令
      1. #生产命令
      2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
      3. #消费命令
      4. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 361831.591516 records/sec (313.3 MB/sec) | | 30.15 | 22.23 | 0.1% | 6.9M | 3.7M | | kafka2 | 10.241.90.22 | 361831.591516 records/sec (313.3 MB/sec) | | 33.08 | 23.47 | 0.1% | 8.7M | 4.2M | | kafka3 | 110.241.40.2 | 361831.591516 records/sec (313.3 MB/sec) | | 35.21 | 22.36 | 0.13% | 8.8M | 4.5M | | 发压机 | 10.241.40.4 | | | 35.17 | 10.84 | 0.1% | 46.3K | 11.2M |

  • 问题列表
    1.消费程序无法消费,重启kafka程序后,消费正常

  • 案例总结
    1.通过以上数据可以出,buffer.memory设置为16M时,整体压测机器负载都正常。
    • 案例2
  • 压测参数
    buffer.memory=33554432
  • 压测命令
    1. #生产命令
    2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
    3. #消费命令
    4. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 361831.591516 records/sec (353.35 MB/sec) | | 30.15 | 25.3 | 0.1% | 9.9M | 3.7M | | kafka2 | 10.241.90.22 | 361831.591516 records/sec (353.35 MB/sec) | | 33.08 | 25.7 | 0.1% | 10.7M | 4.2M | | kafka3 | 110.241.40.2 | 361831.591516 records/sec (353.35 MB/sec) | | 37.21 | 25.6 | 0.13% | 11.8M | 4.5M | | 发压机 | 10.241.40.4 | | | 35.17 | 13.8 | 0.1% | 46.3K | 15.4M |

  • 问题列表
    1.消费程序无法消费,重启kafka程序后,可以消费,但是过了几分钟消费卡住,增加启动消费者加内存参数 —Xms2048m —Xmx4096m 可以正常消费,跑了一个半小时,消费完。

  • 案例总结
    1、通过以上数据可以看出,buffer.memory设置为32M时,对比buffer.memory为16M时,生产者的TPS有所增加,内存占用升高,IO并没有增长。
    • 案例3
  • 压测参数
    buffer.memory=67108864
  • 压测命令
    1. #生产命令
    2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
    3. #消费命令
    4. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 310097.8 records/sec (382.83 MB/sec) | | 38.4 | 52.4 | 0.1% | 16.5M | 3.2M | | kafka2 | 10.241.90.22 | 310097.8 records/sec (382.83 MB/sec) | | 34.12 | 52.13 | 0.1% | 16.4M | 3.3M | | kafka3 | 110.241.40.2 | 310097.8 records/sec (382.83 MB/sec) | | 30.67 | 51.84 | 0.1% | 17.2M | 3.8M | | 发压机 | 10.241.40.4 | | | 1.76 | 59.91 | 0.1% | 10.4K | 20.8M |

  • 问题列表

  • 案例总结
    1、通过以上数据可以看出,buffer.memory设置为64M时,对比buffer.memory为16M和32M时,
    TPS、CPU、内存占用升高,对机器资源占用有很大的影响,长时间容易导致故障。
    • 测试结论
  • 案例总结
    | 案例 | 参数 | 生产TPS | broker机器最大CPU | broker机器最大内存 | | —- | —- | —- | —- | —- | | 1 | buffer.memory 16777216 | 361831.591516 records/sec (313.3 MB/sec) | 35.21 | 23.47 | | 2 | buffer.memory 33554432 | 361831.591516 records/sec (353.35 MB/sec) | 37.21 | 25.7 | | 3 | buffer.memory 67108864 | 310097.8 records/sec (382.83 MB/sec) | 38.4 | 52.4 |

  • 案例分析
    通过以上数据进行分析:
    buffer.memory设置为16M时,在数据较小时,并不会有问题,机器资源占用也较合理;
    buffer.memory设置为32M时,相对设置为16M,TPS处理量增加,机器资源占用并没有增加多少,即数据增大时,也可以进行处理;
    buffer.memory设置为64M时,相对设置为16M和32M,TPS、CPU、内存占用都较高

  • 案例结果

buffer.memory的本质就是用来约束KafkaProducer能够使用的内存缓冲的大小的,推荐buffer.memory参数值设置为33554432。

测试场景3

  • 背景
    测试batch.size参数对kafka性能的影响
  • 默认参数
    • 生产者关键参数
      acks=1
      buffer.memory=33554432
      batch.size=81920
      linger.ms=20
      compression.type=lz4
      request.timeout.ms=90000
    • 服务端关键参数
      default.replication.factor=2
      num.replica.fetchers=2
      replica.fetch.max.bytes=104857600
      replica.fetch.wait.max.ms=5000
      replica.high.watermark.checkpoint.interval.ms=5000
      replica.socket.timeout.ms=60000
      replica.socket.receive.buffer.bytes=102400
      replica.lag.time.max.ms=10000
      replica.lag.max.messages=4000
      leader.imbalance.check.interval.seconds=1800
    • 消费者关键参数
      session.timeout.ms= 90000
      max.poll.interval.ms=300000
      auto.commit.interval.ms=1000
      max.poll.records=50
      request.timeout.ms=305000
      fetch.min.bytes=1024
  • 案例1
    • 压测参数
      batch.size=81920
    • 发压命令
      1. #生产命令
      2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
      3. #消费命令
      4. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 483314.8 records/sec (471.99 MB/sec) | 8900records/sec | 44.10 | 24.25 | 7.70 | 9.7M | 5.0M | | kafka2 | 10.241.90.22 | 483314.8 records/sec (471.99 MB/sec) | 8900records/sec | 33.08 | 23.17 | 6.60 | 7.5M | 5.0M | | kafka3 | 110.241.40.2 | 483314.8 records/sec (471.99 MB/sec) | 8900records/sec | 30.65 | 22.89 | 5.10 | 37.7K | 4.4M | | 生产者 | 10.241.40.4 | | | 48.47 | 36.63 | 0 | 72.7K | 14.1M | | 消费者 | 10.241.90.34 | | | 93.98 | 35.14 | 0 | 9.3M | 14.7K |

  • 问题列表

  • 案例总结
    当batch.size设置为81920时,生产TPS为483314.8 records/sec (471.99 MB/sec)
    • 案例2
  • 压测参数
    batch.size=10240
  • 发压命令
    1. #生产命令
    2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
    3. #消费命令
    4. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 354605 records/sec (346.29 MB/sec) | 8750records/sec | 54.15 | 23.97 | 6.50 | 7.8M | 4.3M | | kafka2 | 10.241.90.22 | 354605 records/sec (346.29 MB/sec) | 8750records/sec | 58.91 | 23.00 | 6.40 | 7.9M | 4.2M | | kafka3 | 110.241.40.2 | 354605 records/sec (346.29 MB/sec) | 8750records/sec | 41.65 | 23.18 | 3.20 | 8.4M | 4.7M | | 生产者 | 10.241.40.4 | | | 34.61 | 5.95 | 0 | 112.5K | 10.5M | | 消费者 | 10.241.90.34 | | | 90.20 | 35.60 | 0 | 6.9M | 2.5K |

  • 问题列表

  • 案例总结
    当batch.size设置为10240时,生产TPS为354605 records/sec (346.29 MB/sec)
    • 案例3
  • 压测参数
    batch.size=0
  • 发压命令
    1. #生产命令
    2. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
    3. #消费命令
    4. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | | | | | | | | | kafka2 | 10.241.90.22 | | | | | | | | | kafka3 | 110.241.40.2 | | | | | | | | | 生产者 | 10.241.40.4 | | | | | | | | | 消费者 | 10.241.90.34 | | | | | | | |

  • 问题列表
    当将batch.size调成较小时,会比较消耗生产工具的内存,会造成生产工具内存溢出 ```shell [root@stresskafka04 config]# kafka-producer-perf-test.sh —topic test-partition-6 —num-records 60000000 —record-size 1024 —throughput 10000000 —producer-props bootstrap.servers=10.241.90.2:9092 —producer.config /data/br/base/kafka/config/producer.properties 9943 records sent, 1631.3 records/sec (1.59 MB/sec), 1366.5 ms avg latency, 3747.0 max latency. 2412 records sent, 400.7 records/sec (0.39 MB/sec), 4811.1 ms avg latency, 9469.0 max latency.

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread “kafka-producer-network-thread | producer-1”

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread “main”

  1. <br />将生产者内存调整到8G,还是会出现如下报错
  2. - 案例总结<br />当batch.size设置为0时,会比较消耗生产工具的内存,会造成生产工具内存溢出
  3. - 案例4
  4. - 压测参数<br />batch.size=819200
  5. - 发压命令
  6. ```shell
  7. #生产命令
  8. kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
  9. #消费命令
  10. java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 399432.9 records/sec (390.07 MB/sec) | 7750records/sec | 32.99 | 24.39 | 8.00 | 9.4M | 4.9M | | kafka2 | 10.241.90.22 | 399432.9 records/sec (390.07 MB/sec) | 7750records/sec | 39.84 | 23.10 | 5.00 | 4.5M | 8.8M | | kafka3 | 110.241.40.2 | 399432.9 records/sec (390.07 MB/sec) | 7750records/sec | 35.37 | 23.45 | 5.20 | 8.9M | 4.5M | | 生产者 | 10.241.40.4 | | | 55.78 | 6.40 | 0 | 39.3K | 10.8M | | 消费者 | 10.241.90.34 | | | 92.20 | 34.60 | 0 | 8.6M | 2.9K |

  • 问题列表

  • 案例总结
    当batch.size设置为819200时,生产TPS为399432.9 records/sec (390.07 MB/sec)
    • 案例5
  • 压测参数
    batch.size=8192000
  • 发压命令
    #生产命令
    kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties 
    #消费命令
    java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
    
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 1344.1 records/sec (1.31 MB/sec) | 1260records/sec | 34.81 | 24.43 | 4.60 | 1.3M | 1.4M | | kafka2 | 10.241.90.22 | 1344.1 records/sec (1.31 MB/sec) | 1260records/sec | 30.99 | 24.22 | 2.4 | 1.4M | 1.4M | | kafka3 | 110.241.40.2 | 1344.1 records/sec (1.31 MB/sec) | 1260records/sec | 41.34 | 23.97 | 4.30 | 1.6M | 1.5M | | 生产者 | 10.241.40.4 | | | 10.00 | 4.71 | 0 | 121.7K | 1.4M | | 消费者 | 10.241.90.34 | | | 34.59 | 7.03 | 0 | 1.3M | 46.1K |

  • 问题列表

  • 案例总结
    当batch.size设置为8192000时,生产TPS为1344.1 records/sec (1.31 MB/sec)
    • 测试结论
  • 案例总结
    | 案例 | 参数 | 生产TPS | | —- | —- | —- | | 1 | batch.size=81920 | 483314.8 records/sec (471.99 MB/sec) | | 2 | batch.size=10240 | 354605 records/sec (346.29 MB/sec) | | 3 | batch.size=0 | 生产者工具内存溢出 | | 4 | batch.size=819200 | 399432.9 records/sec (390.07 MB/sec) | | 5 | batch.size=8192000 | 1344.1 records/sec (1.31 MB/sec) |

  • 案例分析

    • batch.size:当多个消息要发送到相同分区的时,生产者尝试将消息批量打包在一起,以减少请 求交互。这样有助于客户端和服务端的性能提升。该配置的默认批次大小(以字节 为单位): 不会打包大于此配置大小的消息。 发送到broker的请求将包含多个批 次,每个分区一个,用于发送数据。 较小的批次大小有可能降低吞吐量(批次大小 为0则完全禁用批处理)。一个非常大的批次大小可能更浪费内存。因为我们会预先 分配这个资源。
    • 从案例3压测结果可以看出当batch.size设置为0时会造成生产者内存溢出
    • 从案例5压测结果可以看出当batch.size设置为8192000时的很大,会降低生产TPS
    • 从案例1,2,4结果得出batch.size设置在80KB左右时,生产TPS最大
  • 案例结果
    batch.size不能设置太小,太小会造成生产者内存溢出,也不能设置太大,太大会降低生产TPS。应设置为80KB左右较为合适。

测试场景4

  • 背景
    测试linger.ms参数对kafka性能的影响
  • 默认参数
    • 生产者关键参数
      acks=1
      buffer.memory=33554432
      batch.size=81920
      linger.ms=20
      compression.type=lz4
      request.timeout.ms=90000
    • 服务端关键参数
      default.replication.factor=2
      num.replica.fetchers=2
      replica.fetch.max.bytes=104857600
      replica.fetch.wait.max.ms=5000
      replica.high.watermark.checkpoint.interval.ms=5000
      replica.socket.timeout.ms=60000
      replica.socket.receive.buffer.bytes=102400
      replica.lag.time.max.ms=10000
      replica.lag.max.messages=4000
      leader.imbalance.check.interval.seconds=1800
    • 消费者关键参数
      session.timeout.ms= 90000
      max.poll.interval.ms=300000
      auto.commit.interval.ms=1000
      max.poll.records=50
      request.timeout.ms=305000
      fetch.min.bytes=1024
  • 案例1
    • 压测参数
      linger.ms=20
    • 发压命令
      #生产命令
      kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
      #消费命令
      java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
      
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 483314.8 records/sec (471.99 MB/sec) | 8900records/sec | 44.10 | 24.25 | 7.70 | 9.7M | 5.0M | | kafka2 | 10.241.90.22 | 483314.8 records/sec (471.99 MB/sec) | 8900records/sec | 33.08 | 23.17 | 6.60 | 7.5M | 5.0M | | kafka3 | 110.241.40.2 | 483314.8 records/sec (471.99 MB/sec) | 8900records/sec | 30.65 | 5.87 | 5.10 | 37.7K | 4.4M | | 生产者 | 10.241.40.4 | | | 48.47 | 36.63 | 0 | 72.7K | 14.1M | | 消费者 | 10.241.90.34 | | | 93.98 | 35.14 | 0 | 436.3K | 14.7K |

  • 问题列表
    消费者内存溢出

    2021-09-13 20:41:24.282 [pool-1-thread-2] [INFO ] [com.bonree.kafka.client.ConsumerClient]  pool-1-thread-2 Pull kafka data success! count: 50, partition: {5=80205917-80205966}
    2021-09-13 20:41:29.130 [kafka-coordinator-heartbeat-thread | zhuting1] [ERROR] [o.a.k.c.c.i.AbstractCoordinator$HeartbeatThread]  Uncaught exception in kafka-coordinator-heartbeat-thread | zhuting1: 
    java.lang.OutOfMemoryError: Java heap space
    2021-09-13 20:41:29.130 [kafka-coordinator-heartbeat-thread | zhuting1] [ERROR] [o.a.k.c.c.i.AbstractCoordinator$HeartbeatThread]  Uncaught exception in kafka-coordinator-heartbeat-thread | zhuting1: 
    java.lang.OutOfMemoryError: Java heap space
    
  • 案例总结
    当linger.ms设置为20时,生产TPS为483314.8 records/sec (471.99 MB/sec),broker机器CPU使用率大概36%
    • 案例2
  • 压测参数
    linger.ms=5
  • 发压命令
    #生产命令
    kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties 
    #消费命令
    java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
    
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 376619.463694 records/sec (367.79 MB/sec) | 6350records/sec | 51.16 | 24.41 | 6.20 | 9.6M | 4.7M | | kafka2 | 10.241.90.22 | 376619.463694 records/sec (367.79 MB/sec) | 6350records/sec | 42.56 | 24.21 | 5.00 | 9.1M | 4.7M | | kafka3 | 110.241.40.2 | 376619.463694 records/sec (367.79 MB/sec) | 6350records/sec | 41.09 | 24.20 | 3.20 | 8.5M | 4.7M | | 生产者 | 10.241.40.4 | | | 47.00 | 4.85 | 0 | 98.1K | 8.8M | | 消费者 | 10.241.90.34 | | | 81.25 | 35.60 | 0 | 6.0M | 79.2K |

  • 问题列表

  • 案例总结
    当linger.ms设置为5时,生产TPS为376619.463694 records/sec (367.79 MB/sec),broker机器CPU使用率大概44%
    • 案例3
  • 压测参数
    linger.ms=0
  • 发压命令
    #生产命令
    kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties 
    #消费命令
    java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
    
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 430551 records/sec (420.46 MB/sec) | 5550 records/sec | 65.37 | 24.30 | 5.00 | 9.6M | 5.7M | | kafka2 | 10.241.90.22 | 430551 records/sec (420.46 MB/sec) | 5550 records/sec | 59.79 | 24.17 | 6.00 | 10.0M | 5.3M | | kafka3 | 110.241.40.2 | 430551 records/sec (420.46 MB/sec) | 5550 records/sec | 68.91 | 24.48 | 5.30 | 8.1M | 5.2M | | 生产者 | 10.241.40.4 | | | 40.05 | 11.67 | 0 | 233.6K | 9.8M | | 消费者 | 10.241.90.34 | | | 90.27 | 32.81 | 0 | 9.2M | 59.9K |

  • 问题列表

  • 案例总结
    当linger.ms设置为0时,生产TPS为430551 records/sec (420.46 MB/sec),broker机器CPU使用率大概64%
    • 案例4
  • 压测参数
    linger.ms=200
  • 发压命令
    #生产命令
    kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 1024 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties 
    #消费命令
    java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
    
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 511452.268717 records/sec (499.47 MB/sec) | 7750records/sec | 74.02 | 24.28 | 7.10 | 10.2M | 5.1M | | kafka2 | 10.241.90.22 | 511452.268717 records/sec (499.47 MB/sec) | 7750records/sec | 68.20 | 24.21 | 6.60 | 10.0M | 5.0M | | kafka3 | 110.241.40.2 | 511452.268717 records/sec (499.47 MB/sec) | 7750records/sec | 69.44 | 24.48 | 5.20 | 10.0M | 5.0M | | 生产者 | 10.241.40.4 | | | 33.25 | 6.30 | 0 | 38.4K | 15.1M | | 消费者 | 10.241.90.34 | | | 89.25 | 34.01 | 0 | 8.2M | 251.8K |

  • 问题列表

  • 案例总结
    当linger.ms设置为200时,生产TPS为511452.268717 records/sec (499.47 MB/sec),broker机器CPU使用率大概70%
    • 测试结论
  • 案例总结
    | 案例 | 参数 | 生产TPS | broker机器CPU | | —- | —- | —- | —- | | 1 | linger.ms=20 | 483314.8 records/sec (471.99 MB/sec) | 36% | | 2 | linger.ms=5 | 376619.463694 records/sec (367.79 MB/sec) | 44% | | 3 | linger.ms=0 | 430551 records/sec (420.46 MB/sec) | 64% | | 4 | linger.ms=200 | 511452.268717 records/sec (499.47 MB/sec) | 70% |

  • 案例分析

    • linger.ms:生产者组将发送的消息组合成单个批量请求。正常情况下,只有消息到达的速度比 发送速度快的情况下才会出现。但是,在某些情况下,即使在适度的负载下,客户 端也可能希望减少请求数量。此设置通过添加少量人为延迟来实现。也就是说,不 是立即发出一个消息,生产者将等待一个给定的延迟,以便和其他的消息可以组合 成一个批次。这类似于Nagle在TCP中的算法。此设置给出批量延迟的上限:一旦我 们达到分区的batch.size值的记录,将立即发送,不管这个设置如何,但是,如果比 这个小,我们将在指定的“linger”时间内等待更多的消息加入。此设置默认为0(即 无延迟)。假设,设置 linger.ms=5,将达到减少发送的请求数量的效果,但对于在 没有负载情况,将增加5ms的延迟。
    • 通过案例1,2的生产者TPS结果可以看出,当linger.ms设置的越小,生产者TPS越小
    • 通过案例3的broker机器CPU结果可以看出,当linger.ms设置的过小,会比较消耗broker机器CPU性能
    • 通过案例4的broker机器CPU结果可以看出,当linger.ms设置的过大,会比较消耗broker机器CPU性能
  • 案例结果
    linger.ms参数不宜设置的过小,也不宜设置的过大,设置 太小或太大会比较消耗broker机器CPU性能。linger.ms参数给20比较合理。

1、linger.ms参数越小,生产者TPS越小,参数越大,生产者TPS越小,但是kafka服务端CPU消耗约大。

2、linger.ms参数对生产者产生的影响较小

测试场景5

  • 背景
    测试max.poll.records参数对kafka性能的影响
  • 默认参数
    • 生产者关键参数
      acks=1
      buffer.memory=33554432
      batch.size=81920
      linger.ms=20
      compression.type=lz4
      request.timeout.ms=90000
    • 服务端关键参数
      default.replication.factor=2
      num.replica.fetchers=2
      replica.fetch.max.bytes=104857600
      replica.fetch.wait.max.ms=5000
      replica.high.watermark.checkpoint.interval.ms=5000
      replica.socket.timeout.ms=60000
      replica.socket.receive.buffer.bytes=102400
      replica.lag.time.max.ms=10000
      replica.lag.max.messages=4000
      leader.imbalance.check.interval.seconds=1800
    • 消费者关键参数
      session.timeout.ms= 90000
      max.poll.interval.ms=300000
      auto.commit.interval.ms=1000
      max.poll.records=50
      request.timeout.ms=305000
      fetch.min.bytes=1024
  • 案例1
    • 压测参数
      max.poll.records=100
    • 压测命令
      #生产命令
      kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --throughput 8000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties --payload-file /data/br/c.txt
      #消费命令
      java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
      
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 4733.8 records/sec (113.12 MB/sec) | 2172 records/sec | 66.32 | 25.82 | 19.5 | 78.4M | 56.9M | | kafka2 | 10.241.90.22 | 4733.8 records/sec (113.12 MB/sec) | 2172 records/sec | 66.75 | 25.33 | 16.5 | 77.6M | 49.6M | | kafka3 | 110.241.40.2 | 4733.8 records/sec (113.12 MB/sec) | 2172 records/sec | 65.86 | 25.75 | 17.5 | 76M | 60.4M | | 发压机 | 10.241.40.4 | | | 34.27 | 12.2 | | 285K | 114M | | 消费机 | 10.241.90.34 | | | 43.75 | 20.43 | | 92.8M | 287K |

  • 问题列表

  • 案例总结

    1、消费者参数max.poll.records设置为100时, 通过统计数据可以看出,消费者机器资源占用较小,但是会造成kafka队列数据消费的时间较长。

  • 案例2
    • 压测参数
      max.poll.records=500
    • 压测命令
      #生产命令
      kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --throughput 8000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties --payload-file /data/br/c.txt
      #消费命令
      java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
      
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 4506.6 records/sec (107.51 MB/sec) | 3394 records/sec | 61.98 | 24.56 | 30.8 | 75M | 58M | | kafka2 | 10.241.90.22 | 4506.6 records/sec (107.51 MB/sec) | 3394 records/sec | 65.43 | 25.13 | 35.1 | 75.5M | 57.2M | | kafka3 | 10.241.40.2 | 4506.6 records/sec (107.51 MB/sec) | 3394 records/sec | 64.15 | 25.09 | 33.2 | 76M | 97.7M | | 发压机 | 10.241.40.4 | | | 34.64 | 12.59 | | 272.8K | 112M | | 消费机 | 10.241.90.34 | | | 66.2 | 23.48 | | 132.1M | 768.4K |

  • 问题列表

  • 案例总结

       1、消费者参数max.poll.records设置为500时,是官方的默认值,对比max.poll.records为100时,消费者机器CPU、内存占用有所增高,入流量增大。
    
  • 案例3
    • 压测参数
      max.poll.records=1000
    • 压测命令
      #生产命令
      kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --throughput 8000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties --payload-file /data/br/c.txt
      #消费命令
      java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
      
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 4716.6 records/sec (112.71 MB/sec) | 4192 records/sec | 64.47 | 24.38 | 46.2 | 73.9M | 59.3M | | kafka2 | 10.241.90.22 | 4716.6 records/sec (112.71 MB/sec) | 4192 records/sec | 69.05 | 24.33 | 44.8 | 74.55M | 58.7M | | kafka3 | 10.241.40.2 | 4716.6 records/sec (112.71 MB/sec) | 4192 records/sec | 64.38 | 23.52 | 41.7 | 73.8M | 100.8M | | 发压机 | 10.241.40.4 | | | 35.92 | 6.6 | | 281.7K | 111.2M | | 消费机 | 20.241.90.34 | | | 81.36 | 26.12 | | 121.7M | 323K |

  • 问题列表

  • 案例总结

    1、消费者参数max.poll.records设置为1000时,是官方的默认值,对比max.poll.records为100和500时,消费者机器CPU、内存占用更高,入流量更大,长时间跑会对消费者机器产生影响。
    
  • 案例4
    • 压测参数
      max.poll.records=2000
    • 发压命令
      #生产命令
      kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --throughput 8000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties --payload-file /data/br/c.txt
      #消费命令
      java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
      
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 4737.7 records/sec (113.27 MB/sec) | 3031.3 records/sec | 59.47 | 27.20 | 45.5 | 62.1M | 70.7M | | kafka2 | 10.241.90.22 | 4737.7 records/sec (113.27 MB/sec) | 3031.3 records/sec | 65.55 | 27.34 | 53.3 | 77.8M | 65.8M | | kafka3 | 10.241.40.2 | 4737.7 records/sec (113.27 MB/sec) | 3031.3 records/sec | 67.65 | 28.10 | 47.4 | 81.5M | 120.6M | | 发压机 | 10.241.40.4 | | | 37.21 | 9.19 | 0 | 306K | 113.9M | | 消费机 | 20.241.90.34 | | | 59.48 | 38.37 | 0 | 132.0M | 543.5K |

  • 问题列表

  • 案例总结

    1、消费者参数max.poll.records设置为2000时,消费者机器CPU、内存占下降,说明max.poll.records达到 一个峰值后,并不会增加消费能力,CPU、内存占用的资源也不会升高。

  • 压测结论

    • 案例总结
      | 案例 | 参数 | 消费TPS | 消费机CPU | 消费机内存 | | —- | —- | —- | —- | —- | | 1 | max.poll.records 100 | 2172 records/sec | 43.75 | 20.43 | | 2 | max.poll.records 500 | 3394 records/sec | 66.2 | 23.48 | | 3 | max.poll.records 1000 | 4192 records/sec | 81.36 | 26.12 | | 4 | max.poll.records 2000 | 3031.3 records/sec | 59.48 | 38.37 |

    • 案例分析
      max.poll.records是指kafka的消费者每次最大消费消息数量
      通过以上数据分析:
      消费者max.poll.records参数设置值的大小,对消费者的机器的整体性能(TPS、cpu、内存、IO)有影响,但达到最大值之后,消费能力不会增加,故消费者机器的TPS、cpu、内存、IO不会升高;

    • 案例结果

        消费者max.poll.records参数设置值的大小,对消费者的机器的整体性能(TPS、cpu、内存、IO)有影响,但达到最大值 之后,影响减弱,推荐设置值max.poll.records=500;
      

测试场景6

  • 背景
    测试replica.fetch.wait.max.ms参数对kafka性能的影响
  • 默认参数
    • 生产者关键参数
      acks=1
      buffer.memory=33554432
      batch.size=81920
      linger.ms=20
      compression.type=lz4
      request.timeout.ms=90000
    • 服务端关键参数
      default.replication.factor=2
      num.replica.fetchers=2
      replica.fetch.max.bytes=104857600
      replica.fetch.wait.max.ms=5000
      replica.high.watermark.checkpoint.interval.ms=5000
      replica.socket.timeout.ms=60000
      replica.socket.receive.buffer.bytes=102400
      replica.lag.time.max.ms=10000
      replica.lag.max.messages=4000
      leader.imbalance.check.interval.seconds=1800
    • 消费者关键参数
      session.timeout.ms= 90000
      max.poll.interval.ms=300000
      auto.commit.interval.ms=1000
      max.poll.records=50
      request.timeout.ms=305000
      fetch.min.bytes=1024
  • 案例1
    • 压测参数
      replica.fetch.wait.max.ms=5000
    • 发压命令
      #生产命令
      kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 102400 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties
      #消费命令
      java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
      
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 764.4 records/sec (74.65 MB/sec) | 490records/sec | 39.73 | 25.22 | 18.30 | 50.2M | 39.4M | | kafka2 | 10.241.90.22 | 764.4 records/sec (74.65 MB/sec) | 490records/sec | 50.66 | 25.74 | 24.70 | 48.9M | 42.3M | | kafka3 | 110.241.40.2 | 764.4 records/sec (74.65 MB/sec) | 490records/sec | 49.08 | 26.06 | 16.30 | 50.7M | 47.7M | | 生产者 | 10.241.40.4 | | | 33.42 | 16.06 | 0 | 180.4K | 74.1M | | 消费者 | 10.241.90.34 | | | 35.90 | 20.34 | 0 | 61.2M | 203.0K |

  • 问题列表

  • 案例总结
    当replica.fetch.wait.max.ms设置为5000,生产764.4 records/sec (74.65 MB/sec),消费TPS为490records/sec
    • 案例2
  • 压测参数
    replica.fetch.wait.max.ms=1000
  • 发压命令
    #生产命令
    kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 102400 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties 
    #消费命令
    java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
    
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 421.6 records/sec (41.17 MB/sec) | 360records/sec | 36.53 | 24.20 | 6.20 | 31.4M | 48.3M | | kafka2 | 10.241.90.22 | 421.6 records/sec (41.17 MB/sec) | 360records/sec | 42.56 | 35.36 | 5.00 | 22.57 | 29.6M | | kafka3 | 110.241.40.2 | 421.6 records/sec (41.17 MB/sec) | 360records/sec | 33.33 | 24.88 | 10.00 | 32.0M | 36.6M | | 生产者 | 10.241.40.4 | | | 15.35 | 16.42 | 0 | 160.8K | 40.8M | | 消费者 | 10.241.90.34 | | | 30.67 | 20.64 | 0 | 40.5M | 266.3K |

  • 问题列表

  • 案例总结
    当replica.fetch.wait.max.ms设置为5000,生产421.6 records/sec (41.17 MB/sec),消费TPS为360records/sec
    • 案例3
  • 压测参数
    replica.fetch.wait.max.ms=10
  • 发压命令
    #生产命令
    kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 102400 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties 
    #消费命令
    java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
    
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 533.2 records/sec (52.07 MB/sec) | 450 records/sec | 45.81 | 22.94 | 5.00 | 38.5M | 36.8M | | kafka2 | 10.241.90.22 | 533.2 records/sec (52.07 MB/sec) | 450 records/sec | 50.52 | 22.55 | 11.40 | 38.9M | 30.1M | | kafka3 | 110.241.40.2 | 533.2 records/sec (52.07 MB/sec) | 450 records/sec | 25.07 | 17.74 | 14.30 | 36.0M | 44.2M | | 生产者 | 10.241.40.4 | | | 26.44 | 17.74 | 0 | 148.4K | 50.6M | | 消费者 | 10.241.90.34 | | | 35.25 | 19.68 | 0 | 40.2M | 318.6K |

  • 问题列表

  • 案例总结
    当replica.fetch.wait.max.ms设置为10,生产533.2 records/sec (52.07 MB/sec),消费TPS为450 records/sec
    • 案例4
  • 压测参数
    replica.fetch.wait.max.ms=50000
  • 发压命令
    #生产命令
    kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 102400 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties 
    #消费命令
    java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
    
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | | | | | | | | | kafka2 | 10.241.90.22 | | | | | | | | | kafka3 | 110.241.40.2 | | | | | | | | | 生产者 | 10.241.40.4 | | | | | | | | | 消费者 | 10.241.90.34 | | | | | | | |

  • 问题列表
    replica.fetch.wait.max.ms应小于replica.lag.time.max.ms,以防止ISR中的频繁更改

    replica.fetch.wait.max.ms=50000
    replica.lag.time.max.ms=10000
    


    将这两个参数设置成50秒kafka会报java.io.IOException: Connection to 3 was disconnected before the response was read错误

  • 案例总结
    replica.fetch.wait.max.ms应小于replica.lag.time.max.ms,以防止ISR中的频繁更改

    • 案例5
  • 压测参数
    replica.fetch.wait.max.ms=10000
  • 发压命令
    #生产命令
    kafka-producer-perf-test.sh --topic test-partition-6 --num-records 60000000 --record-size 102400 --throughput 10000000 --producer-props bootstrap.servers=10.241.90.2:9092 --producer.config /data/br/base/kafka/config/producer.properties 
    #消费命令
    java -jar Br_Kafka.jar --topic=test-partition-6 --thread=3 --config=/data/br/base/kafka/consumer/consumer.config
    
  • 测试结果
    | | ip | 生产TPS | 消费TPS | CPU | 内存 | IO | 入流量 | 出流量 | | —- | —- | —- | —- | —- | —- | —- | —- | —- | | kafka1 | 10.241.90.2 | 594.5 records/sec (58.05 MB/sec) | 500records/sec | 42.78 | 24.11 | 16.40 | 42.2M | 62.6M | | kafka2 | 10.241.90.22 | 594.5 records/sec (58.05 MB/sec) | 500records/sec | 54.59 | 22.67 | 14.9 | 40.5M | 58.7M | | kafka3 | 110.241.40.2 | 594.5 records/sec (58.05 MB/sec) | 500records/sec | 50.27 | 25.4 | 16.2 | 45.8M | 57.6M | | 生产者 | 10.241.40.4 | | | 32.11 | 16.62 | 0 | 36.0K | 62.9M | | 消费者 | 10.241.90.34 | | | 40.00 | 20.78 | 0 | 68.1M | 331.0K |

  • 问题列表

  • 案例总结
    当replica.fetch.wait.max.ms设置为10000,生产594.5 records/sec (58.05 MB/sec),消费TPS为500records/sec
    • 测试结论
  • 案例总结
    | 案例 | 参数 | 生产TPS | 消费TPS | | —- | —- | —- | —- | | 1 | replica.fetch.wait.max.ms=5000 | 764.4 records/sec (74.65 MB/sec) | 490records/sec | | 2 | replica.fetch.wait.max.ms=1000 | 421.6 records/sec (41.17 MB/sec) | 360records/sec | | 3 | replica.fetch.wait.max.ms=10 | 533.2 records/sec (52.07 MB/sec) | 450 records/sec | | 4 | replica.fetch.wait.max.ms=50000 | 报错:java.lang.IllegalArgumentException: requirement failed: replica.fetch.wait.max.ms should always be at least replica.lag.time.max.ms to prevent frequent changes in ISR | 报错:java.lang.IllegalArgumentException: requirement failed: replica.fetch.wait.max.ms should always be at least replica.lag.time.max.ms to prevent frequent changes in ISR | | 5 | replica.fetch.wait.max.ms=10000 | 594.5 records/sec (58.05 MB/sec) | 500records/sec |

  • 案例分析

    • replica.fetch.wait.max.ms:replicas同leader之间通信的最大等待时间
    • 从案例1,2,3,5的生产者TPS和消费者TPS得出,replica.fetch.wait.max.ms参数对生产者和消费者TPS影响较小
    • 从案例4结果可以看出replica.fetch.wait.max.ms应小于replica.lag.time.max.ms,不然会抛java.lang.IllegalArgumentException: requirement failed: replica.fetch.wait.max.ms should always be at least replica.lag.time.max.ms to prevent frequent changes in ISR异常
  • 案例结果
    参数对生产者和消费者TPS影响较小,replica.fetch.wait.max.ms应小于replica.lag.time.max.ms,以防止ISR中的频繁更改