1. 监控与定位资源瓶颈
首先通过工具定位资源占用高的根源,避免盲目调整。常用工具包括:
top/htop查看CPU使用率,free -m检查内存剩余,iostat/iotop监控磁盘I/O(重点关注await、%util指标),iftop/nethogs查看网络带宽占用;kafka-topics.sh --describe查看主题分区分布及ISR状态,kafka-consumer-groups.sh监控消费延迟(LAG),kafka-run-class.sh kafka.tools.JmxTool获取JMX指标(如kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec吞吐量、kafka.network:type=RequestChannel,name=RequestQueueSize请求队列积压);/var/log/kafka/server.log)中的错误或警告(如ReplicaFetchThread延迟、SocketServer连接堆积),结合jstack(jstack <pid> > kafka_stack.log)分析线程状态(如NetworkClient线程高占用可能为网络问题,LogFlusher线程高占用可能为磁盘I/O瓶颈)。2. 优化Kafka配置参数
根据监控结果调整配置,减少资源浪费:
KAFKA_HEAP_OPTS="-Xms4G -Xmx4G",建议不超过物理内存的70%,避免Swap);优化Kafka内存参数(buffer.memory=67108864(生产者缓冲区,避免过大堆积)、batch.size=1048576(消息批次大小,1MB为宜,平衡延迟与吞吐)、log.retention.hours=168(日志保留时间,根据业务需求缩短,减少磁盘占用));num.network.threads=3(网络请求处理线程,建议为CPU核心数的1-2倍)、num.io.threads=8(磁盘I/O线程,建议为CPU核心数的2-3倍)、num.replica.fetchers=3(副本同步线程,避免过多线程竞争CPU));优化分区策略(分区数应为Broker数量的整数倍,如3个Broker设置num.partitions=6,避免分区集中在少数节点导致CPU不均衡);compression.type=lz4,减少磁盘存储占用,但会增加少量CPU开销);调整日志段大小(log.segment.bytes=1073741824(1GB),避免频繁切换日志段导致I/O压力)。3. 调整操作系统参数
优化系统配置以提升Kafka性能:
noatime(mount -o noatime /dev/sdb1 /data),减少文件系统写操作;vm.swappiness设置为1-10(sysctl -w vm.swappiness=5),避免内存不足时频繁使用Swap,导致性能骤降;ulimit -n 65535),避免Kafka因句柄泄漏导致进程崩溃。4. 升级Kafka版本
新版本通常修复了旧版本的性能bug(如Kafka 3.x优化了磁盘I/O调度、Kafka 4.0引入的KRaft模式减少了ZooKeeper依赖),建议升级到最新的稳定版本(如Kafka 3.6+或4.0+),提升资源利用率。
5. 扩容集群
若单节点资源无法满足需求,可通过扩容集群分散负载:
server.properties中的broker.id、listeners,启动broker),Kafka会自动将分区副本分配到新节点,减轻现有节点的压力;kafka-topics.sh --alter --topic high_traffic_topic --partitions 12 --bootstrap-server localhost:9092),提高并行处理能力(注意:分区数过多会增加ZooKeeper负担,需权衡)。6. 排查应用层问题
linger.ms(如100ms)和batch.size(如1MB),减少网络请求次数;num.consumer.fetchers=4),使用共享组(Share Group)机制提高消费效率;