在 Ubuntu 上优化 Kafka,通常从 系统层、JVM 层、Kafka 配置层、磁盘与网络层 四个方面入手。下面给你一套实战型优化清单,适合生产环境,也适合你做性能调优或压测。
✅ 推荐使用 XFS 或 ext4(XFS 更优)
mkfs.xfs /dev/sdX
✅ 挂载参数优化
mount -o noatime,nodiratime,data=writeback /dev/sdX /data/kafka
建议写入 /etc/fstab:
/dev/sdX /data/kafka xfs noatime,nodiratime 0 0
✅ 磁盘尽量用多块盘
log.dirs=/data/kafka1,/data/kafka2,/data/kafka3
ulimit -n
建议至少:
ulimit -n 1000000
永久生效:
# /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
编辑 /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=4096
生效:
sysctl -p
✅ 不要太大,避免 GC 停顿
export KAFKA_HEAP_OPTS="-Xms4G -Xmx4G"
经验值:
⚠️ 不要超过物理内存的 50%
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:InitiatingHeapOccupancyPercent=35
"
编辑 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.flush.interval.messages=10000
log.flush.interval.ms=1000
✅ 段文件大小
log.segment.bytes=1073741824
✅ 保留策略
log.retention.hours=72
log.retention.bytes=-1
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
queued.max.requests=500
num.replica.fetchers=4
acks=1 # 高吞吐
compression.type=lz4 # 或 zstd
batch.size=32768
linger.ms=5
buffer.memory=67108864
fetch.min.bytes=1024
fetch.max.bytes=52428800
max.poll.records=500
host.name=<IP>
✅ 必备:
重点监控:
| 问题 | 原因 | 解决 |
|---|---|---|
| 写入慢 | 磁盘 IO | 多盘 + 顺序写 |
| 延迟高 | GC | 减小堆 + G1 |
| 消费慢 | fetch 参数 | 调大 batch |
| CPU 高 | 线程少 | 增加 io/network threads |
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
log.flush.interval.messages=10000
default.replication.factor=3
JVM:
-Xms8G -Xmx8G -XX:+UseG1GC
如果你愿意,可以告诉我:
我可以给你一份 针对你环境的定制优化方案。