diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java index 53817b5..c747996 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/conf/YarnConfiguration.java @@ -948,6 +948,14 @@ public static boolean isAclEnabled(Configuration conf) { public static final int DEFAULT_NM_MEMORY_RESOURCE_CGROUPS_SWAPPINESS = 0; @Private + public static final String NM_MEMORY_RESOURCE_CGROUPS_KILL_ON_OOM = + NM_MEMORY_RESOURCE_PREFIX + "cgroups.kill-on-oom"; + + @Private + public static final boolean + DEFAULT_NM_MEMORY_RESOURCE_CGROUPS_KILL_ON_OOM = true; + + @Private public static final String NM_MEMORY_RESOURCE_CGROUPS_SOFT_LIMIT_PERCENTAGE = NM_MEMORY_RESOURCE_PREFIX + "cgroups.soft-limit-percentage"; @Private diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsHandler.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsHandler.java index eefaabd..914d753 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsHandler.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsHandler.java @@ -56,6 +56,7 @@ String getName() { String CGROUP_PARAM_MEMORY_HARD_LIMIT_BYTES = "limit_in_bytes"; String CGROUP_PARAM_MEMORY_SOFT_LIMIT_BYTES = "soft_limit_in_bytes"; String CGROUP_PARAM_MEMORY_SWAPPINESS = "swappiness"; + String CGROUP_PARAM_MEMORY_OOM_CONTROL = "oom_control"; String CGROUP_CPU_PERIOD_US = "cfs_period_us"; diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsMemoryResourceHandlerImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsMemoryResourceHandlerImpl.java index 78113e5..7195e37 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsMemoryResourceHandlerImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/CGroupsMemoryResourceHandlerImpl.java @@ -48,6 +48,7 @@ CGroupsHandler.CGroupController.MEMORY; private CGroupsHandler cGroupsHandler; + private int oomControl = 0; private int swappiness = 0; // multiplier to set the soft limit - value should be between 0 and 1 private float softLimit = 0.0f; @@ -75,6 +76,13 @@ throw new ResourceHandlerException(msg); } this.cGroupsHandler.mountCGroupController(MEMORY); + + // Infer value of oomControl + boolean killOnOOM = conf.getBoolean( + YarnConfiguration.NM_MEMORY_RESOURCE_CGROUPS_KILL_ON_OOM, + YarnConfiguration.DEFAULT_NM_MEMORY_RESOURCE_CGROUPS_KILL_ON_OOM); + oomControl = killOnOOM ? 0 : 1; + swappiness = conf .getInt(YarnConfiguration.NM_MEMORY_RESOURCE_CGROUPS_SWAPPINESS, YarnConfiguration.DEFAULT_NM_MEMORY_RESOURCE_CGROUPS_SWAPPINESS); @@ -102,6 +110,11 @@ int getSwappiness() { return swappiness; } + @VisibleForTesting + int getOomControl() { + return oomControl; + } + @Override public List reacquireContainer(ContainerId containerId) throws ResourceHandlerException { @@ -126,6 +139,9 @@ int getSwappiness() { CGroupsHandler.CGROUP_PARAM_MEMORY_SOFT_LIMIT_BYTES, String.valueOf(containerSoftLimit) + "M"); cGroupsHandler.updateCGroupParam(MEMORY, cgroupId, + CGroupsHandler.CGROUP_PARAM_MEMORY_OOM_CONTROL, + String.valueOf(oomControl)); + cGroupsHandler.updateCGroupParam(MEMORY, cgroupId, CGroupsHandler.CGROUP_PARAM_MEMORY_SWAPPINESS, String.valueOf(swappiness)); } catch (ResourceHandlerException re) { diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsMemoryResourceHandlerImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsMemoryResourceHandlerImpl.java index d98a16f..7e64658 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsMemoryResourceHandlerImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/test/java/org/apache/hadoop/yarn/server/nodemanager/containermanager/linux/resources/TestCGroupsMemoryResourceHandlerImpl.java @@ -34,6 +34,7 @@ public class TestCGroupsMemoryResourceHandlerImpl { + private Configuration conf; private CGroupsHandler mockCGroupsHandler; private CGroupsMemoryResourceHandlerImpl cGroupsMemoryResourceHandler; @@ -42,13 +43,14 @@ public void setup() { mockCGroupsHandler = mock(CGroupsHandler.class); cGroupsMemoryResourceHandler = new CGroupsMemoryResourceHandlerImpl(mockCGroupsHandler); + + conf = new YarnConfiguration(); + conf.setBoolean(YarnConfiguration.NM_PMEM_CHECK_ENABLED, false); + conf.setBoolean(YarnConfiguration.NM_VMEM_CHECK_ENABLED, false); } @Test public void testBootstrap() throws Exception { - Configuration conf = new YarnConfiguration(); - conf.setBoolean(YarnConfiguration.NM_PMEM_CHECK_ENABLED, false); - conf.setBoolean(YarnConfiguration.NM_VMEM_CHECK_ENABLED, false); List ret = cGroupsMemoryResourceHandler.bootstrap(conf); verify(mockCGroupsHandler, times(1)) @@ -56,6 +58,8 @@ public void testBootstrap() throws Exception { Assert.assertNull(ret); Assert.assertEquals("Default swappiness value incorrect", 0, cGroupsMemoryResourceHandler.getSwappiness()); + Assert.assertEquals("Default oom_control value incorrect", 0, + cGroupsMemoryResourceHandler.getOomControl()); conf.setBoolean(YarnConfiguration.NM_PMEM_CHECK_ENABLED, true); try { cGroupsMemoryResourceHandler.bootstrap(conf); @@ -77,9 +81,6 @@ public void testBootstrap() throws Exception { @Test public void testSwappinessValues() throws Exception { - Configuration conf = new YarnConfiguration(); - conf.setBoolean(YarnConfiguration.NM_PMEM_CHECK_ENABLED, false); - conf.setBoolean(YarnConfiguration.NM_VMEM_CHECK_ENABLED, false); conf.setInt(YarnConfiguration.NM_MEMORY_RESOURCE_CGROUPS_SWAPPINESS, -1); try { cGroupsMemoryResourceHandler.bootstrap(conf); @@ -104,10 +105,22 @@ public void testSwappinessValues() throws Exception { } @Test + public void testOomControlValues() throws ResourceHandlerException { + conf.setBoolean( + YarnConfiguration.NM_MEMORY_RESOURCE_CGROUPS_KILL_ON_OOM, true); + cGroupsMemoryResourceHandler.bootstrap(conf); + Assert.assertEquals("oom_control value incorrect", 0, + cGroupsMemoryResourceHandler.getOomControl()); + + conf.setBoolean( + YarnConfiguration.NM_MEMORY_RESOURCE_CGROUPS_KILL_ON_OOM, false); + cGroupsMemoryResourceHandler.bootstrap(conf); + Assert.assertEquals("oom_control value incorrect", 1, + cGroupsMemoryResourceHandler.getOomControl()); + } + + @Test public void testPreStart() throws Exception { - Configuration conf = new Configuration(); - conf.setBoolean(YarnConfiguration.NM_PMEM_CHECK_ENABLED, false); - conf.setBoolean(YarnConfiguration.NM_VMEM_CHECK_ENABLED, false); cGroupsMemoryResourceHandler.bootstrap(conf); String id = "container_01_01"; String path = "test-path/" + id; @@ -136,6 +149,9 @@ public void testPreStart() throws Exception { verify(mockCGroupsHandler, times(1)) .updateCGroupParam(CGroupsHandler.CGroupController.MEMORY, id, CGroupsHandler.CGROUP_PARAM_MEMORY_SWAPPINESS, String.valueOf(0)); + verify(mockCGroupsHandler, times(1)) + .updateCGroupParam(CGroupsHandler.CGroupController.MEMORY, id, + CGroupsHandler.CGROUP_PARAM_MEMORY_OOM_CONTROL, String.valueOf(1)); Assert.assertNotNull(ret); Assert.assertEquals(1, ret.size()); PrivilegedOperation op = ret.get(0);