一、JVM堆内存设置(核心配置)
Kafka运行在JVM之上,堆内存是其内存管理的核心。需通过KAFKA_HEAP_OPTS环境变量设置初始堆内存(-Xms)和最大堆内存(-Xmx),建议两者设置为相同值(如-Xms8G -Xmx8G),避免堆内存动态扩展带来的性能开销。堆内存大小需结合服务器物理内存与业务需求调整:
二、JVM非堆内存配置(关键辅助)
-XX:MetaspaceSize)和最大大小(-XX:MaxMetaspaceSize),避免元空间溢出。建议设置为256MB-1GB(如-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M)。-XX:MaxDirectMemorySize设置。建议设置为堆内存的1/4-1/2(如堆内存8GB时可设置1-2GB),避免直接内存占用过多导致OOM。-XX:LogCacheSize设置。建议设置为512MB-1GB(如-XX:LogCacheSize=1024M),提升生产者写入性能。三、Kafka自身内存相关参数(间接优化)
log.segment.bytes):单个日志段的最大大小(默认1GB)。较大的日志段可减少日志段文件数量,降低文件系统元数据开销,但会增加日志清理时的扫描时间。建议根据Topic数据量设置(如1GB-10GB)。log.retention.hours/log.retention.ms):控制日志保留时间(默认168小时/7天)。较短的保留时间可减少内存中缓存的日志数据量,但会增加磁盘I/O。建议根据业务需求设置(如7天-30天)。num.partitions):每个Topic的分区数量。分区数越多,Kafka需要维护的索引(如.index、.timeindex)和内存映射文件越多,会占用更多内存。建议根据吞吐量需求设置(如10-100个分区/Topic),避免过度分区。replica.fetch.max.bytes):副本从Leader拉取数据的单次最大字节数(默认1MB)。较大的值可减少网络请求次数,但会增加内存中缓存的副本数据量。建议设置为1MB-10MB(如-Xmx100M)。fetch.message.max.bytes):消费者单次请求从Broker获取的最大消息大小(默认1MB)。较大的值可提升消费者吞吐量,但会增加内存中缓存的消费者数据量。建议设置为1MB-10MB(如-Xmx100M)。四、操作系统级别优化(保障内存效率)
.index和.timeindex文件)。建议将系统级(/etc/sysctl.conf中fs.file-max)和用户级(/etc/security/limits.conf中nofile)文件描述符限制设置为100000+(如fs.file-max=200000,nofile=100000)。vm.swappiness参数控制操作系统使用交换分区(Swap)的倾向(默认60)。建议设置为1-10(如vm.swappiness=1),避免Kafka内存被交换到磁盘,导致性能骤降。vm.max_map_count参数控制系统允许的最大内存映射区域数(默认65535)。每个分区至少需要2个内存映射区域(.index和.timeindex),因此需根据分区数量调整(如50000分区需100000个区域),避免OutOfMemoryError。五、监控与调优(持续优化)
jstat(监控JVM GC情况,如jstat -gcutil <pid> 1000)、jmap(查看JVM内存映射,如jmap -histo <pid>)、top(监控系统内存使用)、Kafka自带监控工具(如Kafka Manager、Confluent Control Center)实时监控内存使用情况。buffer.memory),定期进行压测验证配置效果。