Kafka 性能測試腳本詳解


一、介紹

Apache Kafka 官方提供了兩個客戶端性能測試腳本,它們的存放位置如下:

  • 生產者性能測試腳本:$KAFKA_HOME/bin/kafka-producer-perf-test.sh
  • 消費者性能測試腳本:$KAFKA_HOME/bin/kafka-consumer-perf-test.sh

kafka-producer-perf-test.sh 支持測試的性能指標包括:吞吐量(throughput)、最大時延(max-latency)、平均時延(avg-latency);kafka-consumer-perf-test.sh 同樣支持吞吐量指標,還提供了一些消費端特有的指標,但沒有直接提供時延信息。

二、使用

2.1 kafka-producer-perf-test.sh

此腳本用於測試 Kafka 生產消息的性能,可選參數列表如下,加粗項為常用參數。

參數名 含義
-h, --help 顯示使用幫助並退出
--topic 指定生產的消息發往的 topic
--num-records 指定生產的消息總數
--payload-delimeter 如果通過 --payload-file 指定了從文件中獲取消息內容,那么這個參數的意義是指定文件的消息分隔符,默認值為 \n,即文件的每一行視為一條消息;如果未指定 --payload-file 則此參數不生效
--throughput 限制每秒發送的最大的消息數,設為 -1 表示不限制
--producer-props 直接指定 Producer 配置,格式為 NAME=VALUE,例如 bootstrap.server=127.0.0.1:9092,通過此種方式指定的配置優先級高於 --producer.config
--producer-config 指定 Producer 的配置文件,格式參照官方的 config/producer.properties
--print-metrics 在測試結束后打印更詳盡的指標,默認為 false
--transactional-id 指定事務 ID,測試並發事務的性能時需要,只有在 --transaction-duration-ms > 0 時生效,默認值為 performance-producer-default-transactional-id
--transactional-duration-ms 指定事務持續的最長時間,超過這段時間后就會調用 commitTransaction 來提交事務,只有指定了 > 0 的值才會開啟事務,默認值為 0
--record-size 指定每條消息的大小,單位是字節,和 --payload-file 兩個中必須指定一個,但不能同時指定
--payload-file 指定消息的來源文件,只支持 UTF-8 編碼的文本文件,文件的消息分隔符通過 --payload-delimeter 指定,和 --record-size 兩個中必須指定一個,但不能同時指定

【示例】

bin/kafka-producer-perf-test.sh --topic perf-test --num-records 1000 --record-size 1024 --throughput -1 --producer-props bootstrap.servers=127.0.0.1:9092 compression.type=lz4

【輸入解釋】

發送 1000 條大小為 1KB 的消息到地址為 127.0.0.1:9092 的 broker 上的 perf-test 主題,發送時不限制吞吐量,並使用 lz4 算法壓縮消息。

執行示例命令后,控制台輸出一行測試結果,如下:

1000 records sent, 3424.657534 records/sec (3.34 MB/sec), 13.61 ms avg latency, 255.00 ms max latency, 13 ms 50th, 20 ms 95th, 255 ms 99th.

【輸出解釋】

成功消費了 1000 條消息,吞吐量為 3424.657534 條/秒 (或 3.34 MB/秒),平均時延為 13.61 ms,最大時延為 255.00 ms,50 % 的消息延時在 13 ms 內,95 % 的消息延時在 20 ms 內,99 % 的消息延時在 255 毫秒內。

2.2 kafka-consumer-perf-test.sh

此腳本用於測試 Kafka 消費消息的性能,可選參數列表如下,加粗項為常用參數。

參數名 含義
--bootstrap-server 指定 broker 地址,必選,除非用 --broker-list 代替(不建議)
--topic 指定消費的 topic,必選
--version 輸出 Kafka 版本
--consumer.config 指定 Consumer 配置文件
--date-format 指定用於格式化 *.time 的規則,默認為 yyyy-MM-dd HH:mm:ss:SSS
--fetch-size 指定一次請求消費的大小,默認為 1048576 即 1 MB
--from-latest 如果 Consumer 沒有已經建立的 offset,則指定從 log 中最新的位點開始消費,而不是從最早的位點開始消費
--group 指定 ConsumerGroup ID,默認為 perf-consumer-40924
--help 顯示使用幫助並退出
--hide-header 指定后不輸出 header 信息
--messages 指定消費的消息數量,必選
--num-fetch-threads 指定 fetcher 線程的數量
--print-metrics 指定打印 metrics 信息
--reporting-interval 指定打印進度信息的時間間隔,默認為 5000 即 5 秒
--show-detailed-stats 指定每隔一段時間(由 --reporting-interval 指定)輸出顯示詳細的狀態信息
--socket-buffer-size 指定 TCP 的 RECV 大小,默認為 2097152 即 2 MB
--threads 指定消費的線程數,默認為 10
--timeout 指定允許的最大超時時間,即每條消息返回的最大時間間隔,默認為 10000 即 10 秒

【示例】

bin/kafka-consumer-perf-test.sh --bootstrap-server 127.0.0.1:9092 --topic perf_test --messages 1000000 --threads 8 --reporting-interval 1000 --show-detailed

【輸入解釋】

同時開啟 8 個消費線程,從 127.0.0.1:9092 的 broker 上的 perf-test 主題中消費 1000 條消息,每隔 1000 ms = 1 s 打印一次消費進度信息。最后兩個參數在消費數量很小的場景下沒有什么幫助,比如若消費數量只有 1000,命令瞬間就可以執行返回;但當指定的消費數量很大(如示例中為 1000 萬)時,需要 10 s 左右才能消費完,此時定時輸出一下進度信息就顯得很有用了。

執行示例命令后,控制台輸出兩行信息,其中第一行為表頭,接下來的數行為每秒的進度信息,如下:

time, threadId, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec
2021-03-25 15:57:59:426, 0, 657.2275, 657.2275, 673001, 673001.0000, 1616659078690, -1616659077690, 0.0000, 0.0000
...

【輸出解釋】

  • time:當前時間,格式由 --date-format 指定
  • threadId:線程 ID
  • data.consumed.in.MB:消費到的數據總大小,單位為 MB
  • MB.sec:消費 TPS,即每秒消費的消息大小
  • data.consumed.in.nMsg:消費到的總消息數
  • nMsg.sec:消費 TPS,即每秒消費的消息條數
  • rebalance.time.ms:消費者組重平衡的耗時,單位為 ms,0 表示沒有發生重平衡
  • fetch.time.ms:fetch 線程的總耗時,單位為 ms
  • fetch.MB.sec:fetch 線程每秒鍾獲取到的消息大小
  • fetch.nMsg.sec:fetch 線程每秒鍾獲取到的消息數量

【注意】

若沒有指定 --show-detailed,則輸出信息中的前兩項會有所不同,如下:

start.time, end.time, data.consumed.in.MB, MB.sec, ...
  • start.time:消費開始的時間,格式由 --date-format 指定
  • end.time:消費結束的時間,格式由 --date-format 指定


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM