You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by yz...@apache.org on 2017/02/16 17:36:19 UTC

[18/50] [abbrv] ignite git commit: Reviewed and merged IGNITE-4374 contributed by daradurvs daradurvs at gmail.com

Reviewed and merged IGNITE-4374 contributed by daradurvs daradurvs at gmail.com


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3459bdd3
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3459bdd3
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3459bdd3

Branch: refs/heads/ignite-comm-balance-master
Commit: 3459bdd3a35869df13c9b35f616325c0c3e3481e
Parents: e7a5307
Author: daradurvs <da...@gmail.com>
Authored: Thu Feb 9 20:29:02 2017 +0700
Committer: Yakov Zhdanov <yz...@gridgain.com>
Committed: Thu Feb 9 20:29:02 2017 +0700

----------------------------------------------------------------------
 .../ignite/internal/GridKernalContext.java      |   1 +
 .../ignite/internal/GridKernalContextImpl.java  |   1 +
 .../internal/GridPerformanceSuggestions.java    |  92 --------------
 .../apache/ignite/internal/IgniteKernal.java    |   9 ++
 .../processors/cache/GridCacheProcessor.java    |   2 +-
 .../suggestions/GridPerformanceSuggestions.java | 104 +++++++++++++++
 .../JvmConfigurationSuggestions.java            | 104 +++++++++++++++
 .../suggestions/OsConfigurationSuggestions.java | 127 +++++++++++++++++++
 .../internal/suggestions/package-info.java      |  21 +++
 .../ignite/internal/util/IgniteUtils.java       |  14 ++
 10 files changed, 382 insertions(+), 93 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
index 927944f..00696c7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
@@ -65,6 +65,7 @@ import org.apache.ignite.internal.processors.service.GridServiceProcessor;
 import org.apache.ignite.internal.processors.session.GridTaskSessionProcessor;
 import org.apache.ignite.internal.processors.task.GridTaskProcessor;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
+import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions;
 import org.apache.ignite.internal.util.IgniteExceptionRegistry;
 import org.apache.ignite.internal.util.StripedExecutor;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
index a2ad1b2..e80ec6b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
@@ -82,6 +82,7 @@ import org.apache.ignite.internal.processors.service.GridServiceProcessor;
 import org.apache.ignite.internal.processors.session.GridTaskSessionProcessor;
 import org.apache.ignite.internal.processors.task.GridTaskProcessor;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
