Kubernetes中的Millicore多线程 [英] Multi threading with Millicores in Kubernetes

查看:14
本文介绍了Kubernetes中的Millicore多线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Kubernetes中的毫克矿石的概念感到困惑。根据我的编程知识,每个内核只能运行一个线程,所以为什么要给出以毫秒为单位的限制? 例如,如果我给一个容器设置600M的CPU限制,我可以为另一个Pod或容器使用400M吗,这可能吗? 我试着安装了迷你立方,并在上面运行。 容器或Pod会运行不同的线程吗?请大家解释一下。

推荐答案

最好将毫克雷视为表示分数的一种方式,x毫克雷对应于分数x/1000(例如,250毫克雷=250/1000=1/4)。
值1表示1核(或硬件线程,如果启用了超线程或任何其他SMT)的完整使用。

因此,100mcpu意味着进程使用的是单个CPU时间的十分之一。这意味着它使用的是10秒中的1秒,或1秒中的100毫秒或100微秒中的10微秒。
只需取任何时间单位,将其分为十个部分,流程仅为其中一个部分运行。
当然,如果间隔太短(比方说1U),调度程序的开销将变得不可忽略,但这并不重要。

如果该值大于1,则该进程正在使用多个CPU。值2300mcPU意味着,比如说,在10秒内,进程正在运行……23!
这表示该进程正在使用两个完整的CPU和第三个CPU的3/10。
这听起来可能有些奇怪,但这和说:"我一周锻炼3.5次"意思是"我每两周锻炼7天"没什么不同。

记住:毫级存储表示CPU时间的部分,而不是CPU编号的部分。因此,2300mcpu的时间是单CPU的230%。


我讨厌Kubernetes和Docker这样的技术,因为它们隐藏得太多,让经验丰富的程序员感到困惑。

毫微库单元在其基础上源于Linux调度程序的工作方式。它不把时间分成量程,并为每个线程分配一个量程的CPU,相反,它会运行一个线程,直到不公平地让它继续运行。因此,线程可以在不同的时间运行。

当前的Linux调度程序named CFS使用等待时间的概念。
每个线程都有一个等待时间,即线程正在等待执行的每纳秒(但任何足够细的时间单位都可以)递增的计数器,以及线程正在执行的每纳秒递减的计数器。
然后按线程的等待时间除以线程总数对线程进行排序,选择等待时间最长的线程并运行,直到其等待时间(现在正在减少)低于另一个线程的等待时间(然后将对其进行调度)
因此,如果我们有一个核心(没有超线程或任何其他SMT)和四个线程,比方说一秒钟后,调度程序将为每个线程分配该秒的四分之一(250ms)。
可以说每个线程使用了250毫升的内存。这意味着它平均使用250/1000=1/4的核心时间。"核心时间"可以是任何数量的时间,假设它远远大于调度器挂钟。因此,250毫克意味着每4分钟,或每8天2天。

当系统具有多个CPU/核心时,会调整等待时间以解决这一问题。 现在,如果在1秒内将一个线程调度到两个CPU,那么第一个CPU的使用率为1/1,第二个CPU的使用率为1/1。总计1/1+1/1=2或2000mcpu.
这种计算CPU时间的方法,虽然一开始很奇怪,但好处是它是绝对的。100mcpu意味着一个CPU的1/10,无论有多少个CPU,这都是设计出来的。
如果我们按相对值计算时间(即,值1表示所有CPU),则类似0.5的值将表示48个CPU系统中有24个CPU,8个CPU系统中有4个CPU。
很难比较时间。

Linux计划程序实际上并不知道毫级存储,正如我们所见,它使用等待时间,并且不需要任何其他度量单位。
到目前为止,毫升单位只是我们为方便起见而拼凑的单位。
然而,它将证明这个单位将自然产生,因为容器是如何约束的。

顾名思义,Linux调度程序是公平的:所有线程都是平等的。但您并不总是希望这样,容器中的进程不应该独占一台计算机上的所有内核。
这就是cgroup发挥作用的地方。它是一个内核功能,与命名空间和联合文件系统一起用于实现容器。
其主要目标是限制进程,包括其CPU带宽。

This is done with two parameters, a period and a quota
计划程序允许受限线程在每个周期运行配额微秒。
这里,同样,配额大于时段表示使用多个CPU。引用内核文档:

  1. 将一个组的运行时间限制为1个CPU。 如果周期为250ms,配额也为250ms,则群组将获得 每250ms占用1个CPU的运行时间。

    /li>
  2. 在多CPU计算机上,将一个组的运行时间限制为2个CPU。 500ms周期和1000ms配额,该组可以获得价值2个CPU的 每500毫秒运行一次。

我们了解如何在给定x毫库的情况下计算配额和期间。
我们可以将周期固定为100ms,配额设置为(100*x)/1000。
这就是Docker does it
当然,我们有无限多的配对选择,我们将周期设置为100ms,但实际上我们可以使用任何值(实际上,没有无穷大的值,但仍然)。
周期值越大,意味着线程可以运行更长时间,但也会暂停更长时间。
这就是Docker对程序员隐藏东西的地方,它使用一个周期的任意值来计算配额(给定毫米级,作者将其称为更"用户友好")。

Kubernetes is designed around Docker(可以使用其他容器管理器,但必须公开一个类似于Docker的接口),KubernetesMillicore单元与Docker的--cpus参数中使用的单元匹配。


所以,长话短说,毫级存储是单个CPU的时间的分数(而不是CPU数量的分数)。
Cgroup以及Docker和Kubernetes不会通过将核心分配给进程来限制CPU使用量(与VM一样),而是通过限制进程可以在每个CPU上运行的时间量(期间配额)来限制CPU使用量(每个CPU最多占用1000mcpus的允许时间)。

这篇关于Kubernetes中的Millicore多线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