在 Debian 上部署和调优 Kafka,通常可以从 操作系统、JVM、Kafka 自身参数、磁盘与网络 四个层面来做。下面按实战经验给你一个比较系统的调优清单(适用于生产环境,也适合压测/高吞吐场景)。
Kafka 是大量使用文件和网络连接的。
# 查看当前限制
ulimit -n
# 永久修改(推荐)
sudo vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
root soft nofile 1000000
root hard nofile 1000000
并确认:
sudo vim /etc/pam.d/common-session
添加:
session required pam_limits.so
重启后生效。
Kafka 对延迟非常敏感,swap 会导致 GC 停顿。
sudo swapoff -a
永久禁用:
sudo vim /etc/fstab
# 注释掉 swap 行
mount -o noatime,nodiratime,data=writeback /dev/sdX /kafka-data
noatime 能明显减少磁盘写操作。
编辑 /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
生效:
sudo sysctl -p
编辑 kafka-server-start.sh 或 KAFKA_HEAP_OPTS:
export KAFKA_HEAP_OPTS="-Xms8G -Xmx8G"
原则:
推荐 G1GC(默认)
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC \
-XX:MaxGCPauseMillis=20 \
-XX:InitiatingHeapOccupancyPercent=35"
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
说明:
num.io.threads:磁盘 IO,建议 ≥ 磁盘数 × 2num.network.threads:网络线程,建议 8~16log.dirs=/kafka-data/logs
num.partitions=3
default.replication.factor=3
log.retention.hours=168
log.segment.bytes=1073741824
log.cleanup.policy=delete
num.replica.fetchers=4
replica.lag.time.max.ms=30000
log.flush.interval.messages=10000
log.flush.interval.ms=1000
⚠️ Kafka 不建议频繁 flush,依赖 OS Page Cache 性能更好
batch.size=32768
linger.ms=5
compression.type=lz4
acks=1
高吞吐场景推荐:
acks=1compression.type=lz4 或 zstdfetch.min.bytes=1
fetch.max.bytes=52428800
max.poll.records=500
log.dirslog.dirs=/data1/kafka,/data2/kafka,/data3/kafka
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
工具:
# 生产
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
| 问题 | 原因 | 解决 |
|---|---|---|
| 吞吐上不去 | partition 太少 | 增加 partition |
| 延迟高 | GC 停顿 | 检查 JVM |
| 磁盘 IO 高 | flush 太频繁 | 减少 flush |
| consumer lag | 消费慢 | 增加 consumer |
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
log.dirs=/data1/kafka,/data2/kafka
num.partitions=3
default.replication.factor=3
JVM:
-Xms8G -Xmx8G -XX:+UseG1GC
如果你愿意,可以告诉我:
我可以给你一份 完全针对你环境的 Kafka 调优配置。