在 Linux 上运行 Kafka 时,调优通常分为 OS / 磁盘 / 网络 / JVM / Kafka 参数 / 生产消费端 几个层面。下面给你一份偏实战、可落地的调优清单。
Kafka 对磁盘顺序写依赖极强。
mount -o noatime,nodiratime,discard /dev/sdb /kafka
Kafka 会打开大量文件:
ulimit -n 100000
/etc/security/limits.conf:
kafka soft nofile 100000
kafka hard nofile 100000
Kafka 依赖 OS Page Cache,不要给 JVM 太大内存。
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_tw_reuse = 1
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
sysctl -p
/opt/kafka/bin/kafka-server-start.sh 或 KAFKA_HEAP_OPTS
export KAFKA_HEAP_OPTS="-Xms6g -Xmx6g"
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=35
"
建议:
server.properties 关键项:
num.network.threads=8
num.io.threads=16
num.replica.fetchers=4
Kafka 靠副本保证安全,不依赖频繁刷盘:
log.flush.interval.messages=10000
log.flush.interval.ms=1000
log.flush.scheduler.interval.ms=2000
高吞吐场景甚至可以更大
log.segment.bytes=1073741824
log.retention.hours=72
log.cleaner.enable=true
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
acks=all
retries=5
batch.size=64KB~128KB
linger.ms=5~20
compression.type=lz4
buffer.memory=64MB
max.in.flight.requests.per.connection=5
✅ 提升吞吐
❌ 不要 acks=0(丢数据)
fetch.min.bytes=1MB
fetch.max.wait.ms=500
max.poll.records=500~1000
enable.auto.commit=false
消费逻辑:
kafka-producer-perf-test.sh
kafka-consumer-perf-test.sh
| 问题 | 原因 |
|---|---|
| 吞吐上不去 | IO 线程少 / 磁盘慢 |
| 延迟高 | linger.ms 太大 |
| CPU 高 | 压缩 / 反压 |
| OOM | JVM 太大 |
| 消费滞后 | 单分区 / 消费慢 |
Kafka 调优 = Linux 内核 + 磁盘顺序写 + Page Cache + Producer 批量 + 不滥用 JVM
如果你愿意,可以告诉我:
我可以给你一份可直接用的参数模板。