Kubernetes进阶之NT技术小解

<<Kubernetes进阶>>系列将kubernetes系统的设计理念进行深入梳理与分享。
在这篇文章中我会主要介绍CPU相关的一些重要概念和技术,以此作为后续对于kubelet组件相关分析的铺垫。


1、引言

中央处理器(Central processing unit)

在我们了解其它概念之前,我们应该首先了解一下什么是CPU,它是做什么的,它的主要组件以及相应的作用都是什么?
简单点说,CPU其实就是计算机内部的一个电子电路。根据一些具体的指令它可以执行基本的运算,逻辑,控制和IO操作等。
CPU的主要组件包括:

  • 算术逻辑单元(ALU is short for ‘arithmetic logic unit’),它主要执行一些算术和逻辑操作
  • 处理器寄存器(processor registers),它主要的作用是给ALU提供操作数并存储ALU操作的结果
  • 控制器(control unit),通过协调ALU,寄存器和其它组件之间的操作,从主存中取得并执行相应的指令。

当今大多数地CPU都是微处理器,即它们被包含在单个集成电路芯片(integrated circuit chip)中。一个包含CPU的集成电路可能也包含内存,
外围接口和其它的一些计算机组件。这样的集成设备叫做微控制器(microcontrollers)或者芯片上的系统(SoC)。一些计算机采用多核处理器,
即单个芯片中包含2个或更多的CPU(也被叫做“cores”); 在这种情况下,单个芯片有时也被称作”sockets”.

下图表示的是CPU与主存和IO之间的交互。

CPU与主存和IO之间的交互

多个CPU

贯穿这个数字计算机的历史,我们一直以来的目标就是想要计算机可以做更多的事情,并且做的更快。因此在hyper-threading 和 multi-core CPUs
出现之前,人们想到通过增加CPU的数量来增加计算机的计算机能力和速度,但是这样的方法并没有在个人PC中得到普及,我们只会在一些超级计算机或者一
些服务器上会看到这个多个CPU的计算机。因为多个CPU会需要主板有多个CPU socket - 多个CPU被插入到不同的socket中。同时主板也需要额外的硬件
去连接这些CPU socket到RAM和一些其它的资源。如果CPU之间需要彼此通信,多个CPU的系统会有很大地开销。

Hyper-Threading

由于多个CPU上面存在的缺点,因此它并没有进入普通大众的电脑中,因此消费者电脑的计算始终没有达到并行的状态,电脑的速度也一直没有加快。直到多核
处理器和Hyper-Threading技术的出现,才改变了这一点。Hyper-threading这个概念是Intel提出的,这家伟大的公司想把计算机并行计算的能力带入到
个人PC中,它第一次进入大众PC的产品是2002年的Pentium 4 HT,最初的这款处理器仅有单个CPU核心,因此它一次只能做一件事情。但是Hyper-threading
技术的出现弥补了这个不足。

Hyperthreading 有时叫做 simultaneous multi-threading,它可以使我们的单核CPU执行多个控制流程。这个技术会涉及到备份一些CPU硬件的一些信息,
比如程序计数器和寄存器文件等,而对于比如执行浮点运算的单元它只有一个备份,可以被共享。一个传统的处理器在线程之间切换大约需要20000时钟周期,而一个
具有Hyperthreading技术的处理器只需要1个时钟周期,因此这大大减小了线程之间切换的成本。hyperthreading技术的关键点就是:当我们在处理器中执行代
码时,很多时候处理器并不会使用到全部的计算能力,部分计算能力会处于空闲状态,而hyperthreading技术会更大程度地“压榨”处理器。举个例子,如果一个线
程必须要等到一些数据加载到缓存中以后才能继续执行,此时CPU可以切换到另一个线程去执行,而不用去处于空闲状态,等待当前线程的IO执行完毕。

Hyper-threading 使操作系统认为处理器的核心数是实际核心数的2倍,因此如果有4个核心的处理器,操作系统会认为处理器有8个核心。这项技术通常会对程序
有一个性能的提升,通常提升的范围大约在15%-30%之间,对于一些程序来说它的性能甚至会小于20%, 其实性能是否提升这完全取决于具体的程序。比如,这2个逻
辑核心都需要用到处理器的同一个组件,那么一个线程必须要等待。因此,Hyper-threading只是一种“欺骗”手段,对于一些程序来说,它可以更有效地利用CPU的
计算能力,但是它的性能远没有真正有2个核心的处理器性能好,因此它不能替代真正有2个核心的处理器。但是同样都是2核的处理器,一个有hyper-threading技
术而另一个没有,那么有这项技术的处理器在大部分情况下都要比没有的好。