+import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions;
 import org.apache.ignite.internal.util.IgniteExceptionRegistry;
 import org.apache.ignite.internal.util.StripedExecutor;
 import org.apache.ignite.internal.util.spring.IgniteSpringHelper;

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/GridPerformanceSuggestions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridPerformanceSuggestions.java b/modules/core/src/main/java/org/apache/ignite/internal/GridPerformanceSuggestions.java
deleted file mode 100644
index 5e8e520..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridPerformanceSuggestions.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ignite.internal;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.internal.util.typedef.F;
-import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.jetbrains.annotations.Nullable;
-
-import static org.apache.ignite.IgniteSystemProperties.IGNITE_PERFORMANCE_SUGGESTIONS_DISABLED;
-
-/**
- * Grid performance suggestions.
- */
-public class GridPerformanceSuggestions {
-    /** */
-    private static final boolean disabled = Boolean.getBoolean(IGNITE_PERFORMANCE_SUGGESTIONS_DISABLED);
-
-    /** */
-    private final Collection<String> perfs = !disabled ? new LinkedHashSet<String>() : null;
-
-    /** */
-    private final Collection<String> suppressed = !disabled ? new HashSet<String>() : null;
-
-    /**
-     * @param sug Suggestion to add.
-     */
-    public synchronized void add(String sug) {
-        add(sug, false);
-    }
-
-    /**
-     * @param sug Suggestion to add.
-     * @param suppress {@code True} to suppress this suggestion.
-     */
-    public synchronized void add(String sug, boolean suppress) {
-        if (disabled)
-            return;
-
-        if (!suppress)
-            perfs.add(sug);
-        else
-            suppressed.add(sug);
-    }
-
-    /**
-     * @param log Log.
-     * @param gridName Grid name.
-     */
-    public synchronized void logSuggestions(IgniteLogger log, @Nullable String gridName) {
-        if (disabled)
-            return;
-
-        if (!F.isEmpty(perfs) && !suppressed.containsAll(perfs)) {
-            U.quietAndInfo(log, "Performance suggestions for grid " +
-                (gridName == null ? "" : '\'' + gridName + '\'') + " (fix if possible)");
-            U.quietAndInfo(log, "To disable, set -D" + IGNITE_PERFORMANCE_SUGGESTIONS_DISABLED + "=true");
-
-            for (String s : perfs)
-                if (!suppressed.contains(s))
-                    U.quietAndInfo(log, "  ^-- " + s);
-
-            U.quietAndInfo(log, "");
-
-            perfs.clear();
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override public String toString() {
-        return S.toString(GridPerformanceSuggestions.class, this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 9f1c746..a3d8c7b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -138,6 +138,9 @@ import org.apache.ignite.internal.processors.service.GridServiceProcessor;
 import org.apache.ignite.internal.processors.session.GridTaskSessionProcessor;
 import org.apache.ignite.internal.processors.task.GridTaskProcessor;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
+import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions;
+import org.apache.ignite.internal.suggestions.JvmConfigurationSuggestions;
+import org.apache.ignite.internal.suggestions.OsConfigurationSuggestions;
 import org.apache.ignite.internal.util.StripedExecutor;
 import org.apache.ignite.internal.util.future.GridCompoundFuture;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
@@ -930,6 +933,12 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
             // Suggest configuration optimizations.
             suggestOptimizations(cfg);
 
+            // Suggest JVM optimizations.
+            ctx.performance().addAll(JvmConfigurationSuggestions.getSuggestions());
+
+            // Suggest Operation System optimizations.
+            ctx.performance().addAll(OsConfigurationSuggestions.getSuggestions());
+
             // Notify discovery manager the first to make sure that topology is discovered.
             ctx.discovery().onKernalStart();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index 87f5236..b0a78f4 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -63,7 +63,7 @@ import org.apache.ignite.configuration.NearCacheConfiguration;
 import org.apache.ignite.configuration.TransactionConfiguration;
 import org.apache.ignite.events.EventType;
 import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.GridPerformanceSuggestions;
+import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions;
 import org.apache.ignite.internal.IgniteClientDisconnectedCheckedException;
 import org.apache.ignite.internal.IgniteComponentType;
 import org.apache.ignite.internal.IgniteInternalFuture;

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/suggestions/GridPerformanceSuggestions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/suggestions/GridPerformanceSuggestions.java b/modules/core/src/main/java/org/apache/ignite/internal/suggestions/GridPerformanceSuggestions.java
new file mode 100644
index 0000000..c51a136
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/suggestions/GridPerformanceSuggestions.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.suggestions;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.jetbrains.annotations.Nullable;
+
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_PERFORMANCE_SUGGESTIONS_DISABLED;
+
+/**
+ * Grid performance suggestions.
+ */
+public class GridPerformanceSuggestions {
+    /** Link to article about Ignite performance tuning */
+    private static final String SUGGESTIONS_LINK = "https://apacheignite.readme.io/docs/jvm-and-system-tuning";
+
+    /** */
+    private static final boolean disabled = Boolean.getBoolean(IGNITE_PERFORMANCE_SUGGESTIONS_DISABLED);
+
+    /** */
+    private final Collection<String> perfs = !disabled ? new LinkedHashSet<String>() : null;
+
+    /** */
+    private final Collection<String> suppressed = !disabled ? new HashSet<String>() : null;
+
+    /**
+     * @param suggestions Suggestions to add.
+     */
+    public synchronized void addAll(List<String> suggestions) {
+        for (String suggestion : suggestions)
+            add(suggestion);
+    }
+
+    /**
+     * @param sug Suggestion to add.
+     */
+    public synchronized void add(String sug) {
+        add(sug, false);
+    }
+
+    /**
+     * @param sug Suggestion to add.
+     * @param suppress {@code True} to suppress this suggestion.
+     */
+    public synchronized void add(String sug, boolean suppress) {
+        if (disabled)
+            return;
+
+        if (!suppress)
+            perfs.add(sug);
+        else
+            suppressed.add(sug);
+    }
+
+    /**
+     * @param log Log.
+     * @param gridName Grid name.
+     */
+    public synchronized void logSuggestions(IgniteLogger log, @Nullable String gridName) {
+        if (disabled)
+            return;
+
+        if (!F.isEmpty(perfs) && !suppressed.containsAll(perfs)) {
+            U.quietAndInfo(log, "Performance suggestions for grid " +
+                (gridName == null ? "" : '\'' + gridName + '\'') + " (fix if possible)");
+            U.quietAndInfo(log, "To disable, set -D" + IGNITE_PERFORMANCE_SUGGESTIONS_DISABLED + "=true");
+
+            for (String s : perfs)
+                if (!suppressed.contains(s))
+                    U.quietAndInfo(log, "  ^-- " + s);
+
+            perfs.clear();
+        }
+        U.quietAndInfo(log, "Refer to this page for more performance suggestions: " + SUGGESTIONS_LINK);
+        U.quietAndInfo(log, "");
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(GridPerformanceSuggestions.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/suggestions/JvmConfigurationSuggestions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/suggestions/JvmConfigurationSuggestions.java b/modules/core/src/main/java/org/apache/ignite/internal/suggestions/JvmConfigurationSuggestions.java
new file mode 100644
index 0000000..4319229
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/suggestions/JvmConfigurationSuggestions.java
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.suggestions;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Java Virtual Machine configuration suggestions.
+ */
+public class JvmConfigurationSuggestions {
+    /** */
+    private static final String XMX = "-Xmx";
+
+    /** */
+    private static final String MX = "-mx";
+
+    /** */
+    private static final String MAX_DIRECT_MEMORY_SIZE = "-XX:MaxDirectMemorySize";
+
+    /** */
+    private static final String DISABLE_EXPLICIT_GC = "-XX:+DisableExplicitGC";
+
+    /** */
+    private static final String NOT_USE_TLAB = "-XX:-UseTLAB";
+
+    /** */
+    private static final String SERVER = "-server";
+
+    /** */
+    private static final String USE_G1_GC = "-XX:+UseG1GC";
+
+    /**
+     * Checks JVM configurations and produces tuning suggestions.
+     *
+     * @return List of suggestions of Java Virtual Machine configuration tuning to increase Ignite performance.
+     */
+    public static synchronized List<String> getSuggestions() {
+        List<String> suggestions = new ArrayList<>();
+
+        List<String> args = U.jvmArgs();
+
+        if (!U.jvmName().toLowerCase().contains("server"))
+            suggestions.add("Enable server mode for JVM (add '" + SERVER + "' to JVM options)");
+
+        if (!U.jdkVersion().equals("1.8"))
+            suggestions.add("Switch to the most recent 1.8 JVM version");
+
+        if (U.jdkVersion().equals("1.8") && !args.contains(USE_G1_GC))
+            suggestions.add("Enable G1 Garbage Collector (add '" + USE_G1_GC + "' to JVM options)");
+
+        if (!anyStartWith(args, XMX) && !anyStartWith(args, MX))
+            suggestions.add("Specify JVM heap max size (add '" + XMX + "<size>[g|G|m|M|k|K]' to JVM options)");
+
+        if (!anyStartWith(args, MAX_DIRECT_MEMORY_SIZE))
+            suggestions.add("Set max direct memory size if getting 'OOME: Direct buffer memory' " +
+                "(add '" + MAX_DIRECT_MEMORY_SIZE + "=<size>[g|G|m|M|k|K]' to JVM options)");
+
+        if (args.contains(NOT_USE_TLAB))
+            suggestions.add("Enable thread-local allocation buffer (add '-XX:+UseTLAB' to JVM options)");
+
+        if (!args.contains(DISABLE_EXPLICIT_GC))
+            suggestions.add("Disable processing of calls to System.gc() (add '" + DISABLE_EXPLICIT_GC + "' to JVM options)");
+
+        return suggestions;
+    }
+
+    /**
+     * @param lines Lines to check.
+     * @param prefix Prefix.
+     * @return {@code True} if found.
+     */
+    private static boolean anyStartWith(@NotNull List<String> lines, @NotNull String prefix) {
+        for (String line : lines) {
+            if (line.startsWith(prefix))
+                return true;
+        }
+
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(JvmConfigurationSuggestions.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/suggestions/OsConfigurationSuggestions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/suggestions/OsConfigurationSuggestions.java b/modules/core/src/main/java/org/apache/ignite/internal/suggestions/OsConfigurationSuggestions.java
new file mode 100644
index 0000000..e5b4c12
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/suggestions/OsConfigurationSuggestions.java
@@ -0,0 +1,127 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.suggestions;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Operation System configuration suggestions.
+ */
+public class OsConfigurationSuggestions {
+    /** */
+    private static final String VM_PARAMS_BASE_PATH = "/proc/sys/vm/";
+
+    /** */
+    private static final String DIRTY_WRITEBACK_CENTISECS = "dirty_writeback_centisecs";
+
+    /** */
+    private static final String DIRTY_EXPIRE_CENTISECS = "dirty_expire_centisecs";
+
+    /** */
+    private static final String SWAPPINESS = "swappiness";
+
+    /** */
+    private static final String ZONE_RECLAIM_MODE = "zone_reclaim_mode";
+
+    /** */
+    private static final String EXTRA_FREE_KBYTES = "extra_free_kbytes";
+
+    /**
+     * Checks OS configurations and produces tuning suggestions.
+     *
+     * @return List of suggestions of Operation system configuration tuning to increase Ignite performance.
+     */
+    public static synchronized List<String> getSuggestions() {
+        List<String> suggestions = new ArrayList<>();
+
+        if (U.isRedHat()) {
+            String value;
+            String expected = "500";
+
+            boolean dwcParamFlag = (value = readVmParam(DIRTY_WRITEBACK_CENTISECS)) != null && !value.equals(expected);
+            boolean decParamFlag = (value = readVmParam(DIRTY_EXPIRE_CENTISECS)) != null && !value.equals(expected);
+
+            if (dwcParamFlag || decParamFlag)
+                suggestions.add(String.format("Speed up flushing of dirty pages by OS " +
+                        "(alter %s%s%s parameter%s by setting to %s)",
+                    (dwcParamFlag ? "vm." + DIRTY_WRITEBACK_CENTISECS : ""),
+                    (dwcParamFlag && decParamFlag ? " and " : ""),
+                    (decParamFlag ? "vm." + DIRTY_EXPIRE_CENTISECS : ""),
+                    (dwcParamFlag && decParamFlag ? "s" : ""),
+                    expected));
+
+            if ((value = readVmParam(SWAPPINESS)) != null && !value.equals(expected = "10"))
+                suggestions.add(String.format("Reduce pages swapping ratio (set vm.%s=%s)", SWAPPINESS, expected));
+
+            if ((value = readVmParam(ZONE_RECLAIM_MODE)) != null && !value.equals(expected = "0"))
+                suggestions.add(String.format("Disable NUMA memory reclaim (set vm.%s=%s)", ZONE_RECLAIM_MODE,
+                    expected));
+
+            if ((value = readVmParam(EXTRA_FREE_KBYTES)) != null && !value.equals(expected = "1240000"))
+                suggestions.add(String.format("Avoid direct reclaim and page allocation failures (set vm.%s=%s)",
+                    EXTRA_FREE_KBYTES, expected));
+        }
+
+        return suggestions;
+    }
+
+    /**
+     * @param name Parameter name.
+     * @return Value (possibly null).
+     */
+    @Nullable private static String readVmParam(@NotNull String name) {
+        try {
+            Path path = Paths.get(VM_PARAMS_BASE_PATH + name);
+
+            if (!Files.exists(path))
+                return null;
+
+            return readLine(path);
+        }
+        catch (Exception ignored) {
+            return null;
+        }
+    }
+
+    /**
+     * @param path Path.
+     * @return Read line.
+     * @throws IOException If failed.
+     */
+    @Nullable private static String readLine(@NotNull Path path) throws IOException {
+        try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
+            return reader.readLine();
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(OsConfigurationSuggestions.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/suggestions/package-info.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/suggestions/package-info.java b/modules/core/src/main/java/org/apache/ignite/internal/suggestions/package-info.java
new file mode 100644
index 0000000..baced67
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/suggestions/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Contains classes for configurations suggestions.
+ */
+package org.apache.ignite.internal.suggestions;

http://git-wip-us.apache.org/repos/asf/ignite/blob/3459bdd3/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 653302c..f6c8163 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -73,6 +73,8 @@ import java.nio.channels.FileLock;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 import java.security.AccessController;
 import java.security.KeyManagementException;
 import java.security.MessageDigest;
@@ -366,6 +368,9 @@ public abstract class IgniteUtils {
     /** Indicates whether current OS is Mac OS. */
     private static boolean mac;
 
+    /** Indicates whether current OS is of RedHat family. */
+    private static boolean redHat;
+
     /** Indicates whether current OS architecture is Sun Sparc. */
     private static boolean sparc;
 
@@ -525,6 +530,8 @@ public abstract class IgniteUtils {
             assertionsEnabled = assertionsEnabled0;
         }
 
+        redHat = Files.exists(Paths.get("/etc/redhat-release")); // RedHat family OS (Fedora, CentOS, RedHat)
+
         String osName = System.getProperty("os.name");
 
         String osLow = osName.toLowerCase();
@@ -6282,6 +6289,13 @@ public abstract class IgniteUtils {
     }
 
     /**
+     * @return {@code True} if current OS is RedHat.
+     */
+    public static boolean isRedHat() {
+        return redHat;
+    }
+
+    /**
      * Indicates whether current OS is Netware.
      *
      * @return {@code true} if current OS is Netware - {@code false} otherwise.