我想找出系统中有多少个内核,因此我在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系统的内核吗?

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

评论

我对所有用户的简单命令:$ grep precessor / proc / cpuinfo | wc -l <​​br />
您的文字图像不是很有帮助。它不能被复制到编辑器中,并且不能很好地建立索引,这意味着具有相同问题的其他用户不太可能在这里找到答案。请编辑您的帖子以直接包含相关文本(最好使用copy + paste以避免转录错误)。

@สมหวังแนวหน้า有点像nitpick,但是grep arg应该是处理器,而不是前任,对吗? 。感谢您的帮助!

#1 楼

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

评论


我有一个插槽,每个插槽两个cpus,所以总共有2个。但是,它说是4 cpus。如果我尝试nproc我得到4回来。使用cat / proc / cpuinfo我得到4,因此看来这个答案是错误的,至少对于我而言。

– SPRBRN
16年5月18日在13:05

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

–user1403360
16年5月19日在14:01

那么在这种情况下,CPU:4指的是什么?

–无知的流浪者
20年5月2日在16:23



CPU是逻辑CPU的数量。如果cpu启用了超线程,则此数字高于实际内核数。

–user1403360
20年5月4日在6:59

#2 楼

为了获得完整的图像,您需要查看每个内核的线程数,每个套接字和套接字的内核数。如果将这些数字相乘,您将获得系统上的CPU数量。


CPU =每个内核X插槽的每个内核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


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

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


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

cpu cores。对于上面的台式机,这应该与lscpu报告的每个插槽的4个内核相匹配:将每个插槽的核心数乘以您拥有的插槽数。


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


台式机上方的示例系统具有4个核心:

$ nproc --all
8


服务器具有16个内核:

$ 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


另一个/proc/cpuinfo是有用的实用程序,它输出每个套接字信息。对于上面列出的服务器系统,我们希望每个插槽看到8个内核,每个插槽看到16个线程:

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

您可能想签出,例如:

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


有关详细信息,请参见Core(s) per socket

摘要:


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


评论


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

–PickBoy
17年1月5日,下午4:51



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

–htaccess
19年5月17日,1:13

您还可以避免awk和显式乘法:lscpu --all --parse = CORE,SOCKET | grep -Ev“ ^#” |排序-u | wc -l

–雅库布·克林科夫斯基
19年7月5日在7:35

@JakubKlinkovský,感谢您指出这一点,但在这种情况下,我想实际演示每个套接字的Socket * Core的乘法。给定我刚才说的话,我估计echo Cores = $(($(lscpu | awk'/ ^ Socket \(s \)/ {print $ 2}')* $(lscpu | awk'/ ^ Core \(s \)per socket / {print $ 4}')))会更好,这样人们就可以确切地看到正被乘的...

–htaccess
19年7月6日在1:36



#3 楼

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

$ nproc --all
12


它不需要root特权。

评论


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

–htaccess
16-4-27的4:21

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

–跳兔子
18年5月23日在2:13

@Wil问题询问“我的系统有多少个内核”而不是“在线逻辑CPU的数量”我的笔记本电脑有4个逻辑CPU,每个CPU有1个插槽,每个插槽2个核心,每个核心2个线程。它具有2个核心和4个CPU。

–htaccess
19年5月16日在23:28

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

–威尔
19年5月17日在20:26

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

–htaccess
19年5月17日在21:43

#4 楼

为了使答案不引起混淆,您需要了解几个简单的计算机体系结构概念:在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条指令,因此可以共享内核而无需等待。

评论


哇,谢谢,这是一个很好的解释!

–罗伯特
19-10-21在9:08

只有东西;您将“ CPU”用作内核的虚拟CPU; “通常” CPU具有多个内核。没错,只是我想说的令人困惑。

–user373503
19年11月22日在16:05

@rastafile :。这是你提出的一个有趣的观点。不同的人使用“ CPU”来表示不同的意思。我相信我在这里所说的与OP引用的lscpu命令的输出一致。根据我的经验,计算机工程师在说CPU时指的是您所说的核心,但是即使在那儿,我也可以肯定有人会不同意我。

–随机
19年11月22日在17:22

我现在有4个CPU。以前,我(通过BIOS)启用了超线程,它显示为8,从cpu0到cpu7。供应商在盒子上告诉我,我有一个“四核处理器”。令人困惑,因为我可以轻松地说我一次拥有一个“可以同时运行8个线程的CPU”(是的,具有超线程功能,因此相当于5或6个线程)。

–user373503
19年11月22日在17:39

是的,因此在超线程之前和之后,您都有四个核心。以前,您有8个CPU:8个可以接受要运行的指令的硬件(但只有4套完整的执行硬件)。通过关闭超线程,您禁用了其中一半的CPU(现在已禁用每个核心上的一个CPU)。您肯定是正确的,这有点令人困惑。

–随机
19年11月22日在18:10

#5 楼

您还可以使用命令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个内核。 br />

评论


感谢此命令详细描述了信息。:)

–阿夸尔先生
15年7月24日在8:31

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

–通配符
16年4月27日在5:51

与unix.stackexchange.com/a/248063/22812相似,如果没有一个内核具有多个并发执行线程,即没有为任何线程启用多线程(SMT,HTT),则此答案仅提供正确数量的内核的核心。在Linux系统上,/ proc / cpuinfo列出有关每个逻辑CPU的信息。

– Anthony Geoghegan
19年11月22日在12:33

#6 楼

getconf _NPROCESSORS_ONLN


(getconf是glibc的一部分)

评论


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

– Toby Speight
17年2月14日在13:34

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

–银河
19年4月17日在5:13

#7 楼

$ grep -c processor /proc/cpuinfo
8


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

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


另一种简便方法。

评论


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

–安德鲁·法兰加(Andrew Falanga)
18/12/20在15:54

#8 楼

[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


评论


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

– Xen2050
19 Mar 28 '19在18:23

@ Xen2050 4是处理器,请参阅linux.die.net/man/8/dmidecode。但是使用4作为参数是一个不好的做法。

–JohnKoch
19年7月10日在17:24

bash:dmidecode:找不到命令

– Cameron Hudson
19年7月23日在14:47

#9 楼

我发现是这样的:

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))


#10 楼

CPU系列在这里无关紧要。


CPU =物理插槽
每个插槽的内核-正如它所说的那样,所以内核总数= CPU (s)*每个插槽的核心数

在您的情况下,您总共有4个完整核心数。

同样重要的是,“核心”。但是您只有1,所以您的情况就没有。

评论


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

– jlliagre
15年12月8日在9:28

正如jlliagre所说,这是不正确的。核心数=每个插槽的核心数X插槽,请参阅我的回复中的描述。

–htaccess
16-4-27的4:13

#11 楼

找出以下CPU数量的简单方法是发出以下命令:

cat /proc/interrupts | egrep -i 'cpu'


评论


中断,还是cpuinfo?

– Jeff Schaller♦
17 Mar 23 '17 at 10:21

并加上-c选项?

– Jeff Schaller♦
17 Mar 23 '17 at 10:22