如何理解 Mesos 中的 CPU 分配?

How to understand CPU allocation in Mesos?

我正在阅读 Building Applications on Mesos,遇到以下语句:

cpus
This resource expresses how many CPU cores are available. Tasks may use fractional parts of a CPU—this is possible because Mesos slaves use CPU shares, rather than reserving specific CPUs. This means that, if you have 1.5 cpus reserved, your processes will be allowed to use a total of 1.5 seconds of CPU time each second. That could mean that, within a single executor, two processes each get 750 milliseconds of CPU time per second, or one process gets 1 second of CPU time and another gets 500 milliseconds of CPU time each in a given second. The benefit of using CPU shares is that if some task would be able to utilize more than its share, and no other task would use an otherwise idle CPU, the first task can potentially use more than its share. As a result, the cpus reserved provides a guaranteed minimum of CPU time available to the task—if additional capacity is available, it will be allowed to use more.

我无法理解“if you have 1.5 cpus reserved, your processes will be allowed to use a total of 1.5 seconds of CPU time each second.”。它如何每秒使用 1.5 秒的 CPU 时间?

通过使用多个 cpu/core :-)。

请注意,这些限制的实际 behavior/enforcement 将在很大程度上取决于实际使用的 containerizer/isolator。 不幸的是,我找不到任何 good/recent 文档(但我知道有人正在努力改进它 :-)),但你可以看看这个博客 post: Blog Post about CPU resources

更新 CPU 利用率也有硬性上限:请参阅 --[no]-cgroups_enable_cfs configuration parameter 或者这个 Jira.

cpu=1.5应该代表一核半CPU。您可以在 Mesos Web UI 中看到每个 Mesos 代理(从属)提供多少个内核。这几乎就是 nproc 显示的内容,除非 mesos-slave 配置为提供更少的 CPU。 Mesos 以 3 位小数精度计算资源。

有几个标志影响 Mesos 限制资源的方式。因为 CPU 是最重要的 isolation (我们正在谈论 mesos-slave/mesos-agent 设置):

  • --isolation=posix/cpu,posix/mem None CPU 应用了限制 mesos-executor 只是一个运行其他进程的进程。您可以使用 nice,例如nice -20(最高优先级)或 cpulimit 命令影响内核规划,但 Mesos 的例如cpu=0.1不予考虑。
  • --isolation=cgroups/cpu,cgroups/mem cgroups(自 2.6.29 以来 Linux 内核的一部分)允许限制每个进程或进程组使用的资源。某些发行版默认不启用内存限制,需要将 cgroup_enable=memory 传递给内核。但让我们关注 CPU。默认情况下 cgroups 采取保守的方法,其中 cpu=1.0 意味着至少一个 CPU 核心将被保留用于任务。但如果主机上没有其他任务 运行,它可以消耗所有 CPU。假设我们有一个 12 CPUs 的主机,并且有两个任务 运行 cpu=2.0。那么每个任务最多可能达到 6 CPUs 个核心! (假设该主机上没有其他 Mesos 任务 运行)。这是非常危险的,当集群处于低负载时,所有任务看起来都很好,但是一旦有很多任务,一些主机的性能就会下降。
    • --cgroups_enable_cfs CFS stands for Completely Fair Scheduler which takes more strict approach. By default it is turned off, also not all distributions support this (you can use e.g. Docker's check-script.sh 以验证您的系统是否支持)。 CFS 将保证每个进程最多可以使用指定的部分(例如 cpu=2.5)。这是以当某些任务空闲时没有其他进程可以使用保留内核为代价的。所以,请确保您能很好地定义您的需求。

最后提到的问题可以通过 the Mesos documentation 中描述的 CPU 超额订阅来解决。