在 Ubuntu 上调优 Kafka,通常从 操作系统、JVM、Kafka 自身参数、磁盘与网络 四个方面入手。下面给你一套生产环境常用、实用性强的调优清单,并说明为什么这么调。
Kafka 大量使用文件和网络连接。
# 查看当前限制
ulimit -n
# 永久修改
sudo vim /etc/security/limits.conf
添加:
* soft nofile 1000000
* hard nofile 1000000
并确认:
sudo vim /etc/systemd/system.conf
DefaultLimitNOFILE=1000000
重启后生效。
Kafka 对延迟敏感,swap 会导致 GC 停顿。
sudo swapoff -a
永久禁用:
sudo vim /etc/fstab
# 注释掉 swap 行
✅ 推荐:
ext4(稳定)xfs(高吞吐,推荐)挂载参数(示例):
mount -o noatime,nodiratime,data=writeback /dev/sdb /data
sudo vim /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
生效:
sudo sysctl -p
⚠️ 不要太大,不要太小
# 编辑 Kafka 启动脚本
vim kafka/bin/kafka-server-start.sh
推荐:
export KAFKA_HEAP_OPTS="-Xms4G -Xmx4G"
✅ 经验法则:
✅ G1 GC(默认)
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:InitiatingHeapOccupancyPercent=35
"
如果是低延迟场景(金融/实时):
-XX:+UseZGC # JDK 17+
server.properties 关键参数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=3
log.retention.hours=168
log.segment.bytes=1073741824
log.cleanup.policy=delete
✅ 多磁盘建议:
log.dirs=/data1/kafka-logs,/data2/kafka-logs
log.flush.interval.messages=10000
log.flush.interval.ms=1000
⚠️ 生产环境一般不用强制刷盘 依赖 OS page cache 即可。
bootstrap.servers=xxx
acks=1 # 0:最快 1:平衡 all:最安全
compression.type=lz4
batch.size=32768
linger.ms=5
buffer.memory=67108864
fetch.min.bytes=1
fetch.max.bytes=52428800
max.poll.records=500
| 场景 | 推荐 |
|---|---|
| 高吞吐 | 多块 SSD / NVMe |
| 稳定性 | JBOD(不 RAID) |
| 容错 | Kafka 副本机制 |
❌ 不推荐 RAID 5
# 查看 broker 状态
kafka-broker-api-versions.sh --bootstrap-server localhost:9092
# 查看 topic 状态
kafka-topics.sh --describe
num.network.threads=8
num.io.threads=16
log.dirs=/data/kafka-logs
num.partitions=3
default.replication.factor=3
log.retention.hours=168
KAFKA_HEAP_OPTS="-Xms4G -Xmx4G"
Kafka 调优核心:少 GC、多磁盘、够线程、不 swap、副本保安全。
如果你愿意,我可以:
server.properties 是否合理直接把你的环境信息发我即可。