优化 Debian 上的 Kafka 通常从 系统层、JVM 层、Kafka 配置层、磁盘与网络层 四个方面入手。下面给你一套可落地的优化清单,适用于生产环境,也适合你做性能调优。
Kafka 是高连接、高文件句柄服务。
# 查看当前限制
ulimit -n
# 修改
sudo vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
并在 /etc/systemd/system.conf 中:
DefaultLimitNOFILE=1000000
然后重启。
Kafka 对延迟极其敏感,swap 会导致 GC 停顿。
sudo swapoff -a
永久禁用:
sudo vim /etc/fstab
# 注释掉 swap 行
✅ ext4 / xfs(首选 xfs)
挂载参数建议:
noatime,nodiratime
示例:
/dev/sdb /data/kafka xfs noatime,nodiratime 0 0
sudo vim /etc/sysctl.conf
推荐配置:
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
net.core.somaxconn = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
生效:
sudo sysctl -p
✅ JDK 11 或 JDK 17(推荐)
java -version
编辑 Kafka 启动脚本:
vim /opt/kafka/bin/kafka-server-start.sh
或推荐方式(Kafka 2.8+):
export KAFKA_HEAP_OPTS="-Xms8G -Xmx8G"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=20"
✅ 不要超内存
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/data/kafka-logs
num.partitions=6
default.replication.factor=2
log.retention.hours=168
log.segment.bytes=1073741824
log.flush.interval.messages=10000
log.flush.interval.ms=1000
✅ 不要频繁 flush Kafka 依赖 OS page cache,而不是 fsync。
unclean.leader.election.enable=false
min.insync.replicas=2
log.dirs=/data1/kafka-logs,/data2/kafka-logs
linger.ms=5
batch.size=32768
compression.type=lz4
acks=1 或 all(看可靠性需求)
fetch.min.bytes=1048576
fetch.max.wait.ms=500
max.poll.records=500
推荐:
bin/kafka-producer-perf-test.sh
bin/kafka-consumer-perf-test.sh
| 问题 | 原因 |
|---|---|
| 延迟高 | swap 开启 |
| CPU 高 | GC 频繁 |
| 吞吐低 | 分区太少 |
| 磁盘慢 | RAID5 / 未用 xfs |
| OOM | 堆太大 |
✅ Debian
✅ JDK 17
✅ XFS + 多盘
✅ G1GC
✅ 关闭 swap
✅ 合理分区数(≥ broker 数 × 2)
如果你愿意,我可以:
直接告诉我你的 机器配置 + 使用场景 即可。