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 楼
您必须查看每个插槽的插槽和核心。在这种情况下,您有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
评论
我对所有用户的简单命令:$ grep precessor / proc / cpuinfo | wc -l <br />您的文字图像不是很有帮助。它不能被复制到编辑器中,并且不能很好地建立索引,这意味着具有相同问题的其他用户不太可能在这里找到答案。请编辑您的帖子以直接包含相关文本(最好使用copy + paste以避免转录错误)。
@สมหวังแนวหน้า有点像nitpick,但是grep arg应该是处理器,而不是前任,对吗? 。感谢您的帮助!