2. 基准测试与性能度量

容量治理的第一步不是调参,而是建立可信的度量基线。没有基线,任何“优化”都只是猜测。Kafka 的性能度量必须同时覆盖客户端视角与服务端视角:客户端关心一条消息从发送到被消费的端到端延迟,服务端关心 Broker 的磁盘、网络、ISR 稳定性。二者缺一,都会导致容量判断失真。

一、先明确指标定义与采集口径

端到端延迟(End-to-End Latency)指生产者调用 send() 到消费者完成该消息处理的时间差。它由生产延迟、Broker 写入与副本同步、消费者拉取与处理四段构成。吞吐量(Throughput)通常以 MB/s 或 records/s 衡量,必须区分“生产吞吐”和“消费吞吐”,二者在压测中往往不对称。P99/P999 是延迟分位数,反映尾部体验,平均值会掩盖长尾问题——一个平均 5ms 但 P999 达 800ms 的系统,对实时业务是不可接受的。

ISR 抖动指分区 ISR 集合频繁增减,通常由副本同步超时(replica.lag.time.max.ms)触发。磁盘 IO 关注写入吞吐、IO 利用率(%util)和写等待(await);网络带宽关注 Broker 网卡收发速率与客户端连接数。这些指标应通过 JMX、kafka-consumer-groups、kafka-topics --describe 以及 OS 层 iostat、sar 同时采集,形成时间对齐的数据集。

Kafka 端到端延迟分解与度量采集点 生产者 send() 时间戳 t0 linger / batch 网络传输 网卡收发速率 带宽 / 连接数 Broker 写入 Leader 追加日志 磁盘 IO / fsync ISR 副本同步 ack 返回 t1 消费者 poll 拉取 处理完成 t2 端到端延迟 = (t1 − t0) 生产+Broker 写入 + (t2 − t1) 消费拉取与处理 P99 / P999 取该延迟分布的高分位,而非平均值 客户端采集 • producer 端到端耗时埋点 • consumer lag(消费滞后) • records/s、MB/s 吞吐 • 重试率、错误率 • 分位数 P50/P99/P999 Broker 采集(JMX) • MessagesInPerSec • BytesIn/OutPerSec • IsrShrinks/ExpandsPerSec • UnderReplicatedPartitions • RequestQueueSize OS / 主机采集 • iostat:%util、await • sar -n DEV:网卡速率 • 磁盘写吞吐 MB/s • CPU iowait • TCP 重传

二、压测方法:从单变量到全链路

压测应遵循“先单点、后链路”的顺序。第一步做 Broker 单机写入压测,使用 kafka-producer-perf-test.sh 固定消息大小和分区数,逐步提升目标吞吐,观察磁盘 %util 与 P99 写入延迟的拐点。示例参数:消息 1KB、分区 12、acks=1、目标 100MB/s,若 %util 超过 80% 且 P99 从 8ms 升至 60ms,说明磁盘已成瓶颈。

bin/kafka-producer-perf-test.sh \
  --topic perf-test --num-records 5000000 \
  --record-size 1024 --throughput 100000 \
  --producer-props bootstrap.servers=broker1:9092 \
  acks=1 linger.ms=5 batch.size=65536

第二步做端到端压测,同时启动生产者和消费者,在消息体中嵌入发送时间戳,消费端计算 now - sendTime 得到真实端到端延迟,并输出分位数。第三步做故障注入:人为 kill 一个副本,观察 ISR 抖动与 UnderReplicatedPartitions 的变化,验证副本恢复时间是否满足 SLA。

三、结果判读与容量结论

判读时先看吞吐是否达到目标,再看 P99 是否在可接受范围,最后看 ISR 是否稳定。若吞吐达标但 P999 突增,通常是 GC 或磁盘抖动;若 ISR 频繁收缩,需检查 replica.lag.time.max.ms 与网络延迟;若磁盘 %util 长期高于 70%,应提前扩容或调整分区分布。压测报告应记录:目标吞吐、实测吞吐、P50/P99/P999、ISR 抖动次数、磁盘峰值 %util、网络峰值带宽,作为容量规划的输入。

压测环境必须与生产环境在磁盘类型、网络带宽、分区数、副本数上尽量一致,否则基线不可迁移。建议每次变更后重跑同一套压测脚本,形成可对比的时间序列。
不要用平均值判断延迟健康度。P999 才是容量治理的警戒线;同时注意压测客户端本身可能成为瓶颈,需监控压测机的 CPU 与网络。