如何知道Linux系统的核心数?

Mr *_*are 292 linux cpu

我想知道我的系统有多少个内核,所以我在谷歌搜索了同样的问题。我得到了一些命令,例如lscpu命令。当我尝试这个命令时,它给了我以下结果:

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               1998.000
BogoMIPS:              5302.48
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              2048K
NUMA node0 CPU(s):     0-3
Run Code Online (Sandbox Code Playgroud)

特别是,此输出显示:

  • CPU:4
  • 每个插槽的核心数:4
  • CPU系列:6

其中哪些表示 Linux 系统的核心?

有没有其他命令可以告诉核心数,还是我认为它完全错误?

hta*_*ess 294

要获得完整的图片,您需要查看每个内核的线程数、每个插槽的内核数和sockets。如果将这些数字相乘,您将得到系统上的CPU数量。

CPU = 每核心线程数 X 每插槽核心数 X 插槽

CPU 是您在运行时所看到的htop(这些不等同于物理 CPU)。

这是来自台式机的示例:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                8
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
Run Code Online (Sandbox Code Playgroud)

和一个服务器:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                32
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2
Run Code Online (Sandbox Code Playgroud)

的输出nproc对应于来自 的 CPU 计数lscpu。对于上面的台式机,这应该与以下报告的 8 个 CPU 匹配lscpu

$ nproc --all
8
Run Code Online (Sandbox Code Playgroud)

的输出/proc/cpuinfo应该与此信息匹配,例如在上面的桌面系统上我们可以看到有 8 个处理器 (CPU) 和 4 个内核(内核 ID 0-3):

$ grep -E 'processor|core id' /proc/cpuinfo
processor   : 0
core id     : 0
processor   : 1
core id     : 0
processor   : 2
core id     : 1
processor   : 3
core id     : 1
processor   : 4
core id     : 2
processor   : 5
core id     : 2
processor   : 6
core id     : 3
processor   : 7
core id     : 3
Run Code Online (Sandbox Code Playgroud)

cpu cores报告由/proc/cpuinfo对应于Core(s) per socket所报告lscpu。对于上面的台式机,这应该与 lscpu 报告的每个套接字的 4 个核心相匹配:

$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores   : 4
Run Code Online (Sandbox Code Playgroud)

为了具体回答您的问题,您可以通过将每个插槽拥有的内核数乘以您拥有的插槽数来告诉您拥有多少个内核。

核心数 = 每个插槽的核心数 X 插槽数

对于上面的示例系统,桌面有 4 个核心:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4
Run Code Online (Sandbox Code Playgroud)

虽然服务器有 16 个:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16
Run Code Online (Sandbox Code Playgroud)

另一个有用的实用程序是dmidecode输出每个套接字信息。在上面列出的服务器系统的情况下,我们预计每个插槽有 8 个内核,每个插槽有 16 个线程:

$ sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
    Socket Designation: CPU1
    Core Count: 8
    Thread Count: 16
    Socket Designation: CPU2
    Core Count: 8
    Thread Count: 16
Run Code Online (Sandbox Code Playgroud)

lscpu命令有许多您可能想查看的有用选项,例如:

$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'
Run Code Online (Sandbox Code Playgroud)

详情请参阅man lscpu

总之:

  • 您需要了解套接字、内核和线程
  • 你需要小心 CPU 这个词,因为它在不同的上下文中意味着不同的东西


use*_*360 143

您必须查看每个插槽的插槽和内核。在这种情况下,您有 1 个物理 CPU(插槽),它有 4 个内核(每个插槽的内核)。

  • 如果您有超线程,则不会。您仍然有 2 个物理内核,但每个内核在 /proc/cpuinfo 中显示两次。如果仔细查看 coreid 下,您会发现每个 coreid 都列出了两次。同样在标志下,您可以看到 ht 标志。 (17认同)
  • 我有一个套接字,每个套接字有两个 CPU,所以这意味着总共有 2 个。但是,它说 4 个 CPU。如果我尝试 `nproc`,我会得到 4 回。使用 `cat /proc/cpuinfo` 我得到 4,因此这个答案似乎是错误的,至少就我的情况而言。 (2认同)

Ant*_*ich 68

您可以通过nproc(1)命令获取此信息

$ nproc --all
12
Run Code Online (Sandbox Code Playgroud)

