You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2012/11/26 22:25:08 UTC

svn commit: r1413867 - /incubator/mesos/branches/0.11.0/src/tests/cgroups_isolation_tests.cpp

Author: benh
Date: Mon Nov 26 21:25:08 2012
New Revision: 1413867

URL: http://svn.apache.org/viewvc?rev=1413867&view=rev
Log:
Added cpuset tests.

From: Ben Mahler <be...@gmail.com>
Review: https://reviews.apache.org/r/8176

Modified:
    incubator/mesos/branches/0.11.0/src/tests/cgroups_isolation_tests.cpp

Modified: incubator/mesos/branches/0.11.0/src/tests/cgroups_isolation_tests.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/branches/0.11.0/src/tests/cgroups_isolation_tests.cpp?rev=1413867&r1=1413866&r2=1413867&view=diff
==============================================================================
--- incubator/mesos/branches/0.11.0/src/tests/cgroups_isolation_tests.cpp (original)
+++ incubator/mesos/branches/0.11.0/src/tests/cgroups_isolation_tests.cpp Mon Nov 26 21:25:08 2012
@@ -16,11 +16,286 @@
  * limitations under the License.
  */
 
+#include <map>
+
 #include <gtest/gtest.h>
 
+#include <stout/foreach.hpp>
+#include <stout/stringify.hpp>
+
+#include "linux/proc.hpp"
+
+#include "slave/cgroups_isolation_module.hpp"
+
 #include "tests/script.hpp"
 
+using namespace mesos;
+using namespace mesos::internal;
+using namespace mesos::internal::slave;
+
+using std::map;
+
 // Run the balloon framework under the cgroups isolation module.
 TEST_SCRIPT(CgroupsIsolationTest,
             ROOT_CGROUPS_BalloonFramework,
             "balloon_framework_test.sh")
