下面从 Ubuntu 上运行 Kafka(通常是 JVM 服务) 的角度,系统性地讲一下 Kafka 调优配置,分为:系统层、JVM 层、Kafka Broker 配置、Topic/Producer/Consumer 调优、监控与压测。
Kafka 会打开大量文件(日志段、索引)。
# 查看
ulimit -n
# 修改(临时)
ulimit -n 100000
# 永久(/etc/security/limits.conf)
kafka soft nofile 100000
kafka hard nofile 100000
swap 会导致 Kafka 延迟飙升。
sudo swapoff -a
永久禁用:注释 /etc/fstab 中的 swap 行
建议使用 noop 或 deadline(SSD 推荐 noop)
cat /sys/block/sdX/queue/scheduler
echo noop | sudo tee /sys/block/sdX/queue/scheduler
defaults,noatime,nodiratime
# 增加端口范围
net.ipv4.ip_local_port_range = 1024 65535
# 增加 backlog
net.core.somaxconn = 4096
一般规则:
# server.properties 同级
export KAFKA_HEAP_OPTS="-Xms6g -Xmx6g"
Kafka 2.x+ 推荐 G1GC
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:InitiatingHeapOccupancyPercent=35
"
(server.properties)
log.dirs=/data/kafka-logs
num.partition=3
default.replication.factor=3
min.insync.replicas=2
高性能(允许少量丢失)
log.flush.interval.messages=10000
log.flush.interval.ms=1000
更强可靠
log.flush.scheduler.interval.ms=200
num.network.threads=8
num.io.threads=16
queued.max.requests=500
kafka-topics.sh --create \
--partitions 12 \
--replication-factor 3
acks=1 # 高性能
# acks=all # 高可靠
batch.size=16384
linger.ms=5
compression.type=snappy
fetch.min.bytes=1024
fetch.max.wait.ms=100
max.poll.records=500
unclean.leader.election.enable=false
min.insync.replicas=2
# 生产
kafka-producer-perf-test.sh \
--topic test \
--num-records 1000000 \
--record-size 1024 \
--throughput -1
# 消费
kafka-consumer-perf-test.sh \
--topic test \
--messages 1000000
❌ 用 root 跑 Kafka
✅ 用独立 kafka 用户
❌ 日志和 Zookeeper 放同一盘
✅ 分开磁盘
❌ 开 swap
✅ 关 swap
如果你愿意,可以告诉我:
我可以给你一套 可直接用的 server.properties 模板。