You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ignite缓存EvictionPolicy触发时机、原理及内存控制咨询

问题分析与解决方案

一、EvictionPolicy的工作原理与触发时机

你配置的LruEvictionPolicyFactory属于缓存条目级驱逐策略,核心逻辑和触发规则如下:

  • 作用范围:仅控制缓存的堆内(On-Heap)条目数量,你设置的200000是堆内允许的最大键值对数目。
  • 触发时机:当堆内缓存条目数达到设定的maxSize(20万)时,新条目插入操作会同步触发驱逐逻辑,移除最近最少被访问的条目,确保堆内条目数不超过阈值。
  • 局限性:如果缓存使用了堆外内存(由DataRegion配置控制),堆外的条目不受这个策略的数量限制。

而你同时配置的DataRegion的RANDOM_LRU属于页级内存驱逐策略,它的逻辑是:

  • 作用范围:针对堆外内存(Off-Heap)的使用量,当堆外内存占用达到evictionThreshold(你设的0.9,即90%)时,后台线程会异步驱逐最近最少使用的内存页(按内存大小而非条目数计算)。

二、为什么记录数远超20万

你的配置同时启用了两套独立的驱逐机制,导致条目数不受缓存级策略限制:

  1. 堆外内存无条目数限制:DataRegion开启了RANDOM_LRU页驱逐,意味着缓存数据可以溢出到堆外内存,而堆外的条目数量不受LruEvictionPolicy的20万限制,总条目数(堆内+堆外)自然会远超设定值。
  2. 页驱逐按内存大小触发:DataRegion的maxSize是3GB,只有当堆外内存占用达到2.7GB(3GB*0.9)时才会触发驱逐,此时堆外可能已经存储了大量条目(取决于单条数据大小),所以总记录数会达到80万甚至更多。

三、如何控制缓存数据大小

根据你的需求,分两种场景给出解决方案:

场景1:严格控制缓存条目数量

如果需要确保缓存总条目数不超过20万,需禁用堆外内存的页驱逐,让所有数据都受缓存级LRU策略控制:

  1. 修改DataRegion配置,关闭页驱逐:
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
    <property name="name" value="ds_name"/>      
    <property name="initialSize" value="#{512L * 1024 * 1024}"/>
    <property name="maxSize" value="#{3 * 1024L * 1024 * 1024}"/>
    <property name="pageEvictionMode" value="DISABLED"/> <!-- 关闭页驱逐 -->
    <property name="evictionThreshold" value="0.9"/>
    <property name="metricsEnabled" value="true"/>
    <property name="persistenceEnabled" value="false"/>
</bean>
  1. 确保CacheConfiguration的evictionPolicyFactory配置不变,此时所有数据都存储在堆内,条目数会严格控制在20万以内。

注意:这种方式下需确保DataRegion的maxSize足够容纳20万条数据,避免OOM。

场景2:控制缓存占用的内存大小(更推荐)

如果更关注内存占用而非条目数,建议依赖DataRegion的页驱逐机制,同时可保留缓存级策略作为堆内优化:

  1. 移除或调整Cache层面的条目级驱逐策略(可选,若需限制堆内条目数可保留):
// 若不需要堆内条目数限制,可注释此行
// cacheCfg.setEvictionPolicyFactory(new LruEvictionPolicyFactory<>(200000));
  1. 优化DataRegion的页驱逐配置:
    • 调整evictionThreshold:建议设为0.8~0.85,给内存预留缓冲空间,避免频繁驱逐
    • 若需要更精准的内存控制,可结合maxOffheapSize单独限制堆外内存大小
  2. 开启缓存统计,监控内存使用和驱逐情况:
cacheCfg.setStatisticsEnabled(true);

通过Ignite监控工具查看缓存的内存占用、驱逐次数等指标,调整配置至最优状态。

额外注意事项

  • 备份副本影响:如果缓存配置了backups(备份数),总条目数会是主副本数 × (备份数+1),需将这个因素纳入计算。
  • 驱逐异步性:DataRegion的页驱逐是后台异步执行的,可能会有短暂的内存占用超过阈值的情况,但不会持续太久。

内容的提问来源于stack exchange,提问作者段绍昌

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:15:05