Kubernetes 中使用 Millicores 的多线程
Multi threading with Millicores in Kubernetes
我对 Kubernetes 中的毫核概念感到困惑。根据我的编程知识,每个内核只能 运行 1 个线程,所以为什么要限制毫核?
例如,如果我给一个容器 600m 的 cpu 限制,我可以将 400m 用于另一个 pod 或容器,这可能吗?
我已经尝试在其上安装 minikube 和 运行。
两个容器或pods 运行 不同的线程?请问有谁能解释一下吗
内核的调度器 运行 连接容器 (f.e。linux) 意味着为一个进程预留时间片以 运行 与其他进程并发同样的cpu。
你可以限制一个进程——给它更少的时间片——如果它使用太多cpu。发生这种情况然后达到(硬)限制。如果 cpu 请求超过节点上的可用 cpu 资源,您可以将 pod 安排到不同的节点。
因此,请求是 kubernetes 调度程序如何最佳地跨节点放置 pods 的提示,而限制是内核调度程序确保不会实际使用更多资源。
实际上,如果您只是配置请求而没有限制,所有 pods 都将由内核调度程序策略进行调度,该策略试图公平并平衡所有进程之间的资源以最大化使用率,同时不会使任何单个进程挨饿。
最好把millicores看成分数的一种表达方式,x millicores对应分数x/1000(例如250 毫核 = 250/1000 = 1/4).
值 1 表示完全使用 1 个核心(如果启用了超线程或任何其他 SMT,则为硬件线程)。
所以 100mcpu 意味着进程使用单个 CPU 时间的 1/10。这意味着它使用 10 秒中的 1 秒,或 1 秒中的 100 毫秒或 100 秒中的 10us。
随便取一个时间单位,把它分成十份,只对其中一份运行ning
当然,如果间隔太短(比如 1us),调度程序的开销将变得不可忽略,但这并不重要。
如果该值大于 1,则进程正在使用多个 CPU。 2300mcpu 的值意味着在 10 秒内,进程 运行 宁... 23!
这用于表示该过程正在使用 2 个完整的 CPU 和三分之一的 3/10。
这听起来可能很奇怪,但这与说 "I work out 3.5 times a week" 意思是 "I work out 7 days every 2 weeks".
没有什么不同
记住:毫核代表 CPU 时间 的一小部分,而不是 CPU 数字。所以2300mcpu是单次CPU.
时间的230%
我讨厌 Kubernetes 和 Docker 之类的技术,因为它们隐藏太多,让经验丰富的程序员感到困惑。
millicores 单位的基础是 Linux 调度程序的工作方式。它不会将时间划分为量子并为每个线程分配 CPU 一个量子,相反,它 运行 是一个线程,直到保持它 运行 是不公平的。所以一个线程可以 运行 持续可变的时间。
当前的 Linux 调度程序 named CFS 使用 等待时间 的概念。
每个线程都有一个等待时间,一个计数器在线程等待执行时每纳秒递增一次(但任何足够精细的时间单位都可以),线程正在执行的每纳秒递减一次。
然后线程按等待时间除以线程总数排序,等待时间最长的线程被挑选出来,运行直到它等待时间(现在正在减少)低于另一个线程的等待时间(然后将被安排).
因此,如果我们有一个核心(没有超线程或任何其他 SMT)和四个线程,比方说,一秒后,调度程序将为每个线程分配该秒的 1/4(250 毫秒)。
您可以说每个线程使用了 250 毫核。这意味着它平均使用 250/1000 = 1/4 的核心时间。 "core time" 可以是任意时间,只要它远大于调度程序挂钟。所以 250 毫核意味着每 4 分钟 1 分钟,或每 8 天 2 天。
当一个系统有多个 CPUs/cores 时,等待时间会相应调整。
现在,如果一个线程在 1 秒的过程中被调度到整个秒的两个 CPU,我们对第一个 CPU 使用 1/1,对第二个使用 1/1一。总共 1/1 + 1/1 = 2 或 2000mcpu.
这种计算CPU次的方式,虽然一开始很奇怪,但它的优势在于它是绝对的。 100mcpu就是1/10的CPU,不管有多少CPU,这是设计使然
如果我们以相对的方式计算时间(即值 1 表示所有 CPUs),那么像 0.5 这样的值在 48 CPUs 系统中表示 24 CPUs 而 4在 8 CPUs 系统中。
很难比较时间。
Linux 调度程序实际上并不知道 毫核 ,因为我们已经看到它使用 等待时间 并且不需要任何其他测量单位。
到目前为止,毫核 单位只是我们为了方便起见而编造的一个单位。
然而,由于容器的约束方式,这个单元会自然出现。
顾名思义,Linux 调度程序是公平的:所有线程都是平等的。但是您并不总是希望如此,容器中的进程不应占用机器上的所有内核。
这就是 cgroups 发挥作用的地方。它是一个内核功能,与名称空间和联合 fs 一起用于实现容器。
它的主要目标是限制进程,包括它们的 CPU 带宽。
This is done with two parameters, a period and a quota.
调度程序允许受限线程 运行 每 quota 微秒 (us) 每 period us.
同样,这里的 quota 大于 period 意味着使用多个 CPU。引用内核文档:
Limit a group to 1 CPU worth of runtime.
If period is 250ms and quota is also 250ms, the group will get
1 CPU worth of runtime every 250ms.
Limit a group to 2 CPUs worth of runtime on a multi-CPU machine.
With 500ms period and 1000ms quota, the group can get 2 CPUs worth of
runtime every 500ms.
我们了解如何在给定 x 毫核的情况下计算配额和周期。
我们可以将周期固定为 100 毫秒,将配额固定为 (100 * x) / 1000。
Docker does it.
就是这样
当然,我们有无限的对选择,我们将周期设置为 100 毫秒,但实际上我们可以使用任何值(实际上,没有无限的值,但仍然)。
较大的周期值意味着线程可以 运行 更长的时间,但也会暂停更长的时间。
这里是 Docker 对程序员隐藏东西的地方,使用任意值作为周期来计算配额(给定 毫核 ,作者将其称为更多 "user-friendly").
Kubernetes is designed around Docker(是的,它可以使用其他容器管理器,但它们必须公开一个类似于 Docker 的接口),而 Kubernetes millicores 单位匹配 Docker 在其 --cpus
参数中使用的单位。
所以,长话短说,毫核是单个CPU的时间的分数(不是CPU 的数量)。
Cgroups,因此 Docker,因此 Kubernetes,不会通过将内核分配给进程(就像 VM 那样)来限制 CPU 使用,而是限制 CPU 通过限制时间量(一段时间内的配额)使用该进程可以在每个 CPU 上 运行(每个 CPU 占用最多 1000mcpus 的允许时间)。
我对 Kubernetes 中的毫核概念感到困惑。根据我的编程知识,每个内核只能 运行 1 个线程,所以为什么要限制毫核? 例如,如果我给一个容器 600m 的 cpu 限制,我可以将 400m 用于另一个 pod 或容器,这可能吗? 我已经尝试在其上安装 minikube 和 运行。 两个容器或pods 运行 不同的线程?请问有谁能解释一下吗
内核的调度器 运行 连接容器 (f.e。linux) 意味着为一个进程预留时间片以 运行 与其他进程并发同样的cpu。 你可以限制一个进程——给它更少的时间片——如果它使用太多cpu。发生这种情况然后达到(硬)限制。如果 cpu 请求超过节点上的可用 cpu 资源,您可以将 pod 安排到不同的节点。 因此,请求是 kubernetes 调度程序如何最佳地跨节点放置 pods 的提示,而限制是内核调度程序确保不会实际使用更多资源。 实际上,如果您只是配置请求而没有限制,所有 pods 都将由内核调度程序策略进行调度,该策略试图公平并平衡所有进程之间的资源以最大化使用率,同时不会使任何单个进程挨饿。
最好把millicores看成分数的一种表达方式,x millicores对应分数x/1000(例如250 毫核 = 250/1000 = 1/4).
值 1 表示完全使用 1 个核心(如果启用了超线程或任何其他 SMT,则为硬件线程)。
所以 100mcpu 意味着进程使用单个 CPU 时间的 1/10。这意味着它使用 10 秒中的 1 秒,或 1 秒中的 100 毫秒或 100 秒中的 10us。
随便取一个时间单位,把它分成十份,只对其中一份运行ning
当然,如果间隔太短(比如 1us),调度程序的开销将变得不可忽略,但这并不重要。
如果该值大于 1,则进程正在使用多个 CPU。 2300mcpu 的值意味着在 10 秒内,进程 运行 宁... 23!
这用于表示该过程正在使用 2 个完整的 CPU 和三分之一的 3/10。
这听起来可能很奇怪,但这与说 "I work out 3.5 times a week" 意思是 "I work out 7 days every 2 weeks".
记住:毫核代表 CPU 时间 的一小部分,而不是 CPU 数字。所以2300mcpu是单次CPU.
时间的230%我讨厌 Kubernetes 和 Docker 之类的技术,因为它们隐藏太多,让经验丰富的程序员感到困惑。
millicores 单位的基础是 Linux 调度程序的工作方式。它不会将时间划分为量子并为每个线程分配 CPU 一个量子,相反,它 运行 是一个线程,直到保持它 运行 是不公平的。所以一个线程可以 运行 持续可变的时间。
当前的 Linux 调度程序 named CFS 使用 等待时间 的概念。
每个线程都有一个等待时间,一个计数器在线程等待执行时每纳秒递增一次(但任何足够精细的时间单位都可以),线程正在执行的每纳秒递减一次。
然后线程按等待时间除以线程总数排序,等待时间最长的线程被挑选出来,运行直到它等待时间(现在正在减少)低于另一个线程的等待时间(然后将被安排).
因此,如果我们有一个核心(没有超线程或任何其他 SMT)和四个线程,比方说,一秒后,调度程序将为每个线程分配该秒的 1/4(250 毫秒)。
您可以说每个线程使用了 250 毫核。这意味着它平均使用 250/1000 = 1/4 的核心时间。 "core time" 可以是任意时间,只要它远大于调度程序挂钟。所以 250 毫核意味着每 4 分钟 1 分钟,或每 8 天 2 天。
当一个系统有多个 CPUs/cores 时,等待时间会相应调整。
现在,如果一个线程在 1 秒的过程中被调度到整个秒的两个 CPU,我们对第一个 CPU 使用 1/1,对第二个使用 1/1一。总共 1/1 + 1/1 = 2 或 2000mcpu.
这种计算CPU次的方式,虽然一开始很奇怪,但它的优势在于它是绝对的。 100mcpu就是1/10的CPU,不管有多少CPU,这是设计使然
如果我们以相对的方式计算时间(即值 1 表示所有 CPUs),那么像 0.5 这样的值在 48 CPUs 系统中表示 24 CPUs 而 4在 8 CPUs 系统中。
很难比较时间。
Linux 调度程序实际上并不知道 毫核 ,因为我们已经看到它使用 等待时间 并且不需要任何其他测量单位。
到目前为止,毫核 单位只是我们为了方便起见而编造的一个单位。
然而,由于容器的约束方式,这个单元会自然出现。
顾名思义,Linux 调度程序是公平的:所有线程都是平等的。但是您并不总是希望如此,容器中的进程不应占用机器上的所有内核。
这就是 cgroups 发挥作用的地方。它是一个内核功能,与名称空间和联合 fs 一起用于实现容器。
它的主要目标是限制进程,包括它们的 CPU 带宽。
This is done with two parameters, a period and a quota.
调度程序允许受限线程 运行 每 quota 微秒 (us) 每 period us.
同样,这里的 quota 大于 period 意味着使用多个 CPU。引用内核文档:
Limit a group to 1 CPU worth of runtime. If period is 250ms and quota is also 250ms, the group will get 1 CPU worth of runtime every 250ms.
Limit a group to 2 CPUs worth of runtime on a multi-CPU machine. With 500ms period and 1000ms quota, the group can get 2 CPUs worth of runtime every 500ms.
我们了解如何在给定 x 毫核的情况下计算配额和周期。
我们可以将周期固定为 100 毫秒,将配额固定为 (100 * x) / 1000。
Docker does it.
就是这样
当然,我们有无限的对选择,我们将周期设置为 100 毫秒,但实际上我们可以使用任何值(实际上,没有无限的值,但仍然)。
较大的周期值意味着线程可以 运行 更长的时间,但也会暂停更长的时间。
这里是 Docker 对程序员隐藏东西的地方,使用任意值作为周期来计算配额(给定 毫核 ,作者将其称为更多 "user-friendly").
Kubernetes is designed around Docker(是的,它可以使用其他容器管理器,但它们必须公开一个类似于 Docker 的接口),而 Kubernetes millicores 单位匹配 Docker 在其 --cpus
参数中使用的单位。
所以,长话短说,毫核是单个CPU的时间的分数(不是CPU 的数量)。
Cgroups,因此 Docker,因此 Kubernetes,不会通过将内核分配给进程(就像 VM 那样)来限制 CPU 使用,而是限制 CPU 通过限制时间量(一段时间内的配额)使用该进程可以在每个 CPU 上 运行(每个 CPU 占用最多 1000mcpus 的允许时间)。