diff --git a/jstorm-core/src/main/java/com/alibaba/jstorm/daemon/supervisor/Heartbeat.java b/jstorm-core/src/main/java/com/alibaba/jstorm/daemon/supervisor/Heartbeat.java index 9a8572f5e..e00d7b434 100644 --- a/jstorm-core/src/main/java/com/alibaba/jstorm/daemon/supervisor/Heartbeat.java +++ b/jstorm-core/src/main/java/com/alibaba/jstorm/daemon/supervisor/Heartbeat.java @@ -202,7 +202,7 @@ private List calculatorAvailablePorts() { if (cpuUsage <= 0.0 || !ConfigExtension.isSupervisorEnableAutoAdjustSlots(conf)) { return defaultPortList; } - long freeMemory = JStormUtils.getFreePhysicalMem() * 1024L; + long freeMemory = JStormUtils.getAvailablePhysicalMem() * 1024L; long reserveMemory = ConfigExtension.getStormMachineReserveMem(conf); diff --git a/jstorm-core/src/main/java/com/alibaba/jstorm/utils/JStormUtils.java b/jstorm-core/src/main/java/com/alibaba/jstorm/utils/JStormUtils.java index fbde4ae25..5d4ffb1c6 100644 --- a/jstorm-core/src/main/java/com/alibaba/jstorm/utils/JStormUtils.java +++ b/jstorm-core/src/main/java/com/alibaba/jstorm/utils/JStormUtils.java @@ -518,6 +518,10 @@ public static Long getFreePhysicalMem() { return LinuxResource.getFreePhysicalMem(); } + public static Long getAvailablePhysicalMem() { + return LinuxResource.getAvailablePhysicalMem(); + } + public static int getNumProcessors() { return LinuxResource.getProcessNum(); } diff --git a/jstorm-core/src/main/java/com/alibaba/jstorm/utils/LinuxResource.java b/jstorm-core/src/main/java/com/alibaba/jstorm/utils/LinuxResource.java index 36f20b713..f118d00bb 100644 --- a/jstorm-core/src/main/java/com/alibaba/jstorm/utils/LinuxResource.java +++ b/jstorm-core/src/main/java/com/alibaba/jstorm/utils/LinuxResource.java @@ -5,6 +5,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,6 +27,7 @@ public class LinuxResource { private static final Pattern CPU_TIME_FORMAT = Pattern.compile("^cpu[ \t]+([0-9]+)[ \t]+([0-9]+)[ \t]+([0-9]+)"); private static final String PROCFS_MEMINFO = "/proc/meminfo"; + private static final String MEMINFO_MEMAVAILABLE = "MemAvailable"; public static final long JIFFY_LENGTH_IN_MILLIS; static { long jiffiesPerSecond = getJiffies(); @@ -185,7 +187,23 @@ public static Long getFreePhysicalMem() { } return 0L; } + public static Long getAvailablePhysicalMem() { + if (!OSInfo.isLinux()) { + return 0L; + } + try { + List lines = IOUtils.readLines(new FileInputStream(PROCFS_MEMINFO)); + String free = lines.get(2).split("\\s+")[1]; + if( StringUtils.indexOfIgnoreCase(lines.get(2), MEMINFO_MEMAVAILABLE) < 0 ){ + free = lines.get(1).split("\\s+")[1]; + } + return Long.valueOf(free); + } catch (Exception ignored) { + LOG.warn("failed to get total free memory."); + } + return 0L; + } /** * calcute the disk usage at current filesystem * @return