在 Debian 上优化 Kafka 性能,需要从 操作系统、JVM、磁盘、网络、Kafka 配置、应用使用方式 多个层面一起做。下面按层次给你一套比较实用的优化清单(偏生产环境)。
Kafka 对磁盘顺序写非常依赖。
推荐做法:
mount -o noatime,nodiratime /dev/sdX /data/kafka
示例 fstab:
/dev/sdb /data/kafka xfs noatime,nodiratime 0 0
Kafka 会打开大量文件。
ulimit -n
建议至少:
655350
永久生效:
# /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350
编辑 /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
示例(16G 内存机器):
export KAFKA_HEAP_OPTS="-Xms8G -Xmx8G"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=20"
建议:
编辑 server.properties
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=/data/kafka-logs
num.partitions=3
default.replication.factor=2
log.segment.bytes=1073741824
log.retention.hours=168
log.cleanup.policy=delete
如果是日志压缩场景,换成
compact
Kafka 不依赖应用层 fsync,而是依赖 OS page cache。
log.flush.interval.messages=10000
log.flush.interval.ms=1000
✅ 生产环境不建议频繁 flush,否则性能严重下降
replica.lag.time.max.ms=30000
确保:
linger.ms=5
batch.size=32768
compression.type=lz4
acks=1
说明:
acks=1:吞吐最高(可接受少量丢数据)acks=all:强一致,但性能下降fetch.min.bytes=1048576
fetch.max.wait.ms=500
max.poll.records=500
避免:
但注意:
kafka-run-class kafka.tools.JmxTool
或使用:
| 问题 | 原因 |
|---|---|
| 吞吐上不去 | 分区太少 |
| 延迟高 | GC 频繁 |
| broker CPU 高 | IO 线程不够 |
| 磁盘 IO 高 | flush 太频繁 |
| 消息堆积 | 消费慢 |
num.network.threads=8
num.io.threads=16
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
log.dirs=/data/kafka-logs
num.partitions=6
default.replication.factor=2
log.segment.bytes=1G
log.retention.hours=168
JVM:
-Xms16G -Xmx16G -XX:+UseG1GC
如果你愿意,可以告诉我:
我可以给你一套 针对你场景的精确参数。