Kafka作为高性能分布式消息系统,在Linux环境下的性能优化需要从多个层面进行配置和调整。以下是一些关键的优化策略:
noatime
选项
/dev/sdX /data ext4 defaults,noatime,nodiratime 0 2
bash
echo "* hard nofile 100000" >> /etc/security/limits.conf
echo "* soft nofile 100000" >> /etc/security/limits.conf
bash
echo 'net.core.wmem_default=16777216' >> /etc/sysctl.conf
echo 'net.core.rmem_default=16777216' >> /etc/sysctl.conf
echo 'net.core.wmem_max=16777216' >> /etc/sysctl.conf
echo 'net.core.rmem_max=16777216' >> /etc/sysctl.conf
bash
echo 'vm.nr_hugepages=1024' >> /etc/sysctl.conf
# server.properties中的关键参数
# 日志存储配置
num.partitions=8 # 根据CPU核心数调整
log.dirs=/data/kafka # 使用多块磁盘时用逗号分隔
log.segment.bytes=1073741824 # 1GB的段大小
# 网络与IO配置
num.network.threads=8 # 处理网络请求的线程数
num.io.threads=16 # 处理磁盘IO的线程数,建议为磁盘数的2-3倍
# 内存与刷盘配置
log.flush.interval.messages=10000 # 每多少条消息刷盘一次
log.flush.interval.ms=1000 # 消息刷盘间隔(毫秒)
log.flush.scheduler.interval.ms=3000 # 检查刷盘的时间间隔
# 副本与ISR配置
default.replication.factor=2 # 生产环境建议2-3
min.insync.replicas=1 # 确保至少一个副本确认
# kafka-server-start.sh中的JVM参数
export KAFKA_HEAP_OPTS="-Xms8g -Xmx8g -XX:MetaspaceSize=96m -XX:+UseG1GC"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"
batch.size=16384 # 增大批次大小(字节)
linger.ms=5 # 等待更多消息加入批次的时间
compression.type=snappy # 或lz4/zstd
buffer.memory=33554432 # 生产者缓冲区大小
fetch.min.bytes=1024 # 最小抓取字节数
fetch.max.wait.ms=500 # 等待时间
max.partition.fetch.bytes=1048576 # 每个分区返回的最大数据量
启用JMX监控:
export JMX_PORT=9999
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
定期检查日志压缩:确保log.cleaner.enable=true
时压缩工作正常
bash
echo deadline > /sys/block/sdX/queue/scheduler
通过以上优化,Kafka集群通常可以获得显著的性能提升。建议在修改配置后进行基准测试,根据实际负载情况进一步微调参数。