想通过lscpu命令的输出和/proc/cpuinfo中内容相互对照来解释相关信息。举例说明。
某台服务器lscpu命令的输出内容:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 24
On-line CPU(s) list: 0-23
Thread(s) per core: 2
Core(s) per socket: 6
CPU socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 62
Stepping: 4
CPU MHz: 2099.968
BogoMIPS: 4199.43
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 15360K
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23
它的/proc/cpuinfo中的相关信息摘要(按文件中CPU出现顺序排列):
processor: 0 1 2 ...... 23
physical id: 0 1 0 1 0 1 ...... 0 1
siblings: 12 12 12 ...... 12
core id: 0 0 1 1 2 2 3 3 4 4 5 5 0 0 1 1 2 2 3 3 4 4 5 5
cpu cores: 6 6 6 ....... 6
解释:
与上面的lscpu内容对照,可知cpu cores表示的是Core(s) per socket,是物理core,physical id表示的是每个物理core中线程的序号, siblings表示的是所有的物理cpu core的个数(6 cpu core/socket * 2 sockets),core id表示的是物理core在每个socket中的序号(每个socket有6个所以是0...5), processor表示的CPU的在总个数(也就是逻辑core的个数)中序号。如果每个CPU只有一个线程也就是说每个物理core对应一个逻辑core, 那么physical id总会是1。
修正2017-07-21:
关于physical id说错了,physical id实际上对应的是 NUMA node的序号,参看lscpu的输出中NUMA node项每个node包含的cpu(逻辑的)序号和cpuinfo文件中每个processor(也是逻辑的)的序号对应的physical id的关系,可以看出。一般每个Socket对应一个NUMA node,所以physical id也可以看作Socket的序号。
下面给出一个没有hyperthreading技术的CPU的例子(即每个CPU只有一个线程)。
lscpu命令输出内容:
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 62
Model name: Intel(R) Xeon(R) CPU E5-2609 v2 @ 2.50GHz
Stepping: 4
CPU MHz: 1244.824
BogoMIPS: 5006.18
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 10240K
NUMA node0 CPU(s): 0,2,4,6
NUMA node1 CPU(s): 1,3,5,7
然后cpuinfo文件中信息,
processor | physical id | siblings | core id | cpu cores |
0 | 0 | 4 | 0 | 4 |
1 | 1 | 4 | 0 | 4 |
2 | 0 | 4 | 1 | 4 |
3 | 1 | 4 | 1 | 4 |
4 | 0 | 4 | 2 | 4 |
5 | 1 | 4 | 2 | 4 |
6 | 0 | 4 | 3 | 4 |
7 | 1 | 4 | 3 | 4 |
从上面也可以看出, sliblings并不表示物理cpu core的数量,而是表示 Processors(or Threads) per Socket (=Cpu cores per Sockets * Thread(s) per core),简而言之就是每个Sockets中的逻辑cpu core的数量。所以使用/proc/cpuinfo中的信息,通过 siblings / cpu cores 可以算出每个物理cpu core有多少个线程。
使用physical id:core id 才能标识一个物理cpu core.
附:
输入top命令,然后按“1”,可以看到每个(逻辑)CPU的利用情况。