在 Debian 系统下对 Apache Kafka 进行调优,通常从 操作系统、JVM、Kafka 自身配置、磁盘与网络 四个方面入手。下面给你一套比较系统、实战向的调优建议(适用于生产环境,也适合中大型集群)。
Kafka 大量使用文件和网络连接,必须调大。
# 查看当前限制
ulimit -n
# 永久修改(推荐)
vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
root soft nofile 1000000
root hard nofile 1000000
并确认:
/etc/pam.d/common-session
包含:
session required pam_limits.so
Kafka 对延迟敏感,swap 会导致 GC 停顿。
swapoff -a
永久禁用:
vim /etc/fstab
# 注释掉 swap 行
mount -o noatime,nodiratime,data=writeback /dev/sdX /kafka
fstab 示例:
/dev/sdX /kafka xfs noatime,nodiratime 0 0
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_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
生效:
sysctl -p
原则:
vim kafka-server-start.sh
或设置环境变量:
export KAFKA_HEAP_OPTS="-Xms8G -Xmx8G"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=20"
若使用 JDK 17,可尝试 ZGC(高吞吐低延迟):
-XX:+UseZGC
broker.id=1
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=/kafka/logs
num.partitions=3
default.replication.factor=2
log.retention.hours=168
log.segment.bytes=1073741824
log.cleanup.policy=delete
✅ 建议:
num.replica.fetchers=4
replica.lag.time.max.ms=30000
linger.ms=5
batch.size=32768
compression.type=lz4
unclean.leader.election.enable=false
min.insync.replicas=2
acks=all
| 场景 | 建议 |
|---|---|
| 高吞吐 | SSD |
| 成本优先 | HDD |
| 极高可靠 | RAID10 |
✅ 不要使用 RAID5
Kafka 本身有副本机制,RAID 不是必须。
linger.ms=5
batch.size=64k
compression.type=lz4
acks=1 或 all
fetch.min.bytes=1
fetch.max.bytes=50MB
max.poll.records=500
推荐工具:
# 生产测试
kafka-producer-perf-test.sh \
--topic test \
--num-records 1000000 \
--record-size 1024 \
--throughput -1 \
--producer-props bootstrap.servers=localhost:9092
# 消费测试
kafka-consumer-perf-test.sh \
--topic test \
--bootstrap-server localhost:9092 \
--messages 1000000
| 问题 | 原因 |
|---|---|
| 写入慢 | 分区少、磁盘慢 |
| 消费 lag | consumer 少、poll 小 |
| broker CPU 高 | 副本同步、GC |
| 延迟抖动 | swap、GC、网络 |
如果你愿意,我可以:
直接告诉我你的环境即可。