优化 Linux 上的 Kafka,通常从 操作系统、JVM、Kafka 配置、磁盘与网络、生产/消费端 几个层面入手。下面给你一套实战型优化清单,按优先级排列,适合生产环境。
Kafka 大量使用文件和网络连接。
# 查看
ulimit -n
# 修改(永久)
vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
Kafka 对延迟非常敏感,swap 会导致 GC 停顿。
swapoff -a
永久禁用:
vim /etc/fstab # 注释 swap 行
✅ 推荐使用 XFS 或 ext4
挂载参数(示例):
mount -o noatime,nodiratime,data=writeback /dev/sdb /data
建议:
vim /etc/sysctl.conf
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 16384
生效:
sysctl -p
经验公式:
Heap = 6~8GB(不要超过 16GB)
export KAFKA_HEAP_OPTS="-Xms6g -Xmx6g"
⚠️ 原因:
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:InitiatingHeapOccupancyPercent=35
"
broker.id=1
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=3
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
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
min.insync.replicas=2
acks=1 或 all
compression.type=lz4
batch.size=32768
linger.ms=5
buffer.memory=67108864
✅ 高吞吐:
acks=1compression.type=lz4✅ 高可靠:
acks=allmin.insync.replicas=2fetch.min.bytes=1
fetch.max.bytes=52428800
max.poll.records=500
消费者:
| 问题 | 原因 | 解决 |
|---|---|---|
| 写入慢 | 分区少 | 增加 partition |
| 消费慢 | 消费者少 | 增加 consumer |
| 延迟高 | GC / swap | 调整 JVM / 禁用 swap |
| 磁盘 IO 高 | page cache 不够 | 增加内存 |
| leader 不均衡 | 未 rebalance | kafka-preferred-replica-election |
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
log.dirs=/data/kafka-logs
num.partitions=6
default.replication.factor=2
min.insync.replicas=2
你可以直接告诉我:
Kafka 版本 + 机器配置 + 主要用途(日志 / 消息 / 流处理)