我想知道我的系统有多少个内核,所以我在谷歌搜索了同样的问题。我得到了一些命令,例如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)
特别是,此输出显示:
其中哪些表示 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。
总之:
use*_*360 143
您必须查看每个插槽的插槽和内核。在这种情况下,您有 1 个物理 CPU(插槽),它有 4 个内核(每个插槽的内核)。
Ant*_*ich 68
您可以通过nproc(1)命令获取此信息
$ nproc --all
12
Run Code Online (Sandbox Code Playgroud)
它不需要 root 权限。
sto*_*tic 34
为了让答案不会令人困惑,您需要了解几个简单的计算机体系结构概念:
有不同类型的指令。CPU 内部的决策逻辑会将不同的指令分派到不同的硬件单元。例如,算术指令实际上由ALU(算术/逻辑单元)执行,而从内存加载/存储的指令则由某种内存单元执行。
一个核心是指一组实际的执行硬件(即每个核心都有一个 ALU、一个内存单元等......)
您可以拥有共享一个内核的多个 CPU - 这称为超线程。
甲插座是到其中的芯片被插入主板上的物理时隙。该芯片上有一定数量的内核。
OP的例子:
CPU(s): 4
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Run Code Online (Sandbox Code Playgroud)
另一个例子:
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 条指令,因此可以共享一个内核而无需等待。
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 个内核。
小智 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)
另一个简单的方法。