+
+
+#define GROW_USAGE(delta, cpuset, usage)                                   \
+  ({                                                                       \
+    const map<proc::CPU, double>& allocation = cpuset.grow(delta, usage);  \
+    foreachpair (const proc::CPU& cpu, double allocated, allocation) {     \
+      usage[cpu] += allocated;                                             \
+      ASSERT_LT(usage[cpu], 1.001);                                        \
+    }                                                                      \
+  })
+
+
+#define SHRINK_USAGE(delta, cpuset, usage)                                 \
+  ({                                                                       \
+    const map<proc::CPU, double>& deallocation = cpuset.shrink(delta);     \
+    foreachpair (const proc::CPU& cpu, double deallocated, deallocation) { \
+      usage[cpu] -= deallocated;                                           \
+      ASSERT_GT(usage[cpu], -0.001);                                       \
+    }                                                                      \
+  })
+
+
+TEST(CgroupsCpusetTest, OneCPUOneCpuset)
+{
+  Cpuset cpuset;
+
+  map<proc::CPU, double> usage;
+  usage[proc::CPU(0,0,0)] = 0.0;
+
+  // Saturate the CPU.
+  GROW_USAGE(0.2, cpuset, usage);
+  GROW_USAGE(0.1, cpuset, usage);
+  GROW_USAGE(0.2, cpuset, usage);
+  GROW_USAGE(0.5, cpuset, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(cpuset.usage(), 1.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset), "0");
+
+  // Empty the CPU.
+  SHRINK_USAGE(0.5, cpuset, usage);
+  SHRINK_USAGE(0.2, cpuset, usage);
+  SHRINK_USAGE(0.1, cpuset, usage);
+  SHRINK_USAGE(0.2, cpuset, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 0.0, 0.001);
+  ASSERT_NEAR(cpuset.usage(), 0.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset), "");
+}
+
+
+TEST(CgroupsCpusetTest, OneCPUManyCpusets)
+{
+  Cpuset cpuset1, cpuset2, cpuset3;
+
+  map<proc::CPU, double> usage;
+  usage[proc::CPU(0,0,0)] = 0.0;
+
+  // Saturate the CPU.
+  GROW_USAGE(0.2, cpuset1, usage);
+  GROW_USAGE(0.1, cpuset2, usage);
+  GROW_USAGE(0.2, cpuset3, usage);
+  GROW_USAGE(0.5, cpuset1, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(cpuset1.usage(), 0.7, 0.001);
+  ASSERT_NEAR(cpuset2.usage(), 0.1, 0.001);
+  ASSERT_NEAR(cpuset3.usage(), 0.2, 0.001);
+
+  ASSERT_EQ(stringify(cpuset1), "0");
+  ASSERT_EQ(stringify(cpuset2), "0");
+  ASSERT_EQ(stringify(cpuset3), "0");
+
+  // Empty the CPU.
+  SHRINK_USAGE(0.5, cpuset1, usage);
+  SHRINK_USAGE(0.2, cpuset3, usage);
+  SHRINK_USAGE(0.1, cpuset2, usage);
+  SHRINK_USAGE(0.2, cpuset1, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 0.0, 0.001);
+  ASSERT_NEAR(cpuset1.usage(), 0.0, 0.001);
+  ASSERT_NEAR(cpuset2.usage(), 0.0, 0.001);
+  ASSERT_NEAR(cpuset3.usage(), 0.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset1), "");
+  ASSERT_EQ(stringify(cpuset2), "");
+  ASSERT_EQ(stringify(cpuset3), "");
+}
+
+
+TEST(CgroupsCpusetTest, ManyCPUOneCpuset)
+{
+  Cpuset cpuset;
+
+  map<proc::CPU, double> usage;
+  usage[proc::CPU(0,0,0)] = 0.0;
+  usage[proc::CPU(1,0,0)] = 0.0;
+  usage[proc::CPU(2,0,0)] = 0.0;
+
+  // Saturate the first CPU.
+  GROW_USAGE(0.2, cpuset, usage);
+  GROW_USAGE(0.1, cpuset, usage);
+  GROW_USAGE(0.2, cpuset, usage);
+  GROW_USAGE(0.5, cpuset, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(cpuset.usage(), 1.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset), "0");
+
+  // Saturate the second CPU.
+  GROW_USAGE(0.6, cpuset, usage);
+  GROW_USAGE(0.4, cpuset, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(1,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(cpuset.usage(), 2.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset), "0,1");
+
+  // Partial third CPU.
+  GROW_USAGE(0.1, cpuset, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(2,0,0)], 0.1, 0.001);
+  ASSERT_NEAR(cpuset.usage(), 2.1, 0.001);
+
+  ASSERT_EQ(stringify(cpuset), "0,1,2");
+
+  // Empty the CPU.
+  SHRINK_USAGE(0.5, cpuset, usage);
+  SHRINK_USAGE(0.2, cpuset, usage);
+  SHRINK_USAGE(0.1, cpuset, usage);
+  SHRINK_USAGE(0.1, cpuset, usage);
+  SHRINK_USAGE(0.2, cpuset, usage);
+  SHRINK_USAGE(0.4, cpuset, usage);
+  SHRINK_USAGE(0.6, cpuset, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 0.0, 0.001);
+  ASSERT_NEAR(cpuset.usage(), 0.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset), "");
+}
+
+
+TEST(CgroupsCpusetTest, ManyCPUManyCpusets)
+{
+  Cpuset cpuset1, cpuset2, cpuset3;
+
+  map<proc::CPU, double> usage;
+  usage[proc::CPU(0,0,0)] = 0.0;
+  usage[proc::CPU(1,0,0)] = 0.0;
+  usage[proc::CPU(2,0,0)] = 0.0;
+
+  // Saturate the first CPU.
+  GROW_USAGE(0.2, cpuset1, usage);
+  GROW_USAGE(0.1, cpuset2, usage);
+  GROW_USAGE(0.2, cpuset3, usage);
+  GROW_USAGE(0.5, cpuset1, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(cpuset1.usage(), 0.7, 0.001);
+  ASSERT_NEAR(cpuset2.usage(), 0.1, 0.001);
+  ASSERT_NEAR(cpuset3.usage(), 0.2, 0.001);
+
+  ASSERT_EQ(stringify(cpuset1), "0");
+  ASSERT_EQ(stringify(cpuset2), "0");
+  ASSERT_EQ(stringify(cpuset3), "0");
+
+  // Saturate the second CPU.
+  GROW_USAGE(0.6, cpuset3, usage);
+  GROW_USAGE(0.4, cpuset2, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(1,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(cpuset2.usage(), 0.5, 0.001);
+  ASSERT_NEAR(cpuset3.usage(), 0.8, 0.001);
+
+  ASSERT_EQ(stringify(cpuset2), "0,1");
+  ASSERT_EQ(stringify(cpuset3), "0,1");
+
+  // Partial third CPU.
+  GROW_USAGE(0.1, cpuset2, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(2,0,0)], 0.1, 0.001);
+  ASSERT_NEAR(cpuset2.usage(), 0.6, 0.001);
+
+  ASSERT_EQ(stringify(cpuset2), "0,1,2");
+
+  // Empty the CPU.
+  SHRINK_USAGE(0.5, cpuset1, usage);
+  SHRINK_USAGE(0.2, cpuset1, usage);
+  SHRINK_USAGE(0.1, cpuset2, usage);
+  SHRINK_USAGE(0.1, cpuset2, usage);
+  SHRINK_USAGE(0.2, cpuset3, usage);
+  SHRINK_USAGE(0.4, cpuset2, usage);
+  SHRINK_USAGE(0.6, cpuset3, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 0.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(1,0,0)], 0.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(2,0,0)], 0.0, 0.001);
+
+  ASSERT_NEAR(cpuset1.usage(), 0.0, 0.001);
+  ASSERT_NEAR(cpuset2.usage(), 0.0, 0.001);
+  ASSERT_NEAR(cpuset3.usage(), 0.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset1), "");
+  ASSERT_EQ(stringify(cpuset2), "");
+  ASSERT_EQ(stringify(cpuset3), "");
+}
+
+
+TEST(CgroupsCpusetTest, IntegerAllocations)
+{
+  // Ensure no fragmentation occurs.
+  Cpuset cpuset1, cpuset2, cpuset3;
+
+  map<proc::CPU, double> usage;
+  usage[proc::CPU(0,0,0)] = 0.0;
+  usage[proc::CPU(1,0,0)] = 0.0;
+  usage[proc::CPU(2,0,0)] = 0.0;
+  usage[proc::CPU(3,0,0)] = 0.0;
+
+  // Saturate the CPUs.
+  GROW_USAGE(1.0, cpuset1, usage);
+  GROW_USAGE(2.0, cpuset2, usage);
+  GROW_USAGE(1.0, cpuset3, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(1,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(2,0,0)], 1.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(3,0,0)], 1.0, 0.001);
+
+  ASSERT_NEAR(cpuset1.usage(), 1.0, 0.001);
+  ASSERT_NEAR(cpuset2.usage(), 2.0, 0.001);
+  ASSERT_NEAR(cpuset3.usage(), 1.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset1), "0");
+  ASSERT_EQ(stringify(cpuset2), "1,2");
+  ASSERT_EQ(stringify(cpuset3), "3");
+
+  // Empty the CPU.
+  SHRINK_USAGE(1.0, cpuset1, usage);
+  SHRINK_USAGE(2.0, cpuset2, usage);
+  SHRINK_USAGE(1.0, cpuset3, usage);
+
+  ASSERT_NEAR(usage[proc::CPU(0,0,0)], 0.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(1,0,0)], 0.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(2,0,0)], 0.0, 0.001);
+  ASSERT_NEAR(usage[proc::CPU(3,0,0)], 0.0, 0.001);
+
+  ASSERT_NEAR(cpuset1.usage(), 0.0, 0.001);
+  ASSERT_NEAR(cpuset2.usage(), 0.0, 0.001);
+  ASSERT_NEAR(cpuset3.usage(), 0.0, 0.001);
+
+  ASSERT_EQ(stringify(cpuset1), "");
+  ASSERT_EQ(stringify(cpuset2), "");
+  ASSERT_EQ(stringify(cpuset3), "");
+}