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);