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
{