Skip to content
清晨的一缕阳光
返回

Kafka 性能调优进阶实战

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 性能调优进阶的核心要点:

  1. JVM 优化:GC 选择、堆外内存、JVM 参数
  2. 存储优化:磁盘配置、日志配置、索引优化
  3. 网络优化:网络线程、Socket 配置、系统参数
  4. 批量优化:Producer 批量、Consumer 批量
  5. 分区优化:分区数计算、分区重分配
  6. 性能监控:关键指标、性能基准

核心要点

参考资料


分享这篇文章到:

上一篇文章
Redis 集群部署方案全解析
下一篇文章
Kafka 最佳实践与生产经验总结