如何配置非持久ignite以防止交换?

ycl3bljg  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(229)

我的jboss 7.1.6 eap部署 -Xmx8g 虚拟机上的物理ram设置为12 gb。在初始化apache ignite缓存时,会出现一条日志消息:
stdout:71 - [08:54:52]在本地计算机上启动的节点需要80%以上的物理ram,这可能会由于交换而导致显著减速(请减小jvm堆大小、数据区域大小或检查点缓冲区大小)[必需=10662mb,可用=11834mb]
我完全以编程方式使用ignite,而不是使用持久性。这是我的密码:

System.setProperty("IGNITE_UPDATE_NOTIFIER", "false");

igniteConfiguration = new IgniteConfiguration();

int failureDetectionTimeout = Integer.parseInt(getProperty("IGNITE_TCP_DISCOVERY_FAILURE_DETECTION_TIMEOUT", "60000"));

igniteConfiguration.setFailureDetectionTimeout(failureDetectionTimeout);

String igniteVmIps = getProperty("IGNITE_VM_IPS");
List<String> addresses = Arrays.asList("127.0.0.1:47500");
if (StringUtils.isNotBlank(igniteVmIps)) {
    addresses = Arrays.asList(igniteVmIps.split(","));
}

int networkTimeout = Integer.parseInt(getProperty("IGNITE_TCP_DISCOVERY_NETWORK_TIMEOUT", "60000"));
boolean failureDetectionTimeoutEnabled = Boolean.parseBoolean(getProperty("IGNITE_TCP_DISCOVERY_FAILURE_DETECTION_TIMEOUT_ENABLED", "true"));

int tcpDiscoveryLocalPort = Integer.parseInt(getProperty("IGNITE_TCP_DISCOVERY_LOCAL_PORT", "47500"));
int tcpDiscoveryLocalPortRange = Integer.parseInt(getProperty("IGNITE_TCP_DISCOVERY_LOCAL_PORT_RANGE", "0"));

TcpDiscoverySpi tcpDiscoverySpi = new TcpDiscoverySpi();
tcpDiscoverySpi.setLocalPort(tcpDiscoveryLocalPort);
tcpDiscoverySpi.setLocalPortRange(tcpDiscoveryLocalPortRange);
tcpDiscoverySpi.setNetworkTimeout(networkTimeout);
tcpDiscoverySpi.failureDetectionTimeoutEnabled(failureDetectionTimeoutEnabled);
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
ipFinder.setAddresses(addresses);
tcpDiscoverySpi.setIpFinder(ipFinder);

igniteConfiguration.setDiscoverySpi(tcpDiscoverySpi);

Ignite ignite = Ignition.start(igniteConfiguration);

ignite.cluster().active(true);

// later, initialize my caches
String cacheName = cacheEnum.name();
CacheConfiguration<String, byte[]> cacheCfg = new CacheConfiguration<>(cacheName);
int maxSize = Integer.parseInt(StringUtils.defaultIfBlank(
        PropertyHelper.lookupProperty(String.format(CACHE_SETTING_FORMAT, cacheName, ObjectCacheConstants.SETTING_MAX_SIZE)),
        String.valueOf(ObjectCacheConstants.SETTING_MAX_SIZE_DEFAULT)));
long expiresAfterMs = Long.parseLong(StringUtils.defaultIfBlank(
        PropertyHelper.lookupProperty(String.format(CACHE_SETTING_FORMAT, cacheName, ObjectCacheConstants.SETTING_EXPIRES_MS)),
        String.valueOf(ObjectCacheConstants.SETTING_EXPIRES_MS_DEFAULT)));

cacheCfg.setCacheMode(CacheMode.REPLICATED);
cacheCfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
cacheCfg.setBackups(1);

cacheCfg.setOnheapCacheEnabled(true);
cacheCfg.setEvictionPolicyFactory(new LruEvictionPolicyFactory<String, byte[]>(maxSize));

Optional<CreatedExpiryPolicy> expiryPolicy = Optional.empty();
if (expiresAfterMs > 0) {
    expiryPolicy = Optional.of(new CreatedExpiryPolicy(new Duration(TimeUnit.MILLISECONDS, expiresAfterMs)));
}

我在google上搜索过这个警告,但是我找到的所有解决方案都涉及到更新持久性设置,但是我没有使用持久性。
在我的例子中,没有缓存,我们可以在2gb堆上运行没有问题。所以我留下6gb用于缓存,这应该足够了。我想设置它,使我的jvm使用最多6g的ram,而不是更多。
为了使我的程序获得适当的ram利用率,我应该改变哪些字段?

x7rlezfr

x7rlezfr1#

ignite中有一个启发式方法,即4gb或20%的可用内存不应被节点占用,以防止操作系统开始交换ignite节点操作的内存。当然,这完全取决于你的操作系统设置。节点所需的全部内存量计算为堆内存和堆外内存的总和。堆内存基本上就是您的jvm Xmx 设置减去一些gc开销。堆外是所有数据区域大小及其检查点缓冲区大小的总和(如果为区域启用了持久性)。我想在您的例子中,它只是一个没有持久性的默认区域,所以检查点缓冲区是0。默认情况下,它是可用内存的20%,或者至少是默认区域本身的256mb。您可以在这里选择:
如果你完全确定你的操作系统交换设置,并且没有任何消费软件在同一台机器上运行,那么就忽略它吧。
增加操作系统内存。
Xmx 变小。
减少默认区域(事实上不建议这样做,但仍然是一个选项),而不打开该区域的持久性。
结合上面的一些。

相关问题