优化 Debian 上的 Kafka,通常从 系统层、JVM 层、Kafka 本身、磁盘与网络 四个方面入手。下面给你一套按优先级排序、可落地的优化清单,适用于生产环境(也适合高并发测试环境)。
Kafka 会打开大量 socket 和文件。
# 查看当前限制
ulimit -n
# 修改(临时)
ulimit -n 1000000
永久生效:
sudo vim /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
root soft nofile 1000000
root hard nofile 1000000
Kafka 对延迟极其敏感,swap 会导致 GC 停顿。
sudo swapoff -a
永久禁用:
sudo vim /etc/fstab
# 注释掉 swap 行
✅ 推荐:XFS 或 ext4(XFS 更优)
挂载参数(示例):
mount -o noatime,nodiratime,data=writeback /dev/sdX /data/kafka
sudo 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
生效:
sudo sysctl -p
Kafka 是 堆外内存 + 堆内存 混合使用,不要给太大堆。
编辑:
vim /opt/kafka/bin/kafka-server-start.sh
或(推荐方式):
export KAFKA_HEAP_OPTS="-Xms4G -Xmx4G"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=20"
经验值:
| 内存 | 堆大小 |
|---|---|
| 16G | 4–6G |
| 32G | 6–8G |
| 64G | 8–12G |
⚠️ 不要超过 32G(压缩指针失效)
配置文件:
vim /opt/kafka/config/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.dirs=/data1/kafka-logs,/data2/kafka-logs
Kafka 依赖 OS Page Cache,不要频繁 flush
log.flush.interval.messages=10000
log.flush.interval.ms=1000
⚠️ 生产环境通常 不手动 flush
log.segment.bytes=1073741824
log.retention.hours=168
log.cleanup.policy=delete
replica.lag.time.max.ms=30000
num.replica.fetchers=4
✅ 顺序写磁盘
tickTime=2000
initLimit=10
syncLimit=5
Zookeeper 单独部署,不要和 Kafka 混部
kafka-run-class kafka.tools.JmxTool
或:
| 问题 | 原因 |
|---|---|
| CPU 高 | GC / IO 线程不足 |
| 延迟高 | swap / 磁盘慢 |
| 丢消息 | acks / replica 配置错误 |
| OOM | 堆太大 |
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=3
default.replication.factor=2
log.retention.hours=168
JVM:
-Xms4G -Xmx4G -XX:+UseG1GC
如果你愿意,可以告诉我:
我可以给你一份 完全贴合你环境的 Kafka 优化方案。