我对我的服务器的 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)
意思吗?
答案1
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
。
答案2
混淆源自一个非常简单的细节,从信息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”
答案3
现在,CPU 的概念有点抽象,这始于超线程(90 年代末),然后是 Intel Core(00 年代初)系列。在此之前,您肯定有多 CPU 系统,但它们都是多物理 CPU。
但是对于超线程和多核单 CPU 来说,物理 CPU 数量与 CPU 上运行代码的逻辑 CPU 数量不同。
Socket(s): 2
你有 2 个物理 CPU,就像“主板上插着散热器的东西”
Core(s) per socket: 20
每个物理 CPU 有 20 个内核,在 Linux 上看起来和工作起来都像独立的 CPU。内核至少共享相同的 L3 缓存,可能共享 L2 缓存,并且可能有自己的 L1 缓存 - 因此性能不如具有自己的 L3/L2/L1 的独立插槽,但差不多。
由于这是每个插座,因此有 2 * 20 = 40。
Thread(s) per core: 2
每个核心有 2 个 SMT 线程,这些线程由 CPU 的微架构实现,在 Linux 上基本上看起来像是独立的 CPU
它们的速度不会像真正的独立核心那么快。
微架构上的线程尝试从核心中获取当前未使用的管道阶段,但如果繁忙则可能不得不等待 - 并且 CPU 已经试图使自己保持非常繁忙,因此 2 个核心上的 2 个线程远远不及 4 个核心,但它可以使代码运行得更快一些。
请注意,由于核心资源是共享的,因此 Spectre 和类似的漏洞在线程之间比在核心或套接字之间更有可能发生。
无论如何,因为这是每个核心,也是每个插槽,所以这是 2 * 20 * 2,这给你:
CPU(s): 80
答案4
您的服务器使用 2 个“处理器芯片”(在 2 个插槽上),每个芯片有 20 个物理核心。
并且每个核心可以处理2个线程。
这就是为什么它显示 2(处理器芯片)* 20(每个部件的核心)* 2(每个核心可以处理的线程)= 80 个 CPU
在这种情况下,CPU 代表“可调度实体”,又名机器可以运行的线程数量。