为什么Kafka老年代堆中存在大量Sensor对象,如何降低内存占用?
Sensor对象大量留存的核心原因
- Kafka的Sensor是内置指标体系的基础统计单元,默认会为每一个连接、主题分区、客户端ID、配额维度单独创建实例,且默认永久留存,不会自动回收
- 2.7.1版本存在已知的Sensor内存泄露问题:当集群存在大量短连接、频繁的主题分区创建/删除操作、或者客户端侧每次连接生成随机的不重复客户端ID时,新生成的Sensor会持续堆积在Metrics的全局ConcurrentHashMap中,不会被清理,最终占用大量堆内存
- 你日志中看到的ConnectionAcceptRate系列Sensor只是配额维度的全局Sensor,占比极低,大部分堆积的Sensor是未打印日志的、对应单个连接/分区/客户端的实例
可调整的降内存配置项
以下配置均为broker端配置,修改后重启生效:
metrics.recency.expiry.seconds
2.2及以上版本支持的核心优化配置,用于设置未被访问的Sensor的自动过期时间,官方推荐默认值为86400(1天),如果集群动态场景较多可调整为3600(1小时),过期后的Sensor会被自动从缓存Map中移除,直接释放对应内存num.samples
单个Sensor保留的统计样本数,默认值为2,可调整为1,减少每个Sensor的内存占用metrics.sample.window.ms
指标统计的窗口时间,默认值为30000(30秒),可根据业务需求调整为15000,降低每个Sensor缓存的样本数据量metric.reporters
指标上报器配置,如无外部指标采集需求,仅保留默认的org.apache.kafka.common.metrics.JmxReporter即可,多余的上报器会强制Sensor保留更多统计数据connections.max.idle.ms
空闲连接回收超时时间,默认值为600000(10分钟),可调整为300000,配合Sensor过期配置更快清理连接对应的Sensor实例
额外优化建议
- 如果升级条件允许,建议将Kafka版本升级至2.8.2或3.0及以上版本,该系列版本已经合入了多个Sensor内存泄露的修复补丁,从底层解决堆积问题
- 排查客户端侧逻辑,避免每次连接生成随机的客户端ID,固定的客户端ID可以大幅减少Sensor的创建数量
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

