在 Debian 下对 Apache Kafka 进行调优,通常可以从 操作系统、JVM、Kafka Broker 配置、Topic/分区设计、磁盘与网络、生产消费端 几个层面来做。下面给你一套比较系统、可落地的调优思路。
Kafka 会打开大量文件(日志段、索引)。
# 查看
ulimit -n
# 修改 /etc/security/limits.conf
kafka soft nofile 100000
kafka hard nofile 100000
swap 会导致 Kafka 延迟飙升。
sysctl vm.swappiness=1
# 写入 /etc/sysctl.conf
vm.swappiness=1
defaults,noatime,nodiratime
# /etc/sysctl.conf
net.core.somaxconn=4096
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.tcp_tw_reuse=1
net.core.rmem_max=16777216
net.core.wmem_max=16777216
Kafka 是 JVM 应用,但不宜给太大堆。
# server.properties 同目录的 kafka-server-start.sh 或 env
KAFKA_HEAP_OPTS="-Xms6g -Xmx6g"
一般经验:
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
log.dirs=/data1/kafka-logs,/data2/kafka-logs
num.recovery.threads.per.data.dir=4
多磁盘可显著提升吞吐。
# 默认即可,不建议频繁 flush
log.flush.interval.messages=10000
log.flush.interval.ms=1000
num.network.threads=8
num.io.threads=16
经验值:
default.replication.factor=3
min.insync.replicas=2
kafka-topics.sh --create \
--partitions 12 \
--replication-factor 3
acks=all
retries=3
batch.size=16384 # 可到 64KB~128KB
linger.ms=5
compression.type=lz4
buffer.memory=33554432
核心点:
acks=all + min.insync.replicas 保安全batch.size + linger.ms 提升吞吐fetch.min.bytes=1024
fetch.max.wait.ms=500
max.poll.records=500
建议:
pollkafka-producer-perf-test.sh
kafka-consumer-perf-test.sh
| 问题 | 可能原因 |
|---|---|
| 写入慢 | 磁盘 IO、副本同步、batch 太小 |
| 消费滞后 | 消费逻辑慢、分区不均 |
| CPU 高 | 压缩、GC、线程数不合理 |
| 延迟高 | swap、网络、刷盘策略 |
# broker
num.network.threads=8
num.io.threads=16
log.dirs=/data1/kafka,/data2/kafka
default.replication.factor=3
min.insync.replicas=2
# OS
vm.swappiness=1
ulimit -n 100000
# JVM
-Xms6g -Xmx6g -XX:+UseG1GC
如果你愿意,可以告诉我:
我可以直接给你一套 可复制的配置文件。