优化 Debian 上的 Kafka 性能需要从操作系统、JVM、磁盘、网络、Kafka 配置等多个层面综合考虑。下面按层次给你一套实用且可落地的优化建议,适用于生产环境。
编辑 /etc/sysctl.conf 或新增 /etc/sysctl.d/kafka.conf:
# 增加文件描述符
fs.file-max = 1000000
# 网络优化
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 8192
# TCP 发送/接收缓冲区
net.core.rmem_default = 33554432
net.core.rmem_max = 33554432
net.core.wmem_default = 33554432
net.core.wmem_max = 33554432
# 禁用 swap(非常重要)
vm.swappiness = 1
应用:
sysctl -p
编辑 /etc/security/limits.conf:
* soft nofile 1000000
* hard nofile 1000000
确认:
ulimit -n
Kafka 对磁盘 I/O 非常敏感。
mount -o noatime,nodiratime,data=writeback /dev/sdX /kafka
fstab 示例:
/dev/sdX /kafka ext4 noatime,nodiratime,data=writeback 0 0
swapoff -a
✅ 推荐 JDK 17 / JDK 11(LTS)
避免 JDK 8(GC 性能差)
示例:
java -version
编辑 kafka/bin/kafka-server-start.sh 或 KAFKA_HEAP_OPTS:
export KAFKA_HEAP_OPTS="-Xms8G -Xmx8G"
export KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:ParallelGCThreads=8
-XX:ConcGCThreads=4
"
⚠️ 不要超过物理内存 50%
配置文件:config/server.properties
# broker
num.network.threads=8
num.io.threads=16
# 日志
num.replica.fetchers=4
replica.fetch.max.bytes=1048576
# socket
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/kafka/logs
# 段大小
log.segment.bytes=1073741824
# 刷盘策略(不要频繁 flush)
log.flush.interval.messages=10000
log.flush.interval.ms=1000
# 保留策略
log.retention.hours=72
log.retention.bytes=-1
✅ 不要开启 log.flush.scheduler.interval.ms
acks=1 # 性能优先
compression.type=lz4 # 或 snappy
batch.size=16384
linger.ms=5
buffer.memory=67108864
fetch.min.bytes=1024
fetch.max.bytes=52428800
max.poll.records=500
✅ 分区数 ≈ 吞吐量 × 2~3
# 查看分区
kafka-topics.sh --describe
⚠️ 分区过多会导致:
default.replication.factor=2
min.insync.replicas=1
kafka-run-class.sh kafka.tools.JmxTool
或:
[Service]
LimitNOFILE=1000000
避免 btrfs / zfs(I/O 抖动)
| 优先级 | 项目 |
|---|---|
| ⭐⭐⭐ | 磁盘(SSD + 挂载参数) |
| ⭐⭐⭐ | JVM(G1 + 合理 heap) |
| ⭐⭐ | 分区 & 副本设计 |
| ⭐⭐ | 生产 / 消费参数 |
| ⭐ | OS / 网络参数 |
你可以直接贴出: