[prev in list] [next in list] [prev in thread] [next in thread]
List: mesos-commits
Subject: [1/2] mesos git commit: Use IDLE scheduling for revocable CPU in cgroups isolator.
From: idownes () apache ! org
Date: 2015-05-29 21:34:22
Message-ID: 5628088d33784cd28d700a0c7ef07051 () git ! apache ! org
[Download RAW message or body]
Repository: mesos
Updated Branches:
refs/heads/master d7c0873e7 -> b8b9255eb
Use IDLE scheduling for revocable CPU in cgroups isolator.
Review: https://reviews.apache.org/r/34310
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/b8b9255e
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/b8b9255e
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/b8b9255e
Branch: refs/heads/master
Commit: b8b9255ebeb1ae6ac8e854f1267c04915039f4bd
Parents: 6de149e
Author: Ian Downes <idownes@twitter.com>
Authored: Fri May 15 18:03:45 2015 -0700
Committer: Ian Downes <idownes@twitter.com>
Committed: Fri May 29 14:33:21 2015 -0700
----------------------------------------------------------------------
.../isolators/cgroups/cpushare.cpp | 21 +++++++
.../isolators/cgroups/cpushare.hpp | 1 +
src/slave/flags.cpp | 7 +++
src/slave/flags.hpp | 1 +
src/tests/isolator_tests.cpp | 65 ++++++++++++++++++++
5 files changed, 95 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/b8b9255e/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 e3b5e2a..214ba23 \
100644
--- a/src/slave/containerizer/isolators/cgroups/cpushare.cpp
+++ b/src/slave/containerizer/isolators/cgroups/cpushare.cpp
@@ -40,6 +40,7 @@
#include <stout/try.hpp>
#include "linux/cgroups.hpp"
+#include "linux/sched.hpp"
#include "slave/flags.hpp"
@@ -332,6 +333,25 @@ Future<Nothing> CgroupsCpushareIsolatorProcess::isolate(
}
}
+ // NOTE: This only sets the executor and descendants to IDLE policy
+ // if the initial CPU resource is revocable and not if initial CPU
+ // is non-revocable but subsequent updates include revocable CPU.
+ if (info->resources.isSome() &&
+ info->resources.get().revocable().cpus().isSome() &&
+ flags.revocable_cpu_low_priority) {
+ Try<Nothing> set = sched::policy::set(sched::Policy::IDLE, pid);
+ if (set.isError()) {
+ return Failure("Failed to set SCHED_IDLE for pid " + stringify(pid) +
+ " in container '" + stringify(containerId) + "'" +
+ " with revocable CPU: " + set.error());
+ }
+
+ LOG(INFO) << "Set scheduling policy to SCHED_IDLE for pid " << pid
+ << " in container '" << containerId << "' because it includes '"
+ << info->resources.get().revocable().cpus().get()
+ << "' revocable CPU";
+ }
+
return Nothing();
}
@@ -367,6 +387,7 @@ Future<Nothing> CgroupsCpushareIsolatorProcess::update(
}
Info* info = CHECK_NOTNULL(infos[containerId]);
+ info->resources = resources;
double cpus = resources.cpus().get();
http://git-wip-us.apache.org/repos/asf/mesos/blob/b8b9255e/src/slave/containerizer/isolators/cgroups/cpushare.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/isolators/cgroups/cpushare.hpp \
b/src/slave/containerizer/isolators/cgroups/cpushare.hpp index ff4a9db..14adf0a \
100644
--- a/src/slave/containerizer/isolators/cgroups/cpushare.hpp
+++ b/src/slave/containerizer/isolators/cgroups/cpushare.hpp
@@ -89,6 +89,7 @@ private:
const ContainerID containerId;
const std::string cgroup;
Option<pid_t> pid;
+ Option<Resources> resources;
process::Promise<mesos::slave::Limitation> limitation;
};
http://git-wip-us.apache.org/repos/asf/mesos/blob/b8b9255e/src/slave/flags.cpp
----------------------------------------------------------------------
diff --git a/src/slave/flags.cpp b/src/slave/flags.cpp
index 6b7c61e..7f2e1e8 100644
--- a/src/slave/flags.cpp
+++ b/src/slave/flags.cpp
@@ -236,6 +236,13 @@ mesos::internal::slave::Flags::Flags()
"Duration of a perf stat sample. The duration must be less\n"
"that the perf_interval.",
Seconds(10));
+
+ add(&Flags::revocable_cpu_low_priority,
+ "revocable_cpu_low_priority",
+ "Run containers with revocable CPU at a lower priority than\n"
+ "normal containers (non-revocable cpu). Currently only\n"
+ "supported by the cgroups/cpu isolator.",
+ true);
#endif
add(&Flags::credential,
http://git-wip-us.apache.org/repos/asf/mesos/blob/b8b9255e/src/slave/flags.hpp
----------------------------------------------------------------------
diff --git a/src/slave/flags.hpp b/src/slave/flags.hpp
index 944ed79..e84efc1 100644
--- a/src/slave/flags.hpp
+++ b/src/slave/flags.hpp
@@ -74,6 +74,7 @@ public:
Option<std::string> perf_events;
Duration perf_interval;
Duration perf_duration;
+ bool revocable_cpu_low_priority;
#endif
Option<Path> credential;
Option<std::string> containerizer_path;
http://git-wip-us.apache.org/repos/asf/mesos/blob/b8b9255e/src/tests/isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/isolator_tests.cpp b/src/tests/isolator_tests.cpp
index 24c71b7..acb1404 100644
--- a/src/tests/isolator_tests.cpp
+++ b/src/tests/isolator_tests.cpp
@@ -41,6 +41,7 @@
#ifdef __linux__
#include "linux/ns.hpp"
+#include "linux/sched.hpp"
#endif // __linux__
#include "master/master.hpp"
@@ -365,6 +366,70 @@ TYPED_TEST(CpuIsolatorTest, SystemCpuUsage)
#ifdef __linux__
+class RevocableCpuIsolatorTest : public MesosTest {};
+
+
+TEST_F(RevocableCpuIsolatorTest, ROOT_CGROUPS_RevocableCpu)
+{
+ slave::Flags flags;
+
+ Try<Isolator*> isolator = CgroupsCpushareIsolatorProcess::create(flags);
+ CHECK_SOME(isolator);
+
+ Try<Launcher*> launcher = PosixLauncher::create(flags);
+
+ // Include revocable CPU in the executor's resources.
+ Resource cpu = Resources::parse("cpus", "1", "*").get();
+ cpu.mutable_revocable();
+
+ ExecutorInfo executorInfo;
+ executorInfo.add_resources()->CopyFrom(cpu);
+
+ ContainerID containerId;
+ containerId.set_value(UUID::random().toString());
+
+ AWAIT_READY(isolator.get()->prepare(
+ containerId,
+ executorInfo,
+ os::getcwd(),
+ None()));
+
+ vector<string> argv{"sleep", "100"};
+
+ Try<pid_t> pid = launcher.get()->fork(
+ containerId,
+ "/bin/sleep",
+ argv,
+ Subprocess::PATH("/dev/null"),
+ Subprocess::PATH("/dev/null"),
+ Subprocess::PATH("/dev/null"),
+ None(),
+ None(),
+ None());
+
+ ASSERT_SOME(pid);
+
+ AWAIT_READY(isolator.get()->isolate(containerId, pid.get()));
+
+ // Check the executor has its scheduling policy set to IDLE.
+ EXPECT_SOME_EQ(sched::Policy::IDLE, sched::policy::get(pid.get()));
+
+ // Kill the container and clean up.
+ Future<Option<int>> status = process::reap(pid.get());
+
+ AWAIT_READY(launcher.get()->destroy(containerId));
+
+ AWAIT_READY(status);
+
+ AWAIT_READY(isolator.get()->cleanup(containerId));
+
+ delete isolator.get();
+ delete launcher.get();
+}
+#endif // __linux__
+
+
+#ifdef __linux__
class LimitedCpuIsolatorTest : public MesosTest {};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic