优化Ubuntu环境下Kafka配置的完整指南
KAFKA_HEAP_OPTS环境变量,设置初始堆(-Xms)与最大堆(-Xmx)一致(如-Xms8G -Xmx8G),避免堆大小动态调整带来的性能开销。避免堆内存过大(如超过16GB),防止Full GC停顿时间过长。-XX:+UseG1GC),并设置最大GC停顿时间(如-XX:MaxGCPauseMillis=50),平衡吞吐量与延迟。避免使用CMS(已废弃)或Parallel GC(停顿时间长)。-XX:MetaspaceSize=256M,避免元空间溢出);调整直接内存限制(-XX:MaxDirectMemorySize=8G,与堆内存大小匹配),满足Kafka Socket缓冲区的需求。num.network.threads:设置为CPU核心数的1-2倍(如8核CPU设为8-16),处理客户端网络请求。num.io.threads:设置为CPU核心数的2-4倍(如8核CPU设为16-32),处理磁盘I/O操作(如日志写入、读取)。socket.send.buffer.bytes(发送缓冲区)与socket.receive.buffer.bytes(接收缓冲区)为100KB-1MB(如102400),提升网络数据传输效率。socket.request.max.bytes(默认100MB),根据消息大小调整(如1GB),避免过大请求导致Broker崩溃。log.segment.bytes:增大日志段大小(如1GB,默认1GB),减少日志段切换频率,降低磁盘I/O开销。log.retention.hours:根据业务需求设置日志保留时间(如168小时=7天),避免磁盘空间浪费。log.flush.interval.messages与log.flush.interval.ms:适当增大(如10000条消息或1000ms),减少日志刷新频率,提升写入吞吐量(但会增加数据丢失风险,需权衡)。/etc/security/limits.conf,增加用户(如kafka)的文件描述符限制(* soft nofile 100000、* hard nofile 100000),避免Kafka因文件描述符不足无法启动。vm.swappiness=1(减少交换空间使用,避免频繁磁盘I/O)。vm.max_map_count=262144(提升内存映射文件数量,满足Kafka的索引需求)。net.core.rmem_max=16777216、net.core.wmem_max=16777216(增大读写缓冲区)、net.ipv4.tcp_fin_timeout=30(缩短TCP连接超时时间)。ext4或XFS文件系统(XFS更适合Kafka的高吞吐场景);挂载时添加noatime、nodiratime选项(减少文件访问时间更新,降低磁盘I/O)。default.replication.factor=3(生产环境推荐),确保数据冗余与高可用。避免副本因子过高(如超过3),增加写入负载。kafka-reassign-partitions.sh工具定期检查分区分布,确保数据在各Broker间均衡,避免单点瓶颈。jmxtrans导出JMX指标。server.log、controller.log),分析异常(如Broker宕机、分区Leader切换频繁);使用logrotate工具自动清理旧日志。kafka-topics.sh --delete);备份ZooKeeper数据(/var/lib/zookeeper);升级Kafka版本(修复bug、提升性能)。