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


231

我想找出系统中有多少个内核,因此我在Google中搜索了相同的问题。我得到了一些命令,例如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

特别是,此输出显示:

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

哪一个指示Linux系统的核心?

是否还有其他命令可以告知内核数量,或者我是否认为这是完全错误的?


1
我对所有用户的简单命令:$ grep precessor / proc / cpuinfo | wc -l
แนแน้า2016年

6
您的文字图像不是很有帮助。它不能被复制到编辑器中,并且不能很好地建立索引,这意味着具有相同问题的其他用户不太可能在这里找到答案。请编辑您的帖子以直接包含相关文本(最好使用copy + paste以避免转录错误)。
Toby Speight

Answers:


117

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


1
我有一个插槽,每个插槽两个cpus,所以总共有2个。但是,它说是4 cpus。如果我尝试,nproc我会得到4分。使用cat /proc/cpuinfo我得到4,因此至少对于我的情况,这个答案似乎是错误的。
SPRBRN

14
如果您有超线程,则不会。您仍然有2个物理核心,但是每个核心在/ proc / cpuinfo中显示两次。如果您仔细查看coreid下的内容,可以看到每个coreid列出了两次。同样在标志下,您可以看到ht标志。
user1403360

237

为了获得完整的图像,您需要查看每个核心的线程数,每个套接字的核心数和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

和一台服务器:

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

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

$ nproc --all
8

的输出/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

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

$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores   : 4

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

芯数=每个插槽的芯数X插槽

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

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

服务器有16:

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

另一个有用的实用程序是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

lscpu命令具有许多您可能想检出的有用选项,例如:

$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'

有关man lscpu详细信息,请参见。

综上所述:

  • 您需要了解套接字,核心和线程
  • 您需要注意CPU一词,因为它在不同的上下文中意味着不同的事物

12
这应该是公认的答案
gansub

2
我同意。这应该是公认的答案,因为它可以更好地说明该主题。
拉斐尔

我认为添加lscpu --all --extended将是有用的添加,但是我不再可以访问这些特定的计算机。
htaccess

您还可以避免awk和显式乘法:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
JakubKlinkovský

@JakubKlinkovský,感谢您指出,但在这种情况下,我想实际演示的乘法Socket(s) * Core(s) per socket。鉴于我刚才所说的,我想echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))这样会更好,这样人们就可以确切地看到正在增加的内容……
htaccess

61

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

$ nproc --all
12

它不需要root特权。


10
这是不正确的,nproc的输出与lscpu中的CPU计数相对应。如果您拥有多线程核心,则nproc的输出将与您拥有的核心数量不匹配。
htaccess

2
对于非root用户的解决方案,可以使用top并单击1。这将显示可用内核的数量。我之所以看到“可用”的原因是,底层硬件可能具有更多的核心,例如云基础架构。
跳兔子

@htaccess至少在Ubuntu上,这会输出正确数量的在线逻辑CPU
Wil,

1
@htaccess好的,我明白了。通常,当一个Linux duffer询问有多少个内核时,它们意味着有多少个逻辑线程可用。从技术上讲,Linux将硬件线程称为“ cpus”是错误的。您的计算机具有1个CPU,2个内核和4个SMT硬件线程。结果,CPU和内核的含义存在很大的歧义。但是我明白你的意思了,ty。
威尔

1
@Wil是的,我在上面的回答中这样指出:“您需要注意CPU一词,因为它在不同的上下文中表示不同的意思”。就我个人而言,我并不将“核心”等同于逻辑处理单元,而是将其等同于处理器中的物理核心(即物理处理单元)。
htaccess

19

为了使答案不引起混淆,您需要了解几个简单的计算机体系结构概念:

  • 您可以在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
  • 一个物理插槽,其中包含一个带有
  • 4个物理核心(总共考虑4个ALU和4个存储单元)
  • 只有1个线程可以向内核发出指令(没有超线程),这意味着
  • 每个内核一个CPU,或4 * 1 = 4个CPU

另一个例子:

CPU(s):                16
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             2

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

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


14

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

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

核心从0开始编号,因此,如果最后一块这样表示processor : 3,则您的计算机具有4个核心。


感谢此命令详细描述了信息。:)
ASquare先生15年

对于单线命令,您可以使用grep -c ^processor /proc/cpuinfo
通配符

5
getconf _NPROCESSORS_ONLN

(getconf是glibc的一部分)


1
稍有不同(对某些需求有用)。这是现在在线的处理器数量(即可用于正在运行的进程)。如果一个或多个已脱机(例如,在休眠期间或添加/卸下处理器时),则可能少于CPU总数。
Toby Speight

getconf _NPROCESSORS_CONF获取配置的处理器数量。您也可以使用sysconf()函数在C源代码中获取这两个宏的值。输入以man sysconf获取更多信息。
银河

4
[root@xxxxx ~]#  dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
    Socket Designation: CPU1
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
    Socket Designation: CPU2
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12

t 4dmidecode的用途是什么?计数和启用的行如何相乘?您的示例显示2个内核,还是6、12、24,或其他数字?
Xen2050

@ Xen2050 4processor,请参阅linux.die.net/man/8/dmidecode。但是,将其4用作参数是不好的做法。
JohnKoch

bash: dmidecode: command not found
卡梅隆·哈德森

3
$ grep -c processor /proc/cpuinfo
8

这就是您所需要的。无论超线程是打开还是关闭,它都是核心联机数。

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8

另一个简单的方法。


2
这很简单,但是我不确定这个问题是否正确。他询问内核数量:(cores!= cpus)是否启用了超线程。我的系统具有24个内核:超线程时为48 cpus。另外,使用提供的第二条命令ls -d /sys/devices/system/cpu/cpu* | wc -l显示49,因为目录cpuidle中有cpuN目录。
安德鲁·法兰加


0

只想在@htaccess的答案中添加一些信息。

在CentOS 6.x中,dmidecode不会输出Core / Thread计数信息,它实际上将lCPU中的“ CPU”视为“ CPU”或“ Core”,而不是“ socket”。


如果这不是答案,则将其添加为注释。
Mongrel's

@Mongrel我想添加评论,但评论需要50声望
PickBoy

-2

CPU系列在这里无关紧要。

  • CPU =物理插槽
  • 每个插槽的核心数-如下所述
  • 因此内核总数 = CPU *每个插槽的内核

就您而言,您总共有4个完整核心。

同样重要的是“每个核心的线程”。但是您有1,所以您的情况不是。


1
您在描述中将CPU与Socket混淆了。
jlliagre

1
正如jlliagre所说,这是不正确的。Cores = Cores per socket X Sockets,请参阅我的回复中的说明。
htaccess

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.