在 Linux 环境下对 Kafka 进行性能调优,通常可以从 系统层、Kafka Broker、Producer、Consumer、Topic/分区设计 五个维度入手。下面给你一份比较系统、可落地的调优指南。
Kafka 是 顺序写磁盘,对磁盘吞吐敏感。
mkfs.xfs /dev/sdb
Kafka 会打开大量文件(分区、日志段)。
# /etc/security/limits.conf
kafka soft nofile 100000
kafka hard nofile 100000
# 增加 socket buffer
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 加快 TIME_WAIT 回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 虚拟内存
vm.swappiness = 1
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
# 网络线程
num.network.threads=8
# 磁盘 IO 线程(建议 = 磁盘数)
num.io.threads=16
# 后台线程
background.threads=10
# socket 缓冲区
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
Kafka 默认依赖 OS 刷盘,不建议频繁 flush。
# 不强制刷盘(依赖 replica)
log.flush.interval.messages=10000
log.flush.interval.ms=1000
# 日志段大小
log.segment.bytes=1073741824
# 保留策略
log.retention.hours=72
log.retention.bytes=107374182400
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
batch.size=16384 # 16KB
linger.ms=5 # 稍微等待攒批
buffer.memory=33554432 # 32MB
compression.type=lz4 # 或 zstd
acks=1 # 吞吐优先
# acks=all 更安全但慢
retries=3
fetch.min.bytes=1024
fetch.max.wait.ms=100
max.poll.records=500
enable.auto.commit=false
# 处理完一批再 commit
# 生产压测
kafka-producer-perf-test.sh
# 消费压测
kafka-consumer-perf-test.sh
| 问题 | 原因 | 解决 |
|---|---|---|
| 吞吐低 | 分区少 | 增加分区 |
| 延迟高 | acks=all | 降低一致性 |
| CPU 高 | 压缩重 | 换 lz4/zstd |
| 磁盘满 | 保留过长 | 缩短 retention |
| Lag 增长 | Consumer 慢 | 扩 Consumer |
如果你愿意,可以告诉我:
我可以直接给你一套 可复制的调优参数模板。