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 <[email protected]> Authored: Sat Feb 18 18:22:20 2017 +0800 Committer: Haosdent Huang <[email protected]> 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);
