diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index 2f2528445d3..849785c39fc 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -2136,15 +2136,17 @@ public static boolean isAclEnabled(Configuration conf) { public static final String NM_LINUX_CONTAINER_CGROUPS_MOUNT_PATH = NM_PREFIX + "linux-container-executor.cgroups.mount-path"; - /** - * Whether the apps should run in strict resource usage mode(not allowed to - * use spare CPU) - */ + // Whether the apps should run in strict resource usage mode public static final String NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE = NM_PREFIX + "linux-container-executor.cgroups.strict-resource-usage"; public static final boolean DEFAULT_NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE = false; + // The max ratio of container using spare CPU in strict resource usage mode + public static final String NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE_RATIO = + NM_PREFIX + "linux-container-executor.cgroups.strict-resource-usage.ratio"; + public static final double DEFAULT_NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE_RATIO = + 1.0; // Configurations for applicaiton life time monitor feature public static final String RM_APPLICATION_MONITOR_INTERVAL_MS = diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml index e7a0e1406ce..e8dc35cff5e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/resources/yarn-default.xml @@ -1714,14 +1714,21 @@ This flag determines whether apps should run with strict resource limits or be allowed to consume spare resources if they need them. For example, turning the - flag on will restrict apps to use only their share of CPU, even if the node has spare - CPU cycles. The default value is false i.e. use available resources. Please note that + flag on will restrict apps to use their share of CPU and some spare CPU cycles if + available. The default value is false i.e. use available resources. Please note that turning this flag on may reduce job throughput on the cluster. This setting does not apply to other subsystems like memory. yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage false + + The max ratio of container using spare CPU in + strict resource usage mode. + yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage.ratio + 1.0 + + Comma separated list of runtimes that are allowed when using LinuxContainerExecutor. The allowed values are default, docker, and diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/util/CgroupsLCEResourcesHandler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/util/CgroupsLCEResourcesHandler.java index 54b6e1c170b..50843cdbca5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/util/CgroupsLCEResourcesHandler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/util/CgroupsLCEResourcesHandler.java @@ -340,8 +340,12 @@ private void setupLimits(ContainerId containerId, String.valueOf(cpuShares)); if (strictResourceUsageMode) { if (nodeVCores != containerVCores) { + double containerCPUStrictRatio = conf.getDouble( + YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE_RATIO, + YarnConfiguration.DEFAULT_NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE_RATIO); float containerCPU = - (containerVCores * yarnProcessors) / (float) nodeVCores; + (float) containerCPUStrictRatio * + (containerVCores * yarnProcessors) / (float) nodeVCores; int[] limits = getOverallLimits(containerCPU); updateCgroup(CONTROLLER_CPU, containerName, CPU_PERIOD_US, String.valueOf(limits[0]));