我对我的服务器拥有的 CPU 数量有点困惑。
它正在运行Intel(R) Xeon(R) Gold 6242R CPU @ 3.10GHz
,根据英特尔官方文档,它包含 20 个物理内核。
这里的问题是lscpu
命令的输出(过滤了一些行):
CPU(s): 80
On-line CPU(s) list: 0-79
Thread(s) per core: 2
Core(s) per socket: 20
Socket(s): 2
NUMA node(s): 2
Model name: Intel(R) Xeon(R) Gold 6242R CPU @ 3.10GHz
NUMA node0 CPU(s): 0-19,40-59
NUMA node1 CPU(s): 20-39,60-79
据我了解actual physical cores = CPU(s) / thread(s) per core
,但后来我得到了 40,这是我预期的两倍。
有人可以解释一下这里发生了什么以及究竟是什么CPU(s), thread(s) per core, core(s) per socket, socet(s)
意思吗?
Sockets
表示系统中有多少物理 CPU。Cores per socket
是每个物理 CPU 有多少完整的 CPU 内核(包括加载/解码逻辑)。Threads per core
是可以在单个内核上调度多少个线程(超线程)。简单地说,在实际执行代码之前使用的 CPU 中的硬件增加了一倍,允许 CPU 准备好执行多个不同的任务。它允许 CPU 在指令到达 CPU 的执行核心之前获取/解码指令。它可以防止或减少管道停顿。CPU
表示“可调度实体”,这是操作系统将有多少个运行队列,所以这将是sockets x cores per socket x threads per core
在您的情况下,您有 2 个物理 CPU,每个 CPU 有 20 个内核,每个内核可以运行 2 个线程(超线程)。所以
2x20x2 = 80
,这是CPUs
显示的数量。混乱来自一个非常简单的细节,可能从 info
lscpu
命令向您显示的内容中不清楚。问题是:您的服务器实际上有 2
Intel(R) Xeon(R) Gold 6242R CPU
秒,这Socket(s)
在行中提到。正如英特尔文档所述,这些 CPU 中的每一个都包含 20 个物理内核(这
Core(s) per socket
条线),总共有 40 个物理内核。这些内核中的每一个都能够“同时”运行 2 个线程(这
Thread(s) per core
条线)。所以:2 个 Intel Xeon,每个 20 个物理内核,每个内核 2 个线程,总共有 80 个“可以执行进程的单元”或“CPU”
CPU 的概念现在有点抽象,这始于超线程(90 年代后期),然后是 Intel Core(00 年代初期)系列。在此之前,您肯定拥有多 CPU 系统,但它们都是多物理 CPU。
但是对于超线程和多核单 CPU,CPU 的物理 # 与 CPU 上运行的代码看到的 CPU 的逻辑 # 不同。
您有 2 个物理 CPU,如“将散热器插入主板的东西”
每个物理 CPU 有 20 个内核,它们看起来和大部分工作起来就像 Linux 的独立 CPU。内核至少共享相同的 L3 缓存,可能是 L2 缓存,并且可能具有自己的 L1 缓存 - 因此不如具有自己的 L3/L2/L1 的单个套接字那么性能,但几乎在那里。
由于这是每个套接字,因此您有 2 * 20 = 40。
每个内核都有 2 个 SMT 线程,这些线程由 CPU 的微架构实现,基本上看起来就像 Linux 的独立 CPU
它们不会像真正的独立内核那样快。
微架构上的线程试图从内核中获取当前未使用的流水线阶段,但如果忙碌则可能最终不得不等待——而且 CPU 已经尝试让自己非常忙碌,因此 2 个内核上的 2 个线程也远不等于 4 个内核,但是它可以使代码运行得更快一些。
请注意,由于核心资源是共享的,因此跨线程的 Spectre 和类似漏洞比核心或套接字更有可能发生。
无论如何,因为这是每个内核和每个插槽,所以是 2 * 20 * 2,它给你:
双 CPU…处理器 x2,每个插槽 20 个内核…x2 = 40 个内核 = 80 个,带 HT。
这可能很容易通过简单地取下盖子/侧面来验证。
您的服务器正在使用 2 个“处理器芯片”(在 2 个插槽上),每个都有 20 个物理内核。
每个核心可以处理2个线程。
这就是为什么它显示 2(处理器芯片)* 20(每个部分的核心数)* 2(每个核心可以处理的线程)= 80 个 CPU
在这种情况下,CPU 代表“可调度实体”,又名。机器可以运行的线程数量。
您有 2 个插槽,每个插槽都装有一个处理器,每个处理器 20 个内核,每个内核 2 个线程。
2 x 20 x 2 = 80 CPUs
我认为80 个 CPU用词不当,只是历史的副产品,因为过去只有单核/线程处理器存在,因此处理器、CPU、内核和线程都可以互换使用。