【问题标题】:Hazelcast FREE_HEAP_PERCENTAGE policy not working as expectedHazelcast FREE_HEAP_PERCENTAGE 政策未按预期工作
【发布时间】:2016-02-23 15:23:23
【问题描述】:

当满足 JVM 上配置的最小可用堆百分比时,Hazelcast 的 FREE_HEAP_PERCENTAGE 最大大小策略不会驱逐映射条目。

下面是一个说明这个问题的测试用例。如果测试使用其他策略类型(包括USED_HEAP_PERCENTAGE)运行,它会按预期工作,以便在达到此最大大小时驱逐条目。但是,如果使用FREE_HEAP_PERCENTAGE 运行,则永远不会从映射中逐出条目,尽管事实上可用堆百分比超出了允许的百分比(例如,可以在运行管理中心时确认)。

public class HazelcastMaxSizeTest {

    private static final String GROUP_NAME = "TEST";
    private static final String MAP_NAME = "test";

    private static MaxSizeConfig POLICY_THAT_WORKS = new MaxSizeConfig(5, MaxSizeConfig.MaxSizePolicy.USED_HEAP_PERCENTAGE);
    private static MaxSizeConfig POLICY_THAT_DOES_NOT_WORK = new MaxSizeConfig(99, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_PERCENTAGE);

    public static void main(String[] args) throws Exception {

        HazelcastInstance instance = startHazelcast("hazelcast1", POLICY_THAT_DOES_NOT_WORK);
        System.out.println("started " + instance.getName());

        IMap<Long, byte[]> map = createMap(instance, MAP_NAME);
        System.out.println("map size: " + map.size());

        instance.shutdown();
    }

    private static HazelcastInstance startHazelcast(String instanceName, MaxSizeConfig maxSizeConfig) {

        MapConfig mapConfig = new MapConfig(MAP_NAME);
        mapConfig.setMaxSizeConfig(maxSizeConfig);
        mapConfig.setStatisticsEnabled(true);
        mapConfig.setEvictionPolicy(EvictionPolicy.LRU);
        mapConfig.setMinEvictionCheckMillis(0L);
        mapConfig.setBackupCount(1);

        Config config = new Config(instanceName);
        config.addMapConfig(mapConfig);
        config.getManagementCenterConfig().setEnabled(true);
        config.getManagementCenterConfig().setUrl("http://localhost:8080/mancenter");
        config.getGroupConfig().setName(GROUP_NAME).setPassword(GROUP_NAME);
        return Hazelcast.getOrCreateHazelcastInstance(config);
    }

    private static IMap<Long, byte[]> createMap(HazelcastInstance instance, String mapname) {

        IMap<Long, byte[]> map = instance.getMap(mapname);

        map.addEntryListener(new EntryEvictedListener<Long, byte[]>() {

            @Override
            public void entryEvicted(EntryEvent<Long, byte[]> event) {
                System.out.println("evicted " + event.getName() + ": " + event.getKey());
            }

        }, false);

        for (long i = 1; i <= 50_000; i++) {
            map.set(i, new byte[100]);
            if (i % 1000 == 0) {
                System.out.println("set " + map.getName() + ": " + i);
            }
        }

        return map;
    }

}

经过进一步调试,我想知道 Hazelcast 的 EvictionChecker 是否可能错误地计算了空闲堆百分比。调试的时候发现计算出来的空闲堆百分比大于100。它的计算使用available / total,但是正如here所描述的,这应该是available / max吧?

FREE_HEAP_PERCENTAGE 策略的配置或预期使用是否有问题?或者这是一个 Hazelcast 错误?

规格:Hazelcast 3.6,-Xmx256m

【问题讨论】:

  • 你的堆大小是多少?我使用了你的测试,设置 -Xmx256m,它对我有用(可以看到被驱逐的消息)。顺便说一句,出于测试目的,将 minEvictionCheckMillis 设置为零很有意义,通过将其设置为零,检查是否在每个 map#set 上都可以执行驱逐。
  • 谢谢。我已经编辑了我的问题,将0 用于minEvictionCheckMillis,并指定-Xmx256m,这对我不起作用。然而,在显着增加地图大小后,我终于能够获得FREE_HEAP_PERCENTAGE 政策来驱逐一些条目。不过,我不明白的是(1)如果USED_HEAP_PERCENTAGE 始终达到 2%(并且至少达到 5% 或更多),为什么FREE_HEAP_PERCENTAGE 没有达到 99%(或甚至 100%)? (2) 管理中心显示约 30% 的堆使用百分比,那么为什么不满足要求 99% 空闲堆的策略?
  • 经过进一步调试,我怀疑 Hazelcast 可能无法正确计算空闲堆。我已经相应地更新了我的问题。
  • 当我查看图片here时,我可以看到计算出的空闲堆数量可以用max - (total - free)找到,它相当于max - total + free,所以EvictionChecker似乎是正确的关于这个。
  • 您能否详细说明一下,为什么它们不等效?

标签: java hazelcast hazelcast-imap


【解决方案1】:

经过进一步调试,我发现FREE_HEAP_PERCENTAGE 策略的意外行为是由于 Hazelcast 计算可用内存中的错误造成的。该问题已在 Hazelcast 的问题跟踪器中报告为 Issue 7599

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 2018-07-05
    • 2019-07-30
    • 2021-07-09
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多