Kafka在Linux上的性能测试方法
小樊
43
2026-01-09 13:17:41
Kafka在Linux上的性能测试方法
一 工具与前置准备
- 使用Kafka自带脚本进行基准测试:
- 生产者:kafka-producer-perf-test.sh
- 消费者:kafka-consumer-perf-test.sh
- 功能验证(可选):kafka-verifiable-producer.sh / kafka-verifiable-consumer.sh
- 分布式压测框架(进阶):trogdor.sh
- 准备测试Topic(示例):
- 创建:bin/kafka-topics.sh --create --topic perf-test --bootstrap-server broker1:9092 --partitions 3 --replication-factor 3
- 调整保留(避免干扰):bin/kafka-configs.sh --bootstrap-server broker1:9092 --entity-type topics --entity-name perf-test --alter --add-config retention.ms=300000
- 监控建议:
- 系统层:iostat -x 1、vmstat 1、free -m、top
- Kafka可视化:Kafka-Eagle(EFAK)查看集群与消费滞后
- JMX:开启Broker/客户端JMX,采集请求耗时、IO、网络等指标
二 快速上手命令
- 生产者压测(示例)
- 小消息、不限速:
bin/kafka-producer-perf-test.sh --topic perf-test --num-records 10000000 --record-size 100 --throughput -1 --producer-props bootstrap.servers=broker1:9092 acks=1
- 1KB消息、限速5万条/秒、LZ4压缩:
bin/kafka-producer-perf-test.sh --topic perf-test --num-records 10000000 --record-size 1024 --throughput 50000 --producer-props bootstrap.servers=broker1:9092 acks=1 compression.type=lz4 batch.size=65536 linger.ms=10
- 消费者压测(示例)
- 单线程:
bin/kafka-consumer-perf-test.sh --bootstrap-server broker1:9092 --topic perf-test --messages 10000000 --threads 1
- 多线程:
bin/kafka-consumer-perf-test.sh --bootstrap-server broker1:9092 --topic perf-test --messages 10000000 --threads 8 --print-metrics
- 常用参数说明
- 生产者:–topic、–num-records、–record-size 或 –payload-file、–throughput(-1 不限速)、–producer-props、–print-metrics、事务相关 –transactional-id / --transaction-duration-ms
- 消费者:–bootstrap-server、–topic、–messages、–threads、–print-metrics
三 关键指标与结果判读
- 生产者关注
- 吞吐:MB/second、records/second
- 稳定性:错误率、重试率、请求耗时分布(开启 –print-metrics 观察p95/p99)
- 消费者关注
- 吞吐:MB.sec、nMsg.sec
- 处理能力:data.consumed.in.MB / data.consumed.in.nMsg
- 端到端延迟(示例思路)
- 生产端在消息Key或Value中写入发送时间戳,消费端计算当前时间 - 发送时间得到E2E延迟分布(可用自定义Java程序或支持时延统计的压测工具)
四 测试场景设计与示例矩阵
- 分区与副本对吞吐的影响(示例结论)
- 在相同负载下,增加分区数通常提升并发与吞吐;提高副本数提升可靠性但会牺牲吞吐(更多副本同步)
- 参考对比(示例数据,具体以环境为准):
- 1分区1副本:吞吐约8.58 MB/s;平均延迟约3418.50 ms
- 3分区1副本:吞吐约10.40 MB/s;平均延迟约2508.37 ms
- 1分区3副本:吞吐约4.12 MB/s(副本同步开销显著)
- 消息大小与压缩策略
- 小消息(如100B)更受网络与请求开销影响;大消息(如1KB+)更受批量与压缩影响
- 建议组合:acks=1 / acks=all、batch.size=16KB~64KB、linger.ms=0~20ms、compression.type=none/snappy/lz4/zstd
- 并发与客户端数量
- 消费者吞吐随线程数/客户端数提升,但受分区数与Broker/网络限制;建议线程数 ≤ 分区数并逐步加压观察拐点
五 瓶颈定位与优化建议
- 快速定位
- 磁盘:iostat -x 1,若 %util 接近 100% 表示磁盘饱和;一般 >70% 即存在明显I/O压力
- 客户端资源:top / vmstat 观察CPU、上下文切换、网络
- 集群负载:通过 Kafka-Eagle 或 JMX 查看请求耗时、请求队列、网络与IO
- 优化方向
- 主题与分区:按目标吞吐与并发设计分区数,避免热点分区
- 生产者:acks、batch.size、linger.ms、compression.type、max.in.flight.requests.per.connection
- 消费者:fetch.min.bytes / fetch.max.wait.ms、max.poll.records、会话与心跳超时、并发度与分区对齐
- 存储与网络:使用SSD、合理JVM堆与GC、隔离测试流量与生产流量、避免测试过程受日志/保留策略干扰