You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ha...@apache.org on 2017/02/18 10:29:56 UTC
mesos git commit: Made docker executor be aware of the
`cgroups_enable_cfs` flag.
Repository: mesos
Updated Branches:
refs/heads/master 8561b96a7 -> 346cc8dd5
Made docker executor be aware of the `cgroups_enable_cfs` flag.
This fixes the cpu CFS quota setting for docker executor by ensuring
`--cpu-quota` flag when performing `docker run`.
Review: https://reviews.apache.org/r/51052/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/346cc8dd
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/346cc8dd
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/346cc8dd
Branch: refs/heads/master
Commit: 346cc8dd528a28a6e1f1cbdb4c95b8bdea2f6070
Parents: 8561b96
Author: Zhitao Li <zh...@gmail.com>
Authored: Sat Feb 18 18:22:20 2017 +0800
Committer: Haosdent Huang <ha...@apache.org>
Committed: Sat Feb 18 18:22:20 2017 +0800
----------------------------------------------------------------------
src/docker/docker.cpp | 13 +++++++++++++
src/docker/docker.hpp | 4 ++++
src/docker/executor.cpp | 15 +++++++++++----
src/docker/executor.hpp | 8 ++++++++
src/slave/containerizer/docker.cpp | 9 +++++++++
src/tests/containerizer/docker_tests.cpp | 2 ++
6 files changed, 47 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/346cc8dd/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 075b86d..634ab40 100755
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -502,6 +502,7 @@ Try<Docker::RunOptions> Docker::RunOptions::create(
const string& sandboxDirectory,
const string& mappedDirectory,
const Option<Resources>& resources,
+ bool enableCfsQuota,
const Option<map<string, string>>& env,
const Option<vector<Device>>& devices)
{
@@ -520,6 +521,13 @@ Try<Docker::RunOptions> Docker::RunOptions::create(
if (cpus.isSome()) {
options.cpuShares =
std::max((uint64_t) (CPU_SHARES_PER_CPU * cpus.get()), MIN_CPU_SHARES);
+
+ if (enableCfsQuota) {
+ const Duration quota =
+ std::max(CPU_CFS_PERIOD * cpus.get(), MIN_CPU_CFS_QUOTA);
+
+ options.cpuQuota = quota.us();
+ }
}
Option<Bytes> mem = resources.get().mem();
@@ -786,6 +794,11 @@ Future<Option<int>> Docker::run(
argv.push_back(stringify(options.cpuShares.get()));
}
+ if (options.cpuQuota.isSome()) {
+ argv.push_back("--cpu-quota");
+ argv.push_back(stringify(options.cpuQuota.get()));
+ }
+
if (options.memory.isSome()) {
argv.push_back("--memory");
argv.push_back(stringify(options.memory->bytes()));
http://git-wip-us.apache.org/repos/asf/mesos/blob/346cc8dd/src/docker/docker.hpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp
index 1737b78..5593cb6 100644
--- a/src/docker/docker.hpp
+++ b/src/docker/docker.hpp
@@ -161,6 +161,7 @@ public:
const std::string& sandboxDirectory,
const std::string& mappedDirectory,
const Option<mesos::Resources>& resources = None(),
+ bool enableCfsQuota = false,
const Option<std::map<std::string, std::string>>& env = None(),
const Option<std::vector<Device>>& devices = None());
@@ -170,6 +171,9 @@ public:
// "--cpu-shares" option.
Option<uint64_t> cpuShares;
+ // "--cpu-quota" option.
+ Option<uint64_t> cpuQuota;
+
// "--memory" option.
Option<Bytes> memory;
http://git-wip-us.apache.org/repos/asf/mesos/blob/346cc8dd/src/docker/executor.cpp
----------------------------------------------------------------------
diff --git a/src/docker/executor.cpp b/src/docker/executor.cpp
index 0db2556..6c11320 100644
--- a/src/docker/executor.cpp
+++ b/src/docker/executor.cpp
@@ -86,7 +86,8 @@ public:
const string& mappedDirectory,
const Duration& shutdownGracePeriod,
const string& launcherDir,
- const map<string, string>& taskEnvironment)
+ const map<string, string>& taskEnvironment,
+ bool cgroupsEnableCfs)
: ProcessBase(ID::generate("docker-executor")),
killed(false),
killedByHealthCheck(false),
@@ -98,6 +99,7 @@ public:
mappedDirectory(mappedDirectory),
shutdownGracePeriod(shutdownGracePeriod),
taskEnvironment(taskEnvironment),
+ cgroupsEnableCfs(cgroupsEnableCfs),
stop(Nothing()),
inspect(Nothing()) {}
@@ -161,6 +163,7 @@ public:
sandboxDirectory,
mappedDirectory,
task.resources() + task.executor().resources(),
+ cgroupsEnableCfs,
taskEnvironment,
None() // No extra devices.
);
@@ -579,6 +582,7 @@ private:
string mappedDirectory;
Duration shutdownGracePeriod;
map<string, string> taskEnvironment;
+ bool cgroupsEnableCfs;
Option<KillPolicy> killPolicy;
Option<Future<Option<int>>> run;
@@ -603,7 +607,8 @@ public:
const string& mappedDirectory,
const Duration& shutdownGracePeriod,
const string& launcherDir,
- const map<string, string>& taskEnvironment)
+ const map<string, string>& taskEnvironment,
+ bool cgroupsEnableCfs)
{
process = Owned<DockerExecutorProcess>(new DockerExecutorProcess(
docker,
@@ -612,7 +617,8 @@ public:
mappedDirectory,
shutdownGracePeriod,
launcherDir,
- taskEnvironment));
+ taskEnvironment,
+ cgroupsEnableCfs));
spawn(process.get());
}
@@ -826,7 +832,8 @@ int main(int argc, char** argv)
flags.mapped_directory.get(),
shutdownGracePeriod,
flags.launcher_dir.get(),
- taskEnvironment));
+ taskEnvironment,
+ flags.cgroups_enable_cfs));
Owned<mesos::MesosExecutorDriver> driver(
new mesos::MesosExecutorDriver(executor.get()));
http://git-wip-us.apache.org/repos/asf/mesos/blob/346cc8dd/src/docker/executor.hpp
----------------------------------------------------------------------
diff --git a/src/docker/executor.hpp b/src/docker/executor.hpp
index d424977..5c4e1c2 100644
--- a/src/docker/executor.hpp
+++ b/src/docker/executor.hpp
@@ -75,6 +75,12 @@ struct Flags : public virtual mesos::internal::logging::Flags
"task_environment",
"A JSON map of environment variables and values that should\n"
"be passed into the task launched by this executor.");
+
+ add(&Flags::cgroups_enable_cfs,
+ "cgroups_enable_cfs",
+ "Cgroups feature flag to enable hard limits on CPU resources\n"
+ "via the CFS bandwidth limiting subfeature.\n",
+ false);
}
Option<std::string> container;
@@ -85,6 +91,8 @@ struct Flags : public virtual mesos::internal::logging::Flags
Option<std::string> launcher_dir;
Option<std::string> task_environment;
+ bool cgroups_enable_cfs;
+
// TODO(alexr): Remove this after the deprecation cycle (started in 1.0).
Option<Duration> stop_timeout;
};
http://git-wip-us.apache.org/repos/asf/mesos/blob/346cc8dd/src/slave/containerizer/docker.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp
index ed1cbf1..7d801fb 100644
--- a/src/slave/containerizer/docker.cpp
+++ b/src/slave/containerizer/docker.cpp
@@ -253,6 +253,10 @@ docker::Flags dockerFlags(
dockerFlags.task_environment = string(jsonify(taskEnvironment.get()));
}
+#ifdef __linux__
+ dockerFlags.cgroups_enable_cfs = flags.cgroups_enable_cfs,
+#endif
+
// TODO(alexr): Remove this after the deprecation cycle (started in 1.0).
dockerFlags.stop_timeout = flags.docker_stop_timeout;
@@ -1329,6 +1333,11 @@ Future<Docker::Container> DockerContainerizerProcess::launchExecutorContainer(
container->directory,
flags.sandbox_directory,
container->resources,
+#ifdef __linux__
+ flags.cgroups_enable_cfs,
+#else
+ false,
+#endif
container->environment,
None() // No extra devices.
);
http://git-wip-us.apache.org/repos/asf/mesos/blob/346cc8dd/src/tests/containerizer/docker_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_tests.cpp b/src/tests/containerizer/docker_tests.cpp
index db9355f..452858d 100644
--- a/src/tests/containerizer/docker_tests.cpp
+++ b/src/tests/containerizer/docker_tests.cpp
@@ -821,6 +821,7 @@ TEST_F(DockerTest, ROOT_DOCKER_NVIDIA_GPU_DeviceAllow)
directory.get(),
"/mnt/mesos/sandbox",
resources,
+ false,
None(),
devices);
@@ -879,6 +880,7 @@ TEST_F(DockerTest, ROOT_DOCKER_NVIDIA_GPU_InspectDevices)
directory.get(),
"/mnt/mesos/sandbox",
resources,
+ false,
None(),
devices);