性能基础之 CPU、物理核、逻辑核概念与关系
引言
性能测试中当我们尝试使用 Linux 命令(如 nproc 或 lscpu )了解服务器 CPU 架构和性能参数时,我们经常发现我们无法正确解释其结果,因为我们混淆 CPU、物理核、逻辑核概念等术语。
基础概念
CPU(
Central Processing Unit
): 中央处理单元,CPU 不等于物理核,更不等于逻辑核。物理核(
physical core/processor
): 可以看的到的,真实的 cpu 核,有独立的电路元件以及 L1,L2 缓存,可以独立地执行指令。逻辑核(
logical core/processor
,LCPU): 在同一个物理核内,逻辑层面的核。(比喻,像动画片一样,我们看到的“动画”,其实是一帧一帧静态的画面,24 帧/s 连起来就骗过了人类的眼睛,看起来像动起来一样。逻辑核也一样,物理核通过高速运算,让应用程序以为有两个 cpu 在运算)。超线程(
Hyper-threading
, HT):超线程可以在一个逻辑核等待指令执行的间隔(等待从 cache 或内存中获取下一条指令),把时间片分配到另一个逻辑核。高速在这两个逻辑核之间切换,让应用程序感知不到这个间隔,误认为自己是独占了一个核。
关系: 一个 CPU 可以有多个物理核。如果开启了超线程,一个物理核可以分成 n 个逻辑核,n 为超线程的数量。
起源:单核 CPU 和超线程
在多核,虚拟或逻辑 cpu 之类的概念之前,在奔腾处理器时代,大多数计算机安装在他们的主板上的单个芯片相当大,我们称之为微处理器、处理器或简称 CPU。只有少数企业计算机或需要更多处理能力的大型服务器可以在同一块板上安装 2 个或更多这些芯片:它们是多处理器系统。这些芯片通过连接器或插槽与其他主板元件通信。计算很简单:这么多连接器或插槽有一主板,一台电脑最多只能有这么多 cpu。如果你想要更多的处理能力,你只需要寻找一个拥有更多处理器的板,或者等待它们的发展来提供更高的性能。
但随后英特尔意识到多处理器系统的不同处理器之间的通信效率非常低,因为它们必须通过系统总线完成,而系统总线通常以低得多的速度工作。这通常导致出现瓶颈,使得无法充分利用每个 CPU 提供的计算能力。
为了改善这种情况,开发了超线程技术(HT)。HT 是关于在相同的芯片中复制一些 CPU 内部组件,例如寄存器或一级缓存,以便在两个不同的执行线程之间共享信息,而不必通过具有相应瓶颈和速度损失问题的系统总线。这也允许如果一个进程必须等待中断,另一个进程可以继续使用 CPU 而不停止它。这样就有可能加快数个计算过程,并开始提供比传统处理器性能更好的处理器。操作系统被欺骗了,因为它被提供了两个虚拟或逻辑 cpu (LCPU),而不是单个 cpu,因为它被允许“同时”执行两个进程。但是值得注意的是,不可能产生传统处理器两倍的处理能力,也不可能提供完全的并行处理能力。因此,从 Linux 或其他操作系统的角度来看,一个只有一个核心处理器但 HT 的机器就像有两个 cpu 一样出现在我们眼前。但是这是在同一个物理 cpu 中运行的两个逻辑 cpu。
还有一个转折点:多核架构的出现
但正如在上一节所述,尽管具有超线程的 CPU 提供了更多的处理能力,但它们无法作为 2 个完整且独立的处理器运行,因此决定进一步小型化所有处理器组件并将它们封装在单个芯片中 。这些封装处理器中的每一个都称为核心,它允许通过共享相同芯片的内部总线实现它们之间更快的通信。从那一刻起,不再需要转向系统总线,速度要慢得多。
与 HT 技术不同,现在我们有多个完全独立的 CPU 用于所有意图和目的,每个核心一个。实际上,从性能的角度来看,拥有单个多核处理器比在同一块板上的同等数量的单核 CPU 更好。当然,拥有 2 个双核处理器仍然比单核处理器更好,但更好的是拥有一个四核处理器。
在操作系统级别,物理四核处理器将显示为 4 cpu 计算机。但这些将是 4 个逻辑 CPU 或非物理 LCPU。如果处理器另外提供超线程技术,那么诸如 top 之类的命令将指示系统中有 8 个 cpu,但是在没有超线程的情况下单个八核处理器性能高于 8 个 Lcpu。
1 LCPU = 1 个线程
最后,通常我们会发现具有 4 个线程的处理器,每个核心 2 个线程以及类似的东西。这只是可以同时运行的执行线程或处理作业的数量,这相当于 LCPU 提供的处理能力。如果处理器允许每个核 2 个线程,则意味着它是 HT 。否则,匹配线程的内核数量是正常的。
逻辑 CPU 与虚拟 CPU
虚拟 CPU 术语与逻辑 CPU 相当,但它增加了一定的细微差别:它在计算虚拟化方面更加框架化。它指的是从底层主机硬件映射到虚拟机的那些 cpus,可以是物理或逻辑 cpus,HT。通常,来自主机服务器的 1 个逻辑 cpu 映射到虚拟机内的 1 个虚拟 cpu,因此它们几乎是类似的术语。
如何知道 Linux 系统有多少核心和处理器?
查看 Linux 上存在的处理器数量的最简单和最短的方法,因为它是 coreutils 的一部分而被广泛扩展:
另一种获得相同结果的方法是 lscpu 命令,它也允许我们从处理器获取额外信息:
或者我们可以查询/proc filesystem
中的cpuinfo
文件:
/pro /cpuinfo
文件中有关于这些处理器的许多其他详细信息,包括 CPU 型号和内核数
如上,我们示例中的机器有 2 个处理器,每个处理器有 4 个核心。
由于HyperThreading
技术和其他处理器增强功能,我们可能需要区分物理 CPU 和逻辑 CPU:
我们也可以使用其他工具来获取硬件信息,比如 dmidecode,但是我们需要 root 权限:
如果运行上述命令,您会发现系统中存在多个 CPU 或多个内核,您还需要确保当前的 Linux 内核具有多处理器支持(SMP,Symmetric MultiProcessing):
最后,我们来看下查看 cpu 参数的命令
版权声明: 本文为 InfoQ 作者【zuozewei】的原创文章。
原文链接:【http://xie.infoq.cn/article/76cea3a5d50c230495f96b60e】。未经作者许可,禁止转载。
评论