在 Linux 上部署和调优 Kafka,通常可以从 操作系统、JVM、Kafka Broker 参数、Topic/分区设计、磁盘与网络、监控 几个层面来进行。下面给你一个较系统的调优指南。
Kafka 大量使用文件和网络连接。
# 查看
ulimit -n
# 修改(/etc/security/limits.conf)
kafka soft nofile 1000000
kafka hard nofile 1000000
避免频繁 swap:
sysctl -w vm.swappiness=1
Kafka 依赖 Page Cache:
sysctl -w vm.dirty_background_ratio=5
sysctl -w vm.dirty_ratio=10
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.tcp_tw_reuse=1
推荐:
挂载参数示例:
mount -o noatime,nodiratime /dev/sdb /kafka
log.dirs=/data1/kafka,/data2/kafka,/data3/kafka
Kafka 会自动做分区轮询。
一般规则:
export KAFKA_HEAP_OPTS="-Xms6g -Xmx6g"
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
"
num.network.threads=8
num.io.threads=16
(CPU 核数相关)
log.flush.interval.messages=10000
log.flush.interval.ms=1000
通常 依赖 OS 刷盘即可,不要频繁 flush。
default.replication.factor=3
min.insync.replicas=2
高吞吐可放宽:
acks=1
强一致:
acks=all
log.segment.bytes=1G
message.max.bytes=10MB
经验公式:
分区数 ≈ 目标吞吐 / 单分区吞吐
使用:
kafka-reassign-partitions.sh
避免热点 Broker。
batch.size=64KB
linger.ms=5–20
compression.type=lz4 / zstd
acks=1
buffer.memory=64MB
fetch.min.bytes=1MB
fetch.max.wait.ms=500
max.poll.records=500–1000
kafka-producer-perf-test.sh
kafka-consumer-perf-test.sh
❌ 堆内存设太大
❌ 频繁 flush 日志
❌ 分区数过多(>几千)
❌ 忽略 Page Cache
❌ 网络和磁盘瓶颈未定位
如果你愿意,可以告诉我:
我可以给你一套 针对性调优参数模板。