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 271b666..04b41b0 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 @@ -1936,6 +1936,16 @@ public static boolean isAclEnabled(Configuration conf) { public static final boolean DEFAULT_NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE = false; + /** + * Max resource usage percent when apps run in strict resource usage mode. + * Make resource usage configurable, apps can use resource no more than + * maxResourceUsagePercent * containerVCores. + */ + public static final String NM_LINUX_CONTAINER_CGROUPS_MAX_RESOURCE_USAGE_PERCENT = + NM_PREFIX + "linux-container-executor.cgroups.max-resource-usage-percent"; + public static final float DEFAULT_NM_LINUX_CONTAINER_CGROUPS_MAX_RESOURCE_USAGE_PERCENT = + 1.0f; + // 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 017799a..6f637ae 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 @@ -1628,6 +1628,19 @@ + This property configuration sets the maximum amount of CPU + resources that can be consumed by a single container when + yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage + is set to true, as a multiple of the number of vcores assigned to the container. + The default value is 1.0, which means that each container will be prevented from + consuming more than 1.0 times the number of vcores assigned to it when strict + usage mode is enabled. + + yarn.nodemanager.linux-container-executor.cgroups.max-resource-usage-percent + 1.0 + + + Comma separated list of runtimes that are allowed when using LinuxContainerExecutor. The allowed values are default, docker, and javasandbox. diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsCpuResourceHandlerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsCpuResourceHandlerImpl.java index 7ea7be2..4598942 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsCpuResourceHandlerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsCpuResourceHandlerImpl.java @@ -66,6 +66,7 @@ private boolean strictResourceUsageMode = false; private float yarnProcessors; private int nodeVCores; + private float maxResourceUsagePercentInStrictMode; private static final CGroupsHandler.CGroupController CPU = CGroupsHandler.CGroupController.CPU; @@ -95,6 +96,13 @@ this.strictResourceUsageMode = conf.getBoolean( YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE, YarnConfiguration.DEFAULT_NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE); + this.maxResourceUsagePercentInStrictMode = conf.getFloat( + YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_MAX_RESOURCE_USAGE_PERCENT, + YarnConfiguration.DEFAULT_NM_LINUX_CONTAINER_CGROUPS_MAX_RESOURCE_USAGE_PERCENT); + if (this.maxResourceUsagePercentInStrictMode <= 0.0f) { + this.maxResourceUsagePercentInStrictMode = + YarnConfiguration.DEFAULT_NM_LINUX_CONTAINER_CGROUPS_MAX_RESOURCE_USAGE_PERCENT; + } this.cGroupsHandler.initializeCGroupController(CPU); nodeVCores = NodeManagerHardwareUtils.getVCores(plugin, conf); @@ -206,7 +214,8 @@ public static boolean cpuLimitsExist(String path) if (nodeVCores != containerVCores) { float containerCPU = (containerVCores * yarnProcessors) / (float) nodeVCores; - int[] limits = getOverallLimits(containerCPU); + int[] limits = getOverallLimits(containerCPU + * maxResourceUsagePercentInStrictMode); cGroupsHandler.updateCGroupParam(CPU, cgroupId, CGroupsHandler.CGROUP_CPU_PERIOD_US, String.valueOf(limits[0])); cGroupsHandler.updateCGroupParam(CPU, cgroupId, diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsCpuResourceHandlerImpl.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsCpuResourceHandlerImpl.java index 006b060..b3a7ec5 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsCpuResourceHandlerImpl.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsCpuResourceHandlerImpl.java @@ -213,10 +213,14 @@ public void testPreStartRestrictedContainers() throws Exception { String id = "container_01_01"; String path = "test-path/" + id; int defaultVCores = 8; + float maxResourceUsagePercent = 2.0f; Configuration conf = new YarnConfiguration(); conf.setBoolean( YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE, true); + conf.setFloat( + YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_MAX_RESOURCE_USAGE_PERCENT, + maxResourceUsagePercent); int cpuPerc = 75; conf.setInt(YarnConfiguration.NM_RESOURCE_PERCENTAGE_PHYSICAL_CPU_LIMIT, cpuPerc); @@ -229,7 +233,7 @@ public void testPreStartRestrictedContainers() throws Exception { CGroupsHandler.CGROUP_CPU_QUOTA_US, String.valueOf(CGroupsCpuResourceHandlerImpl.MAX_QUOTA_US)); float yarnCores = (cpuPerc * numProcessors) / 100; - int[] containerVCores = { 2, 4 }; + int[] containerVCores = { 1, 2 }; for (int cVcores : containerVCores) { ContainerId mockContainerId = mock(ContainerId.class); when(mockContainerId.toString()).thenReturn(id); @@ -244,7 +248,8 @@ public void testPreStartRestrictedContainers() throws Exception { .getPathForCGroupTasks(CGroupsHandler.CGroupController.CPU, id)) .thenReturn(path); - float share = (cVcores * yarnCores) / defaultVCores; + float share = (cVcores * maxResourceUsagePercent + * yarnCores) / defaultVCores; int quotaUS; int periodUS; if (share > 1.0f) {