一、介紹
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 指定