在 Debian 上部署和运维 Apache Kafka 时,“调优”通常分为 操作系统层、JVM 层、Kafka Broker 配置、Topic/Producer/Consumer 调优、磁盘与网络 几个层面。下面按实战角度系统性说明。
Kafka 会打开大量文件(分区、日志段、网络连接)。
# 查看
ulimit -n
# 修改 /etc/security/limits.conf
kafka soft nofile 100000
kafka hard nofile 100000
Kafka 依赖 OS Page Cache,不要分配过大 JVM 堆。
# 查看
free -h
建议:
sysctl vm.swappiness=1
SSD / NVMe 推荐使用 none 或 mq-deadline
cat /sys/block/sdX/queue/scheduler
ext4 或 xfsdefaults,noatime,nodiratime
Kafka 是 JVM 应用,GC 比堆大小更重要。
KAFKA_HEAP_OPTS="-Xms6g -Xmx6g"
KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:InitiatingHeapOccupancyPercent=35
-XX:+ExplicitGCInvokesConcurrent
"
原则:
配置文件:/etc/kafka/server.properties
num.network.threads=8
num.io.threads=16
经验:
num.io.threads ≈ 磁盘数 × 2–4log.flush.interval.messages=10000
log.flush.interval.ms=1000
⚠️ 不要频繁刷盘,Kafka 设计依赖副本 + page cache
default.replication.factor=3
min.insync.replicas=2
高吞吐场景可降低一致性要求,但生产环境不建议低于 2。
log.retention.hours=72
log.segment.bytes=1G
message.max.bytes=10MB
replica.fetch.max.bytes=12MB
kafka-topics.sh --create \
--partitions 12 \
--replication-factor 3 \
--topic test
❗ 分区过多会导致:
compression.type=snappy # 或 zstd
acks=1
batch.size=64KB
linger.ms=5
compression.type=snappy
buffer.memory=64MB
高吞吐建议:
acks=1(非金融场景)fetch.min.bytes=1MB
fetch.max.wait.ms=500
max.poll.records=500
避免:
# 增加端口范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
# TIME_WAIT 复用
sysctl -w net.ipv4.tcp_tw_reuse=1
kafka-run-class.sh kafka.toolsiostat -x 1dmesg | grep kafka| 场景 | 建议 |
|---|---|
| 高吞吐 | 多分区 + batch + snappy |
| 低延迟 | 少分区 + 低 linger.ms |
| 高可靠 | acks=all + min.insync=2 |
| 大数据量 | 大 segment + 少 flush |
如果你愿意,可以告诉我:
我可以给你一套 可直接用的 server.properties 模板。