它不需要 root 权限。

  • 这是不正确的,nproc 的输出对应于来自 lscpu 的 CPU 计数。如果您有多线程内核,那么 nproc 的输出将与您拥有的内核数不匹配。 (13认同)
  • 对于非 root 解决方案,黑客将使用 top 并点击 1。这将显示 _available_ 核心的数量。为什么我看到“可用”是因为底层硬件可能有更多的内核,比如云基础设施。 (3认同)
  • @htaccess 好的,我明白了。通常,当 Linux 傻瓜询问有多少个核心时,他们的意思是有多少个逻辑线程可用。从技术上讲,Linux 将硬件线程称为“CPU”是错误的。您的机器有 1 个带 2 个内核的 CPU 和 4 个 SMT 硬件线程。因此,CPU 和内核的含义存在很大的歧义。但我现在明白你的意思了,蒂。 (2认同)
  • @Wil 是的,我在上面的回答中提到了这一点:“您需要小心 CPU 一词,因为它在不同的上下文中意味着不同的事物”。我个人并不将“核心”等同于逻辑处理单元,而是等同于处理器中的物理核心(即物理处理单元)。 (2认同)

sto*_*tic 34

为了让答案不会令人困惑,您需要了解几个简单的计算机体系结构概念:

  • 您在 linux 系统上运行进程(“程序”)。每个进程由一个或多个线程组成
  • 每个线程都是一个单独的指令序列。两个线程可以并行执行。
  • 每条指令都交给一个CPU来执行。CPU 具有计算指令位的含义并决定如何处理它的逻辑。
  • 有不同类型的指令。CPU 内部的决策逻辑会将不同的指令分派到不同的硬件单元。例如,算术指令实际上由ALU(算术/逻辑单元)执行,而从内存加载/存储的指令则由某种内存单元执行

  • 一个核心是指一组实际的执行硬件(即每个核心都有一个 ALU、一个内存单元等......)

  • 您可以拥有共享一个内核的多个 CPU - 这称为超线程。

    • 这个想法:线程 A 当前正在执行算术,而线程 B 正在从内存中加载一些东西。如果这是真的,线程 A 和 B 可以有效地共享一个内核而不会相互妨碍(A 使用 ALU,B 使用内存单元)。当然,有时两个程序都需要ALU,然后他们不得不互相等待......
  • 插座是到其中的芯片被插入主板上的物理时隙。该芯片上有一定数量的内核。

例子:

OP的例子:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
Run Code Online (Sandbox Code Playgroud)
  • 一个物理插槽,其中包含一个带有
  • 4 个物理内核(想想总共 4 个 ALU 和 4 个内存单元)
  • 只有 1 个线程可以向内核发出指令(没有超线程),这意味着有
  • 每个内核 1 个 CPU,或 4 * 1 = 4 个 CPU

另一个例子:

CPU(s):                16
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             2
Run Code Online (Sandbox Code Playgroud)

两个物理插槽,每个插槽包含一个具有 4 个物理内核的芯片,总共 8 个内核。两个线程向每个内核发出指令(这台机器有超线程),这意味着每个内核必须有两个 CPU,总共 8 * 2 = 16 个 CPU

第一台机器可以在任何给定的时间、周期内精确地执行四条指令。第二台机器可以在任何给定时间执行 8 到 16 条指令:只有当每对 CPU 执行不同类型的指令时才能实现 16 条指令,因此可以共享一个内核而无需等待。

  • 唯一的东西;您使用“CPU”作为内核的虚拟 CPU;“通常”一个 CPU 有多个内核。没有错只是混淆我想说。 (2认同)

dr_*_*dr_ 16

您还可以使用该命令cat /proc/cpuinfo为每个核心输出一个数据块。每个块都以以下信息开头:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)
Run Code Online (Sandbox Code Playgroud)

内核从 0 开始编号,因此如果最后一个块processor : 3如本例所示,则您的机器有 4 个内核。


L.R*_*.R. 8

getconf _NPROCESSORS_ONLN
Run Code Online (Sandbox Code Playgroud)

(getconf 是 glibc 的一部分)


小智 5

$ grep -c processor /proc/cpuinfo
8
Run Code Online (Sandbox Code Playgroud)

这就是你所需要的。它是在线核心数,无论超线程是打开还是关闭。

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8
Run Code Online (Sandbox Code Playgroud)

另一个简单的方法。

  • 这很简单,但我不确定它对问题是否准确。他询问内核数:(cores != cpus) 如果启用了超线程。我的系统有 24 个内核:超线程时为 48 个 CPU。另外,使用提供的第二个命令`ls -d /sys/devices/system/cpu/cpu* | wc -l` 显示 **49** 因为在 `cpuN` 目录中有一个目录 `cpuidle`。 (4认同)