在 Ubuntu 上优化 Kafka,通常从 系统层、JVM 层、Kafka 配置层、磁盘与网络层 四个方面入手。下面给你一套生产环境常用、可落地的优化方案(适用于 Kafka 2.x / 3.x)。
Kafka 会打开大量文件和网络连接。
# 查看当前限制
ulimit -n
# 修改(临时)
ulimit -n 1000000
永久生效:
sudo vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
Kafka 对延迟非常敏感,swap 会导致 GC 停顿。
sudo swapoff -a
永久禁用:
sudo vim /etc/fstab
# 注释 swap 行
✅ ext4 或 xfs(推荐 xfs)
挂载参数优化:
sudo vim /etc/fstab
defaults,noatime,nodiratime 0 0
生效:
sudo mount -o remount /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
net.ipv4.tcp_max_syn_backlog=4096
生效:
sudo sysctl -p
log.dirs=/data/kafka1,/data/kafka2,/data/kafka3
✅ Kafka 会自动做 磁盘级别负载均衡
| 类型 | 建议 |
|---|---|
| HDD | ❌ 不推荐 |
| SSD | ✅ 推荐 |
| NVMe | ✅✅ 生产首选 |
export KAFKA_HEAP_OPTS="-Xms8G -Xmx8G"
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=4
"
✅ 不要超过物理内存的 50%
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
log.retention.hours=168
log.segment.bytes=1073741824
log.cleanup.policy=delete
log.flush.interval.messages=10000
log.flush.interval.ms=1000
✅ 不要频繁 flush,让 OS 管理
default.replication.factor=3
min.insync.replicas=2
unclean.leader.election.enable=false
num.partitions=6
message.max.bytes=10485760
replica.fetch.max.bytes=10485760
props.put("batch.size", 32768);
props.put("linger.ms", 5);
props.put("compression.type", "lz4");
props.put("acks", "1"); // 或 "all"
props.put("buffer.memory", 67108864);
✅ acks=1 吞吐高,acks=all 最安全
props.put("fetch.min.bytes", 1024);
props.put("fetch.max.bytes", 52428800);
props.put("max.poll.records", 500);
✅ 提高吞吐,减少 poll 次数
kafka-producer-perf-test.sh
kafka-consumer-perf-test.sh
❌ 把 Kafka 堆内存设得太大
❌ 开启过多 partition(>1000/节点)
❌ 使用 swap
❌ 单一磁盘
❌ 频繁 flush 日志
✅ Kafka 的设计理念:依赖 OS Page Cache
| 场景 | 建议 |
|---|---|
| 高吞吐 | SSD + 多磁盘 + G1GC |
| 低延迟 | 禁用 swap + 少 partition |
| 高可靠 | acks=all + min.insync.replicas=2 |
| 大数据量 | 合理 retention + compaction |
如果你愿意,我可以:
直接告诉我你的 机器配置和使用场景 即可。