先说公式

  • 物理CPU总核数 = 逻辑CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数(没有超线程时)。
  • 逻辑CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数(有超线程时)。
  • 物理CPU个数:就是服务器主板插了几个物理CPU。
  • 物理CPU核数:每个CPU的核数都是固定的,比如你的计算机有两个物理CPU,每个CPU是双核,那么计算机就是四核的。
  • 超线程数
    • 超线程技术出现之前,物理CPU核数与线程数是1:1对应的,一个四核CPU拥有四个线程,总的逻辑CPU核心数就等于1*4=4;
    • Intel引入超线程技术后,物理CPU核数和线程数就是1:x的关系,一个四核CPU拥有八个线程(就是1:2),总的逻辑CPU核心数就等于1*4*2=8。

1. lscpu命令,查看的是cpu的统计信息

[root@test ~]# lscpu 
Architecture:          x86_64			# CPU架构
CPU(s):                48			# 逻辑CPU个数
On-line CPU(s) list:   0-47			# 在线的CPU数量,有时为了省电或者CPU过热,某些CPU会停止运行
Thread(s) per core:    2			# 每个核心的线程数是2
Core(s) per socket:    12			# 每颗CPU的核数是12
# PS:共2颗CPU,单颗CPU是12核,每个核的线程数是2,那总的逻辑CPU核数就是48=2*12*2

如下图是使用了超线程技术的cpu信息:

下图是没有使用超线程技术的cpu信息:

cpu封装
processor:逻辑处理器的唯一标识符(cpu)  【processor有几个,代表cpu有几个】
cpu的核数由processor决定
physical id:物理处理器的唯一标识符(物理封装cpu)
core id:条目保存每个内核的唯一标识符(核心) 【表示整个系统里有几个core】
cpu cores:表示一个物理cpu有几个core
siblings:表示一个物理cpu 有几个processor
超线程技术【硬件换效率,1个core有两个processor 并不等于 1+1 =2,目的是大于1】
 

超线程(Hyper-Threading,简称"HT")技术
超线程(Hyper-Threading,简称"HT")技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个呃呃物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的空闲时间,提高了CPU的运行效率。

为什么说超线程的性能并不等于两颗CPU的性能?
超线程技术是在一颗CPU同时执行多个线程而共同分享一颗CPU内的资源,理论上要像两颗CPU一样在同一时间执行两个线程。因每个CPU都具有独立的资源,当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,知道这些资源闲置后才能继续,因此超线程的性能并不等于两颗CPU的性能。

如果"siblings" 是 "cpu cores "的两倍,则说明支持超线程,并且超线程一打开。

如何判断CPU是否拥有超线程技术?
超线程技术取决于,一个core id 上面有几个processor

  • 同一个物理封装,同一个core id 下,有两个processor,说明支持超线程技术

core id 查看是否有超线程技术(0,1)

  • 一个核心上封装2个通道


 如上图,physical id =(0,1)说明有2颗物理CPU,每颗物理CPU有4个逻辑处理器。每颗物理CPU对应的逻辑处理器为(0,2,4,6) (1,3,5,7),所以上图的CPU构成是拥有超线程技术8核CPU。

举例不拥有超线程技术的案例,如下图:

 如上图,physical id =(0),说明有1颗物理CPU(没有超线程技术),1颗物理CPU有4个逻辑处理器(0,1,2,3),只是单纯的4核CPU。

2. cat /proc/cpuinfo命令,查看每个cpu信息,如每个CPU的型号,主频等。

processor:系统中逻辑处理核心数的编号,从0开始排序
vendor_id:CPU制造商
cpu family:CPU产品系列代号
model:CPU属于其系列中的哪一代的代号
model name:CPU属于的名字及其编号、标称主频
stepping:CPU属于制作更新版本
cpu MHz:CPU的实际使用主频
cache size:CPU二级缓存大小
physical id:单个物理CPU的标号
siblings:单个物理CPU的逻辑CPU数。如果cpu cores数量和siblings数量一致,则没有启用超线程,否则超线程被启用
core id:当前物理核在其所处CPU中的编号,这个编号不一定连续
cpu cores:该逻辑核所处CPU的物理核数。比如此处cpu cores 是4个,那么对应core id 可能是 1、3、4、5
apicid:用来区分不同逻辑核的编号,系统中每个逻辑核的此编号必然不同,此编号不一定连续
fpu:是否具有浮点运算单元(Floating Point Unit)
fpu_exception:是否支持浮点计算异常
cpuid level:执行cpuid指令前,eax寄存器中的值,根据不同的值cpuid指令会返回不同的内容
wp:表明当前CPU是否在内核态支持对用户空间的写保护(Write Protection)
flags:当前CPU支持的功能
bogomips:在系统内核启动时粗略测算的CPU速度(Million Instructions Per Second
clflush size:每次刷新缓存的大小单位
cache_alignment:缓存地址对齐单位
address sizes:可访问地址空间位数
power management:对能源管理的支持[2]

①查询系统物理CPU个数:[3]

$cat /proc/cpuinfo | grep "physical id" |sort |uniq

4个物理CPU

②查询系统逻辑CPU个数:[4]

$cat /proc/cpuinfo | grep "processor" | wc -l

8个逻辑CPU

③查询系统每个物理CPU的核数:[5]

$cat /proc/cpuinfo | grep "cpu cores" | uniq

每个物理CPU2核

④查询系统的每颗物理CPU核心是否启用超线程技术。如果启用此技术那么每个物理核心又可分为两个逻辑处理器:[6]

$cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq

cpu cores数量和siblings数量一致,没有启用超线程

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