在 Linux 上部署和调优 Kafka,通常从 操作系统、JVM、Kafka 自身参数、磁盘与网络 四个层面入手。下面给你一套生产环境常用、可落地的调优清单,适合大多数中大型集群。
Kafka 大量使用 socket 和文件,必须调大:
# 临时
ulimit -n 1000000
# 永久(推荐)
vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
验证:
ulimit -n
Kafka 重度依赖 Page Cache,不要禁用 swap,但不要让它频繁使用。
# 降低 swap 倾向
vm.swappiness = 10
vim /etc/sysctl.conf
vm.swappiness=10
vm.dirty_ratio=10
vm.dirty_background_ratio=5
生效:
sysctl -p
推荐使用:
mount -o noatime,nodiratime,data=ordered /dev/sdb /data/kafka
fstab 示例:
/dev/sdb /data/kafka xfs noatime,nodiratime 0 0
vim /etc/sysctl.conf
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
sysctl -p
log.dirs=/data/kafka1,/data/kafka2,/data/kafka3
Kafka 会自动做分区级负载均衡。
推荐:
如果使用 SSD:
echo noop > /sys/block/sda/queue/scheduler
如果是机械盘:
deadline
✅ JDK 17 / JDK 11(推荐)
❌ 不推荐 JDK 8 新集群
export KAFKA_HEAP_OPTS="-Xms8g -Xmx8g"
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:InitiatingHeapOccupancyPercent=35
-XX:G1HeapRegionSize=16M
"
⚠️ 原则:
num.network.threads=8
num.io.threads=16
建议:
num.io.threads ≥ 磁盘数量 × 2num.network.threads ≈ CPU 核数default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
log.flush.interval.messages=10000
log.flush.interval.ms=1000
✅ Kafka 不依赖频繁 flush,靠 Page Cache
log.segment.bytes=1073741824
log.retention.hours=168
log.cleanup.policy=delete
大流量场景:
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
linger.ms=5
batch.size=65536
compression.type=lz4
acks=1
acks=all
retries=Integer.MAX_VALUE
enable.idempotence=true
fetch.min.bytes=1
fetch.max.bytes=52428800
max.poll.records=500
避免:
| 项目 | 建议 |
|---|---|
| 堆内存 | 8G |
| Page Cache | ≥8G |
| 磁盘 | 3×SSD |
| 副本 | 3 |
| GC | G1 |
| 压缩 | LZ4 |
| 误区 | 正确做法 |
|---|---|
| 频繁 flush | 让 OS 管理 |
| 堆内存过大 | 留给 Page Cache |
| 副本数=1 | 至少 3 |
| 使用 RAID5 | 多盘 JBOD |
| 高并发小消息 | 增大 batch |
如果你愿意,可以告诉我:
我可以直接给你一套 可直接上线的 Kafka 参数配置。