簡體   English   中英

如何配置非持久性 Ignite 以防止交換?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM