You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by vi...@apache.org on 2014/02/28 23:25:54 UTC

[2/2] git commit: Refactored cpu control writes.

Refactored cpu control writes.

Review: https://reviews.apache.org/r/18642


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/7bc95251
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/7bc95251
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/7bc95251

Branch: refs/heads/master
Commit: 7bc952510a3f011088b5c02ae3f3007170078d64
Parents: 170038e
Author: Vinod Kone <vi...@twitter.com>
Authored: Fri Feb 28 12:52:55 2014 -0800
Committer: Vinod Kone <vi...@twitter.com>
Committed: Fri Feb 28 14:25:13 2014 -0800

----------------------------------------------------------------------
 src/linux/cgroups.cpp                           | 58 ++++++++++++++++++++
 src/linux/cgroups.hpp                           | 38 +++++++++++++
 .../isolators/cgroups/cpushare.cpp              | 30 +++++-----
 src/tests/cgroups_tests.cpp                     | 15 +++++
 4 files changed, 126 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/7bc95251/src/linux/cgroups.cpp
----------------------------------------------------------------------
diff --git a/src/linux/cgroups.cpp b/src/linux/cgroups.cpp
index 4bf7f26..6f95376 100644
--- a/src/linux/cgroups.cpp
+++ b/src/linux/cgroups.cpp
@@ -20,6 +20,7 @@
 #include <fts.h>
 #include <signal.h>
 #include <stdint.h>
+#include <stdlib.h>
 #include <unistd.h>
 
 #include <sys/syscall.h>
@@ -1947,6 +1948,63 @@ Try<hashmap<string, uint64_t> > stat(
 }
 
 
+namespace cpu {
+
+Try<Nothing> shares(
+    const string& hierarchy,
+    const string& cgroup,
+    size_t shares)
+{
+  return cgroups::write(
+      hierarchy,
+      cgroup,
+      "cpu.shares",
+      stringify(shares));
+}
+
+
+Try<Nothing> cfs_period_us(
+    const string& hierarchy,
+    const string& cgroup,
+    const Duration& duration)
+{
+  return cgroups::write(
+      hierarchy,
+      cgroup,
+      "cpu.cfs_period_us",
+      stringify(static_cast<uint64_t>(duration.us())));
+}
+
+
+Try<Duration> cfs_quota_us(
+    const string& hierarchy,
+    const string& cgroup)
+{
+  Try<string> read = cgroups::read(hierarchy, cgroup, "cpu.cfs_quota_us");
+
+  if (read.isError()) {
+    return Error(read.error());
+  }
+
+  return Duration::parse(strings::trim(read.get()) + "us");
+}
+
+
+Try<Nothing> cfs_quota_us(
+    const string& hierarchy,
+    const string& cgroup,
+    const Duration& duration)
+{
+  return cgroups::write(
+      hierarchy,
+      cgroup,
+      "cpu.cfs_quota_us",
+      stringify(static_cast<int64_t>(duration.us())));
+}
+
+} // namespace cpu {
+
+
 namespace memory {
 
 Try<Bytes> limit_in_bytes(const string& hierarchy, const string& cgroup)

http://git-wip-us.apache.org/repos/asf/mesos/blob/7bc95251/src/linux/cgroups.hpp
----------------------------------------------------------------------
diff --git a/src/linux/cgroups.hpp b/src/linux/cgroups.hpp
index 2f4ab25..65f0958 100644
--- a/src/linux/cgroups.hpp
+++ b/src/linux/cgroups.hpp
@@ -20,6 +20,7 @@
 #define __CGROUPS_HPP__
 
 #include <stdint.h>
+#include <stdlib.h>
 
 #include <set>
 #include <string>
@@ -394,6 +395,38 @@ Try<hashmap<std::string, uint64_t> > stat(
     const std::string& file);
 
 
+// Cpu controls.
+namespace cpu {
+
+// Sets the cpu shares using cpu.shares.
+Try<Nothing> shares(
+    const std::string& hierarchy,
+    const std::string& cgroup,
+    size_t shares);
+
+
+// Sets the cfs period using cpu.cfs_period_us.
+Try<Nothing> cfs_period_us(
+    const std::string& hierarchy,
+    const std::string& cgroup,
+    const Duration& duration);
+
+
+// Returns the cfs quota from cpu.cfs_quota_us.
+Try<Duration> cfs_quota_us(
+    const std::string& hierarchy,
+    const std::string& cgroup);
+
+
+// Sets the cfs quota using cpu.cfs_quota_us.
+Try<Nothing> cfs_quota_us(
+    const std::string& hierarchy,
+    const std::string& cgroup,
+    const Duration& duration);
+
+} // namespace cpu {
+
+
 // Memory controls.
 namespace memory {
 
@@ -402,28 +435,33 @@ Try<Bytes> limit_in_bytes(
     const std::string& hierarchy,
     const std::string& cgroup);
 
+
 // Sets the memory limit using memory.limit_in_bytes.
 Try<Nothing> limit_in_bytes(
     const std::string& hierarchy,
     const std::string& cgroup,
     const Bytes& limit);
 
+
 // Returns the soft memory limit from memory.soft_limit_in_bytes.
 Try<Bytes> soft_limit_in_bytes(
     const std::string& hierarchy,
     const std::string& cgroup);
 
+
 // Sets the soft memory limit using memory.soft_limit_in_bytes.
 Try<Nothing> soft_limit_in_bytes(
     const std::string& hierarchy,
     const std::string& cgroup,
     const Bytes& limit);
 
+
 // Returns the memory usage from memory.usage_in_bytes.
 Try<Bytes> usage_in_bytes(
     const std::string& hierarchy,
     const std::string& cgroup);
 
+
 // Returns the max memory usage from memory.max_usage_in_bytes.
 Try<Bytes> max_usage_in_bytes(
     const std::string& hierarchy,

http://git-wip-us.apache.org/repos/asf/mesos/blob/7bc95251/src/slave/containerizer/isolators/cgroups/cpushare.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/cpushare.cpp b/src/slave/containerizer/isolators/cgroups/cpushare.cpp
index 60ce568..f74e80e 100644
--- a/src/slave/containerizer/isolators/cgroups/cpushare.cpp
+++ b/src/slave/containerizer/isolators/cgroups/cpushare.cpp
@@ -56,6 +56,7 @@ namespace internal {
 namespace slave {
 
 // CPU subsystem constants.
+// TODO(vinod): Use uint64_t instead of size_t for shares.
 const size_t CPU_SHARES_PER_CPU = 1024;
 const size_t MIN_CPU_SHARES = 10;
 const Duration CPU_CFS_PERIOD = Milliseconds(100); // Linux default.
@@ -306,6 +307,12 @@ Future<Nothing> CgroupsCpushareIsolatorProcess::update(
     return Failure("Unknown container");
   }
 
+  const Option<string>& hierarchy = hierarchies.get("cpu");
+
+  if (hierarchy.isNone()) {
+    return Failure("No 'cpu' hierarchy");
+  }
+
   Info* info = CHECK_NOTNULL(infos[containerId]);
 
   double cpus = resources.cpus().get();
@@ -314,8 +321,8 @@ Future<Nothing> CgroupsCpushareIsolatorProcess::update(
   size_t shares =
     std::max((size_t) (CPU_SHARES_PER_CPU * cpus), MIN_CPU_SHARES);
 
-  Try<Nothing> write = cgroups::write(
-      hierarchies["cpu"], info->cgroup, "cpu.shares", stringify(shares));
+  Try<Nothing> write = cgroups::cpu::shares(
+      hierarchy.get(), info->cgroup, shares);
 
   if (write.isError()) {
     return Failure("Failed to update 'cpu.shares': " + write.error());
@@ -327,24 +334,17 @@ Future<Nothing> CgroupsCpushareIsolatorProcess::update(
 
   // Set cfs quota if enabled.
   if (flags.cgroups_enable_cfs) {
-    write = cgroups::write(
-        hierarchies["cpu"],
-        info->cgroup,
-        "cpu.cfs_period_us",
-        stringify(static_cast<size_t>(CPU_CFS_PERIOD.us())));
+    write = cgroups::cpu::cfs_period_us(
+        hierarchy.get(), info->cgroup, CPU_CFS_PERIOD);
+
     if (write.isError()) {
       return Failure("Failed to update 'cpu.cfs_period_us': " + write.error());
     }
 
-    Duration desired = Microseconds(
-        static_cast<int64_t>(CPU_CFS_PERIOD.us() * cpus));
-    Duration quota = std::max(desired, MIN_CPU_CFS_QUOTA);
+    Duration quota = std::max(CPU_CFS_PERIOD * cpus, MIN_CPU_CFS_QUOTA);
+
+    write = cgroups::cpu::cfs_quota_us(hierarchy.get(), info->cgroup, quota);
 
-    write = cgroups::write(
-        hierarchies["cpu"],
-        info->cgroup,
-        "cpu.cfs_quota_us",
-        stringify(static_cast<size_t>(quota.us())));
     if (write.isError()) {
       return Failure("Failed to update 'cpu.cfs_quota_us': " + write.error());
     }

http://git-wip-us.apache.org/repos/asf/mesos/blob/7bc95251/src/tests/cgroups_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/cgroups_tests.cpp b/src/tests/cgroups_tests.cpp
index b9ec276..4a092cc 100644
--- a/src/tests/cgroups_tests.cpp
+++ b/src/tests/cgroups_tests.cpp
@@ -435,6 +435,21 @@ TEST_F(CgroupsAnyHierarchyTest, ROOT_CGROUPS_Write)
 }
 
 
+TEST_F(CgroupsAnyHierarchyTest, ROOT_CGROUPS_Cfs_Big_Quota)
+{
+  std::string hierarchy = path::join(baseHierarchy, "cpu");
+  ASSERT_SOME(cgroups::create(hierarchy, TEST_CGROUPS_ROOT));
+
+  Duration quota = Seconds(100); // Big quota.
+  ASSERT_SOME(cgroups::cpu::cfs_quota_us(hierarchy, TEST_CGROUPS_ROOT, quota));
+
+  // Ensure we can read back the correct quota.
+  ASSERT_SOME_EQ(
+      quota,
+      cgroups::cpu::cfs_quota_us(hierarchy, TEST_CGROUPS_ROOT));
+}
+
+
 class CgroupsAnyHierarchyWithCpuAcctMemoryTest
   : public CgroupsAnyHierarchyTest
 {