多核CPU

相比于多个处理器而言,多核处理器把多个CPU(核心)集成到单个集成电路芯片(integrated circuit chip)中,因此主板的单个socket也可以适应这样的
CPU,不需要去更更改一些硬件结构。一个双核的CPU有2个中央处理单元,因此不像上面我介绍的hyper-threading技术那样,操作系统看到的只是一种假象,这
回操作系统看到的是真正的2个核心,所以2个不同的进程可以分别在不同的核心中同时执行,这大大加快了系统的速度。由于2个核心都在一个芯片上,因此它们之间
的通信也要更快,系统也会有更小地延迟。

下图展示了一个Intel Core i7处理器的一个组织结构,这个微处理器芯片中有4个CPU核,每个核中都有它自己的L1和L2缓存。

Intel Core i7处理器的一个组织结构


超线程技术

简介

在操作系统中,有多线程(multi-threading)的概念,这很好理解,因为线程是进程最小的调度单位,一个进程至少包含一个线程。本文将介绍CPU特有的超线程
技术。简单来说就是,多线程比较软,超线程比较硬,二者本质上都是虚拟化。

超线程(hyper-threading)其实就是同时多线程(simultaneous multi-theading),是一项允许一个CPU执行多个控制流的技术。它的原理很简单,就是把一
颗CPU当成两颗来用,将一颗具有超线程功能的物理CPU变成两颗逻辑CPU,而逻辑CPU对操作系统来说,跟物理CPU并没有什么区别。因此,操作系统会把工作线程分
派给这两颗(逻辑)CPU上去执行,让(多个或单个)应用程序的多个线程,能够同时在同一颗CPU上被执行。注意:两颗逻辑CPU共享单颗物理CPU的所有执行资源。
因此,我们可以认为,超线程技术就是对CPU的虚拟化。

超线程技术是同时多线程技术的一种实现形式,由Intel公司提出,而该技术背后的概念则是Sun公司的专利。Sun公司虽然倒下了,但它永远是一个伟大的公司。

纵观计算机的历史,有两个需求是驱动计算机科技进步的持续动力。
第一,人类想让计算机做得更多;
第二,人类想让计算机跑得更快。
从这个意义上讲,那些把工程师当做机器的资本家或资本家豢养的打手在榨取程序员的剩余价值的时候,就是不断地追求上述两个需求。超线程技术的发明,就是基于
这样的考虑,不榨干处理器的最后一滴油决不罢休。

CPU

常规的CPU需要大约两万个时钟周期做不同线程间的切换,而超线程的CPU可以在单个时钟周期的基础上决定要执行哪一个线程。这使得CPU能够更好地利用它的处理
资源。例如:假设一个线程必须等到某些数据被装入到cache中,那么CPU就可以继续去执行另一个线程。

NT

超线程允许单个处理器在同一时刻并行地抓取和执行两个独立的代码流。那么超线程是如何工作的?见下图。

nt工作

实现

实现超线程技术的前提:

  • 需要CPU支持
  • 需要主板芯片组支持
  • 需要BIOS支持
  • 需要操作系统支持
  • 需要应用软件支持

由此可见,超线程技术虽然很酷,但需要方方面面的支持,否则就玩不转。 类似地,如果想最大可能地榨取程序员的剩余价值的话,给程序员提供实现超线程运行的软
硬件环境也是必须地,否则一味地让他们拼体力(加班)实在不是个好办法,因为人毕竟不是机器,人只有需要休息好了才可能有创造力,疲惫的人们大多时候是在瞎折
腾,往往事倍功半。

超线程(hyper-threading)本质上就是CPU支持的同时多线程(simultaneous multi-threading)技术,简单理解就是对CPU的虚拟化,一颗物理CPU可以被操
作系统当做多颗CPU来使用。


后续

后续将介绍1.18版本后的kubelet关于CPU的管理技术方案。


参考资料