在 CentOS 上运行 Kafka,调优通常分为 操作系统层、JVM 层、Kafka 配置层、磁盘与网络层。下面给你一套实战向的调优清单,适合生产环境参考。
Kafka 会大量使用文件句柄。
# 查看
ulimit -n
# 修改(永久)
vi /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
# 尽量关闭 swap
swapoff -a
# 永久关闭
vi /etc/fstab # 注释 swap 行
# 降低 swappiness
sysctl -w vm.swappiness=1
echo "vm.swappiness=1" >> /etc/sysctl.conf
vi /etc/sysctl.conf
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
sysctl -p
log.dirs=/data/kafka/logs
mount -o noatime,nodiratime /dev/sdb /data
export KAFKA_HEAP_OPTS="-Xms6g -Xmx6g"
经验值:
KAFKA_JVM_PERFORMANCE_OPTS="
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=35
"
num.network.threads=8
num.io.threads=16
CPU 核数多可适当加大
# 高性能(允许少量丢失)
log.flush.interval.messages=10000
log.flush.interval.ms=1000
default.replication.factor=3
min.insync.replicas=2
log.segment.bytes=1G
compression.type=snappy
acks=1
batch.size=16384~131072
linger.ms=5~20
compression.type=snappy
buffer.memory=33554432
高吞吐:acks=1 + batch + linger
fetch.min.bytes=1048576
fetch.max.wait.ms=500
max.poll.records=500
# 生产压测
kafka-producer-perf-test.sh
# 消费压测
kafka-consumer-perf-test.sh
| 问题 | 可能原因 |
|---|---|
| 吞吐上不去 | 磁盘 IO / 线程数不足 |
| 消费延迟 | fetch 参数 / 消费逻辑慢 |
| CPU 高 | GC / 压缩 / 网络线程 |
| 丢消息 | acks=0 / 副本不足 |
如果你愿意,可以告诉我:
我可以给你一套 针对性参数模板。