Kafka 性能调优进阶。本文将深入探讨 JVM 优化、存储优化、网络优化、批量优化等高级性能调优技术。
一、JVM 优化
1.1 GC 选择
G1 GC 配置:
# kafka-server-start.sh
# 堆内存
export KAFKA_HEAP_OPTS="-Xms8g -Xmx8g"
# G1 GC
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC \
-XX:MaxGCPauseMillis=20 \
-XX:InitiatingHeapOccupancyPercent=35 \
-XX:+ExplicitGCInvokesConcurrent \
-XX:MaxGCPauseMills=20"
# GC 日志
export KAFKA_JVM_PERFORMANCE_OPTS="$KAFKA_JVM_PERFORMANCE_OPTS \
-Xlog:gc*:file=/var/log/kafka/gc.log:time,level,tags \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps"
ZGC 配置(JDK 15+):
# ZGC
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseZGC \
-XX:ZCollectionInterval=5 \
-XX:ZAllocationSpikeTolerance=2"
1.2 堆外内存
# 堆外内存配置
export KAFKA_JVM_PERFORMANCE_OPTS="$KAFKA_JVM_PERFORMANCE_OPTS \
-XX:MaxDirectMemorySize=16g"
# PageCache 预读
echo 3 > /proc/sys/vm/drop_caches
1.3 JVM 参数优化
# 完整 JVM 配置
export KAFKA_JVM_PERFORMANCE_OPTS="-server \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=20 \
-XX:InitiatingHeapOccupancyPercent=35 \
-XX:+ExplicitGCInvokesConcurrent \
-XX:MaxGCPauseMills=20 \
-XX:+DisableExplicitGC \
-XX:+AlwaysPreTouch \
-XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMills=20 \
-XX:G1HeapRegionSize=16m \
-XX:G1ReservePercent=10 \
-XX:G1NewSizePercent=50 \
-XX:G1MaxNewSizePercent=60"
二、存储优化
2.1 磁盘配置
多磁盘挂载:
# server.properties
# 多磁盘配置
log.dirs=/mnt/disk1/kafka-logs,/mnt/disk2/kafka-logs,/mnt/disk3/kafka-logs
# 磁盘调度策略
# echo deadline > /sys/block/sda/queue/scheduler
SSD 优化:
# SSD TRIM
fstrim -v /mnt/disk1
fstrim -v /mnt/disk2
fstrim -v /mnt/disk3
# 禁用磁盘访问时间更新
mount -o remount,noatime /mnt/disk1
mount -o remount,noatime /mnt/disk2
mount -o remount,noatime /mnt/disk3
2.2 日志配置
# 日志分段
log.segment.bytes=1073741824 # 1GB
log.segment.delete.delay.ms=60000 # 60 秒
# 日志保留
log.retention.hours=168 # 7 天
log.retention.bytes=-1 # 不限制
# 日志清理
log.cleanup.policy=delete
log.cleaner.enable=true
log.cleaner.threads=2
log.cleaner.io.max.bytes.per.second=104857600
# 刷盘配置(异步)
log.flush.interval.messages=10000
log.flush.interval.ms=1000
2.3 索引优化
# 索引配置
log.index.interval.bytes=4096 # 每 4KB 创建索引
log.index.size.max.bytes=10485760 # 索引最大 10MB
# 时间索引
log.index.interval.bytes=4096
三、网络优化
3.1 网络线程
# 网络线程配置
num.network.threads=8 # 网络线程数
num.io.threads=16 # IO 线程数
num.replica.fetchers=2 # 副本拉取线程
3.2 Socket 配置
# Socket 缓冲区
socket.send.buffer.bytes=102400 # 100KB
socket.receive.buffer.bytes=102400 # 100KB
socket.request.max.bytes=104857600 # 100MB
# 连接配置
connections.max.idle.ms=600000 # 10 分钟
connections.max.reauth.ms=0 # 不限制
3.3 网络参数调优
# 系统网络参数
# /etc/sysctl.conf
# TCP 缓冲区
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
# TCP 连接
net.core.netdev_max_backlog=250000
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
# TCP 优化
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=1200
# 应用配置
sysctl -p
四、批量优化
4.1 Producer 批量
Properties props = new Properties();
// 批量配置
props.put("batch.size", 65536); // 64KB
props.put("linger.ms", 10); // 10ms
// 压缩
props.put("compression.type", "lz4");
// 可靠性
props.put("acks", "all");
props.put("retries", Integer.MAX_VALUE);
props.put("enable.idempotence", true);
// 流量控制
props.put("max.in.flight.requests.per.connection", 5);
props.put("buffer.memory", 67108864); // 64MB
4.2 Consumer 批量
Properties props = new Properties();
// 拉取配置
props.put("fetch.min.bytes", 1024); // 1KB
props.put("fetch.max.wait.ms", 100); // 100ms
props.put("max.poll.records", 500); // 500 条
// 提交配置
props.put("enable.auto.commit", "false");
props.put("auto.commit.interval.ms", "5000");
五、分区优化
5.1 分区数计算
分区数计算公式:
分区数 = max(峰值 TPS / 单分区 TPS, 消费者并发度)
示例:
- 峰值 TPS: 10000
- 单分区 TPS: 2000
- 消费者并发度:8
分区数 = max(10000/2000, 8) = max(5, 8) = 8
5.2 分区重分配
# 生成分区重分配计划
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
--topics-to-move-json-file topics-to-move.json \
--broker-list "0,1,2,3,4" \
--generate > reassign-plan.json
# 执行重分配
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
--reassignment-json-file reassign-plan.json \
--execute
# 验证重分配
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
--reassignment-json-file reassign-plan.json \
--verify
六、性能监控
6.1 关键指标
| 指标 | 说明 | 目标值 |
|---|---|---|
kafka_network_RequestMetrics_RequestQueueTimeMs | 请求排队时间 | < 100ms |
kafka_network_RequestMetrics_LocalTimeMs | 本地处理时间 | < 50ms |
kafka_server_BrokerTopicMetrics_MessagesInPerSec | 消息吞吐量 | - |
kafka_server_BrokerTopicMetrics_BytesInPerSec | 字节吞吐量 | - |
kafka_log_Log_Size | 日志大小 | - |
6.2 性能基准
单 Broker 性能(8 核 16GB SSD):
- 生产 TPS:5 万 -8 万
- 消费 TPS:8 万 -12 万
- 平均延迟:< 5ms
- P99 延迟:< 30ms
集群性能(5 Broker):
- 生产 TPS:25 万 -40 万
- 消费 TPS:40 万 -60 万
七、最佳实践
7.1 配置建议
配置建议:
1. 使用 SSD 磁盘
2. 配置异步刷盘
3. 优化 JVM 参数
4. 合理设置分区数
5. 启用压缩
6. 批量发送/消费
7.2 性能检查清单
性能检查:
- [ ] JVM 参数优化
- [ ] 磁盘配置优化
- [ ] 网络参数优化
- [ ] 批量配置优化
- [ ] 分区数合理
- [ ] 监控指标正常
- [ ] 性能基准测试
7.3 故障排查
性能问题排查:
1. 检查 GC 日志
2. 检查磁盘 IO
3. 检查网络带宽
4. 检查 CPU 使用率
5. 检查分区分布
总结
Kafka 性能调优进阶的核心要点:
- JVM 优化:GC 选择、堆外内存、JVM 参数
- 存储优化:磁盘配置、日志配置、索引优化
- 网络优化:网络线程、Socket 配置、系统参数
- 批量优化:Producer 批量、Consumer 批量
- 分区优化:分区数计算、分区重分配
- 性能监控:关键指标、性能基准
核心要点:
- 使用 SSD 磁盘
- 配置异步刷盘
- 优化 JVM 参数
- 合理设置分区数
- 启用压缩
- 批量发送/消费
参考资料
- Kafka Performance Tuning 官方文档
- Kafka Operations 官方文档
- 《Kafka 权威指南》第 8 章