优化 Debian 上的 Kafka 配置,通常需要从 系统层、JVM 层、Kafka 本身、磁盘与网络 四个方面入手。下面我会按实际使用场景(生产 / 高吞吐 / 低延迟)给你一套可落地的优化清单。
Kafka 会打开大量 socket 和文件。
# 查看
ulimit -n
# 修改(立即生效)
ulimit -n 1000000
永久修改:
# /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
Kafka 对延迟敏感,避免 JVM 被 swap。
sudo swapoff -a
永久禁用(注释 /etc/fstab 中 swap 行):
# /etc/fstab
# UUID=xxxx none swap sw 0 0
mkfs.xfs /dev/sdX
mount -o noatime,nodiratime /dev/sdX /data/kafka
挂载选项:
noatime,nodiratime
编辑 /etc/sysctl.conf:
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
应用:
sudo sysctl -p
✅ 推荐 JDK 11 或 17(LTS)
java -version
编辑 kafka-server-start.sh 或 kafka_env.sh:
示例(8G 内存机器):
export KAFKA_HEAP_OPTS="-Xms4G -Xmx4G"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=20"
禁止频繁 GC 参数:
-XX:+DisableExplicitGC
-XX:+HeapDumpOnOutOfMemoryError
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
说明:
num.io.threads:磁盘 IO 核心,建议 ≥ 磁盘数 × 2log.dirs=/data/kafka-logs
log.retention.hours=168
log.segment.bytes=1073741824
log.flush.interval.messages=10000
log.flush.interval.ms=1000
✅ 生产环境建议:
log.dirsdefault.replication.factor=3
min.insync.replicas=2
如果你追求高吞吐:
acks=1
如果你追求数据安全:
acks=all
linger.ms=5
batch.size=32768
compression.type=lz4
linger.ms=0
batch.size=16384
compression.type=none
unclean.leader.election.enable=false
auto.leader.rebalance.enable=false
bootstrap.servers=broker1:9092
acks=1
linger.ms=5
batch.size=32768
compression.type=lz4
fetch.min.bytes=1024
fetch.max.bytes=52428800
max.poll.records=500
工具:
# 生产
kafka-producer-perf-test.sh \
--topic test \
--num-records 1000000 \
--record-size 1024 \
--throughput -1 \
--producer-props bootstrap.servers=localhost:9092
# 消费
kafka-consumer-perf-test.sh \
--topic test \
--bootstrap.servers localhost:9092 \
--messages 1000000
| 问题 | 解决 |
|---|---|
| systemd 限制 FD | 修改 LimitNOFILE=1000000 |
| 磁盘 ext4 | 换 XFS |
| swap 没关 | 延迟抖动 |
| JVM 堆过大 | 超过 32G 指针压缩失效 |
8C16G 机器 + 3 节点
num.network.threads=8
num.io.threads=16
log.dirs=/data1/kafka-logs,/data2/kafka-logs
default.replication.factor=3
min.insync.replicas=2
acks=1
linger.ms=5
batch.size=32768
compression.type=lz4
如果你愿意,我可以:
你可以直接贴:
CPU / 内存 / 磁盘类型 / Kafka 版本 / 使用场景