|
@@ -21,6 +21,7 @@ import org.apache.commons.io.FileUtils;
|
|
|
import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
|
import org.apache.hadoop.yarn.api.records.Resource;
|
|
|
import org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor;
|
|
|
+import org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.resources.TestCGroupsHandlerImpl;
|
|
|
import org.apache.hadoop.yarn.util.ResourceCalculatorPlugin;
|
|
|
import org.junit.Assert;
|
|
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
|
@@ -33,7 +34,6 @@ import org.mockito.Mockito;
|
|
|
import java.io.*;
|
|
|
import java.util.List;
|
|
|
import java.util.Scanner;
|
|
|
-import java.util.UUID;
|
|
|
import java.util.concurrent.CountDownLatch;
|
|
|
|
|
|
public class TestCgroupsLCEResourcesHandler {
|
|
@@ -142,7 +142,7 @@ public class TestCgroupsLCEResourcesHandler {
|
|
|
|
|
|
@Override
|
|
|
int[] getOverallLimits(float x) {
|
|
|
- if (generateLimitsMode == true) {
|
|
|
+ if (generateLimitsMode) {
|
|
|
return super.getOverallLimits(x);
|
|
|
}
|
|
|
return limits;
|
|
@@ -172,10 +172,11 @@ public class TestCgroupsLCEResourcesHandler {
|
|
|
handler.initConfig();
|
|
|
|
|
|
// create mock cgroup
|
|
|
- File cgroupMountDir = createMockCgroupMount(cgroupDir);
|
|
|
+ File cpuCgroupMountDir = TestCGroupsHandlerImpl.createMockCgroupMount(
|
|
|
+ cgroupDir, "cpu");
|
|
|
|
|
|
// create mock mtab
|
|
|
- File mockMtab = createMockMTab(cgroupDir);
|
|
|
+ File mockMtab = TestCGroupsHandlerImpl.createMockMTab(cgroupDir);
|
|
|
|
|
|
// setup our handler and call init()
|
|
|
handler.setMtabFile(mockMtab.getAbsolutePath());
|
|
@@ -184,8 +185,8 @@ public class TestCgroupsLCEResourcesHandler {
|
|
|
// in this case, we're using all cpu so the files
|
|
|
// shouldn't exist(because init won't create them
|
|
|
handler.init(mockLCE, plugin);
|
|
|
- File periodFile = new File(cgroupMountDir, "cpu.cfs_period_us");
|
|
|
- File quotaFile = new File(cgroupMountDir, "cpu.cfs_quota_us");
|
|
|
+ File periodFile = new File(cpuCgroupMountDir, "cpu.cfs_period_us");
|
|
|
+ File quotaFile = new File(cpuCgroupMountDir, "cpu.cfs_quota_us");
|
|
|
Assert.assertFalse(periodFile.exists());
|
|
|
Assert.assertFalse(quotaFile.exists());
|
|
|
|
|
@@ -202,7 +203,7 @@ public class TestCgroupsLCEResourcesHandler {
|
|
|
|
|
|
// set cpu back to 100, quota should be -1
|
|
|
conf.setInt(YarnConfiguration.NM_RESOURCE_PERCENTAGE_PHYSICAL_CPU_LIMIT,
|
|
|
- 100);
|
|
|
+ 100);
|
|
|
handler.limits[0] = 100 * 1000;
|
|
|
handler.limits[1] = 1000 * 1000;
|
|
|
handler.init(mockLCE, plugin);
|
|
@@ -235,7 +236,7 @@ public class TestCgroupsLCEResourcesHandler {
|
|
|
Assert.assertEquals(expectedQuota, ret[0]);
|
|
|
Assert.assertEquals(-1, ret[1]);
|
|
|
|
|
|
- int[] params = { 0, -1 };
|
|
|
+ int[] params = {0, -1};
|
|
|
for (int cores : params) {
|
|
|
try {
|
|
|
handler.getOverallLimits(cores);
|
|
@@ -251,34 +252,6 @@ public class TestCgroupsLCEResourcesHandler {
|
|
|
Assert.assertEquals(-1, ret[1]);
|
|
|
}
|
|
|
|
|
|
- private File createMockCgroupMount(File cgroupDir) throws IOException {
|
|
|
- File cgroupMountDir = new File(cgroupDir.getAbsolutePath(), "hadoop-yarn");
|
|
|
- FileUtils.deleteQuietly(cgroupDir);
|
|
|
- if (!cgroupMountDir.mkdirs()) {
|
|
|
- String message =
|
|
|
- "Could not create dir " + cgroupMountDir.getAbsolutePath();
|
|
|
- throw new IOException(message);
|
|
|
- }
|
|
|
- return cgroupMountDir;
|
|
|
- }
|
|
|
-
|
|
|
- private File createMockMTab(File cgroupDir) throws IOException {
|
|
|
- String mtabContent =
|
|
|
- "none " + cgroupDir.getAbsolutePath() + " cgroup rw,relatime,cpu 0 0";
|
|
|
- File mockMtab = new File("target", UUID.randomUUID().toString());
|
|
|
- if (!mockMtab.exists()) {
|
|
|
- if (!mockMtab.createNewFile()) {
|
|
|
- String message = "Could not create file " + mockMtab.getAbsolutePath();
|
|
|
- throw new IOException(message);
|
|
|
- }
|
|
|
- }
|
|
|
- FileWriter mtabWriter = new FileWriter(mockMtab.getAbsoluteFile());
|
|
|
- mtabWriter.write(mtabContent);
|
|
|
- mtabWriter.close();
|
|
|
- mockMtab.deleteOnExit();
|
|
|
- return mockMtab;
|
|
|
- }
|
|
|
-
|
|
|
@Test
|
|
|
public void testContainerLimits() throws IOException {
|
|
|
LinuxContainerExecutor mockLCE = new MockLinuxContainerExecutor();
|
|
@@ -286,6 +259,7 @@ public class TestCgroupsLCEResourcesHandler {
|
|
|
new CustomCgroupsLCEResourceHandler();
|
|
|
handler.generateLimitsMode = true;
|
|
|
YarnConfiguration conf = new YarnConfiguration();
|
|
|
+ conf.setBoolean(YarnConfiguration.NM_DISK_RESOURCE_ENABLED, true);
|
|
|
final int numProcessors = 4;
|
|
|
ResourceCalculatorPlugin plugin =
|
|
|
Mockito.mock(ResourceCalculatorPlugin.class);
|
|
@@ -294,71 +268,77 @@ public class TestCgroupsLCEResourcesHandler {
|
|
|
handler.initConfig();
|
|
|
|
|
|
// create mock cgroup
|
|
|
- File cgroupMountDir = createMockCgroupMount(cgroupDir);
|
|
|
+ File cpuCgroupMountDir = TestCGroupsHandlerImpl.createMockCgroupMount(
|
|
|
+ cgroupDir, "cpu");
|
|
|
|
|
|
// create mock mtab
|
|
|
- File mockMtab = createMockMTab(cgroupDir);
|
|
|
+ File mockMtab = TestCGroupsHandlerImpl.createMockMTab(cgroupDir);
|
|
|
|
|
|
// setup our handler and call init()
|
|
|
handler.setMtabFile(mockMtab.getAbsolutePath());
|
|
|
handler.init(mockLCE, plugin);
|
|
|
|
|
|
- // check values
|
|
|
- // default case - files shouldn't exist, strict mode off by default
|
|
|
+ // check the controller paths map isn't empty
|
|
|
ContainerId id = ContainerId.fromString("container_1_1_1_1");
|
|
|
handler.preExecute(id, Resource.newInstance(1024, 1));
|
|
|
- File containerDir = new File(cgroupMountDir, id.toString());
|
|
|
- Assert.assertTrue(containerDir.exists());
|
|
|
- Assert.assertTrue(containerDir.isDirectory());
|
|
|
- File periodFile = new File(containerDir, "cpu.cfs_period_us");
|
|
|
- File quotaFile = new File(containerDir, "cpu.cfs_quota_us");
|
|
|
+ Assert.assertNotNull(handler.getControllerPaths());
|
|
|
+ // check values
|
|
|
+ // default case - files shouldn't exist, strict mode off by default
|
|
|
+ File containerCpuDir = new File(cpuCgroupMountDir, id.toString());
|
|
|
+ Assert.assertTrue(containerCpuDir.exists());
|
|
|
+ Assert.assertTrue(containerCpuDir.isDirectory());
|
|
|
+ File periodFile = new File(containerCpuDir, "cpu.cfs_period_us");
|
|
|
+ File quotaFile = new File(containerCpuDir, "cpu.cfs_quota_us");
|
|
|
Assert.assertFalse(periodFile.exists());
|
|
|
Assert.assertFalse(quotaFile.exists());
|
|
|
|
|
|
// no files created because we're using all cpu
|
|
|
- FileUtils.deleteQuietly(containerDir);
|
|
|
+ FileUtils.deleteQuietly(containerCpuDir);
|
|
|
conf.setBoolean(
|
|
|
- YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE, true);
|
|
|
+ YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE,
|
|
|
+ true);
|
|
|
handler.initConfig();
|
|
|
handler.preExecute(id,
|
|
|
- Resource.newInstance(1024, YarnConfiguration.DEFAULT_NM_VCORES));
|
|
|
- Assert.assertTrue(containerDir.exists());
|
|
|
- Assert.assertTrue(containerDir.isDirectory());
|
|
|
- periodFile = new File(containerDir, "cpu.cfs_period_us");
|
|
|
- quotaFile = new File(containerDir, "cpu.cfs_quota_us");
|
|
|
+ Resource.newInstance(1024, YarnConfiguration.DEFAULT_NM_VCORES));
|
|
|
+ Assert.assertTrue(containerCpuDir.exists());
|
|
|
+ Assert.assertTrue(containerCpuDir.isDirectory());
|
|
|
+ periodFile = new File(containerCpuDir, "cpu.cfs_period_us");
|
|
|
+ quotaFile = new File(containerCpuDir, "cpu.cfs_quota_us");
|
|
|
Assert.assertFalse(periodFile.exists());
|
|
|
Assert.assertFalse(quotaFile.exists());
|
|
|
|
|
|
// 50% of CPU
|
|
|
- FileUtils.deleteQuietly(containerDir);
|
|
|
+ FileUtils.deleteQuietly(containerCpuDir);
|
|
|
conf.setBoolean(
|
|
|
- YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE, true);
|
|
|
+ YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE,
|
|
|
+ true);
|
|
|
handler.initConfig();
|
|
|
handler.preExecute(id,
|
|
|
- Resource.newInstance(1024, YarnConfiguration.DEFAULT_NM_VCORES / 2));
|
|
|
- Assert.assertTrue(containerDir.exists());
|
|
|
- Assert.assertTrue(containerDir.isDirectory());
|
|
|
- periodFile = new File(containerDir, "cpu.cfs_period_us");
|
|
|
- quotaFile = new File(containerDir, "cpu.cfs_quota_us");
|
|
|
+ Resource.newInstance(1024, YarnConfiguration.DEFAULT_NM_VCORES / 2));
|
|
|
+ Assert.assertTrue(containerCpuDir.exists());
|
|
|
+ Assert.assertTrue(containerCpuDir.isDirectory());
|
|
|
+ periodFile = new File(containerCpuDir, "cpu.cfs_period_us");
|
|
|
+ quotaFile = new File(containerCpuDir, "cpu.cfs_quota_us");
|
|
|
Assert.assertTrue(periodFile.exists());
|
|
|
Assert.assertTrue(quotaFile.exists());
|
|
|
Assert.assertEquals(500 * 1000, readIntFromFile(periodFile));
|
|
|
Assert.assertEquals(1000 * 1000, readIntFromFile(quotaFile));
|
|
|
|
|
|
// CGroups set to 50% of CPU, container set to 50% of YARN CPU
|
|
|
- FileUtils.deleteQuietly(containerDir);
|
|
|
+ FileUtils.deleteQuietly(containerCpuDir);
|
|
|
conf.setBoolean(
|
|
|
- YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE, true);
|
|
|
+ YarnConfiguration.NM_LINUX_CONTAINER_CGROUPS_STRICT_RESOURCE_USAGE,
|
|
|
+ true);
|
|
|
conf
|
|
|
.setInt(YarnConfiguration.NM_RESOURCE_PERCENTAGE_PHYSICAL_CPU_LIMIT, 50);
|
|
|
handler.initConfig();
|
|
|
handler.init(mockLCE, plugin);
|
|
|
handler.preExecute(id,
|
|
|
- Resource.newInstance(1024, YarnConfiguration.DEFAULT_NM_VCORES / 2));
|
|
|
- Assert.assertTrue(containerDir.exists());
|
|
|
- Assert.assertTrue(containerDir.isDirectory());
|
|
|
- periodFile = new File(containerDir, "cpu.cfs_period_us");
|
|
|
- quotaFile = new File(containerDir, "cpu.cfs_quota_us");
|
|
|
+ Resource.newInstance(1024, YarnConfiguration.DEFAULT_NM_VCORES / 2));
|
|
|
+ Assert.assertTrue(containerCpuDir.exists());
|
|
|
+ Assert.assertTrue(containerCpuDir.isDirectory());
|
|
|
+ periodFile = new File(containerCpuDir, "cpu.cfs_period_us");
|
|
|
+ quotaFile = new File(containerCpuDir, "cpu.cfs_quota_us");
|
|
|
Assert.assertTrue(periodFile.exists());
|
|
|
Assert.assertTrue(quotaFile.exists());
|
|
|
Assert.assertEquals(1000 * 1000, readIntFromFile(periodFile));
|