[英]How to configure non-persistent Ignite to prevent swapping?
我的 JBoss 7.1.6 EAP 部署带有-Xmx8g
,VM 上的物理 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)));
}
我已经搜索了这个警告,但我找到的所有解决方案都涉及更新持久性设置,但我没有使用持久性。
在我的情况下,没有缓存我们可以在 2GB 堆上运行没问题。 所以我留下 6GB 用于缓存,这应该绰绰有余。 我想对其进行设置,以便我的 JVM 使用最多 6G 的内存,而不再使用。
我应该考虑更改哪些字段以便为我的程序获得适当的 ram 利用率?
Ignite 中有一个启发式方法,即 4GB 或 20% 的可用内存不应被节点占用,以防止操作系统开始交换由 Ignite 节点操作的内存。 当然,这完全取决于您的操作系统设置。 节点所需的全部数量计算为堆和堆外内存的总和。 堆内存基本上是您的 JVM Xmx
设置减去一些 GC 开销。 堆外是所有数据区域大小及其检查点缓冲区大小的总和(如果为某个区域启用了持久性)。 我想在您的情况下,它只是一个没有持久性的默认区域,因此检查点缓冲区为 0。 默认情况下,它是可用内存的 20% 或默认区域本身至少为 256Mb。 您在这里有一些选择:
Xmx
使其变小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.