CPU核数

CPU 核心数

最近在项目上使用并发方式去读取文件并且计算分析以提升效率。使用的是python 语言。在查看日志之后下了一跳。我预想着测试环境depoly文件是配置双核CPU。应该也是2才对,结果和不一样。

python 获取CPU核心

import psutil
psutil.cpu_count() # CPU逻辑数量
psutil.cpu_count(logical=False) # CPU物理核心

结果为

>>> import psutil
>>> psutil.cpu_count()
48
>>> psutil.cpu_count(logical=False)
12
>>>

也就是说CPU 逻辑核心数为48,而核心数为12。那么到底取的是哪个?这两者之间有什么关系?

基础概念

CPU 其实是一个大概念,是我们看到的一个物理实体,一个小盒子称之为CPU,可以插入主机的卡槽,对应就是Socket。

  • CPU( CentralProcessingUnit): 中央处理单元,CPU不等于物理核,更不等于逻辑核。
    物理核(physical core/processor): 可以看的到的,真实的cpu核,有独立的电路元件以及L1,L2缓存,可以独立地执行指令。
  • 逻辑核( logical core/processor,LCPU): 在同一个物理核内,逻辑层面的核。(比喻,像动画片一样,我们看到的“动画”,其实是一帧一帧静态的画面,24帧/s连起来就骗过了人类的眼睛,看起来像动起来一样。逻辑核也一样,物理核通过高速运算,让应用程序以为有两个cpu在运算)。
  • 超线程( Hyper-threading, HT):超线程可以在一个逻辑核等待指令执行的间隔(等待从cache或内存中获取下一条指令),把时间片分配到另一个逻辑核。高速在这两个逻辑核之间切换,让应用程序感知不到这个间隔,误认为自己是独占了一个核。
    关系: 一个CPU可以有多个物理核。如果开启了超线程,一个物理核可以分成n个逻辑核,n为超线程的数量。

逻辑核和其他的逻辑地址等等一个套路。至于超线程也就是原来单个核只能跑单个线程,但是现在通过切换(这里类似于线程的上下文切换,时间换空间)达到看起来跑了多个线程的假象。这里是CPU级,和操作系统的原理类似。

如图表示了一个CPU 芯片可能 内部的构造。
在这里插入图片描述

下图表示的是一个CPU 内部构造。这个CPU构造更为复杂。一个CPU芯片包含了4个核(core) 每个核使用了超线程技术。那么我们就称之为单个4核8线程处理器。
在这里插入图片描述

查看CPU参数

使用linux 命令lscpu 可以查看到。

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit #运行方式
Byte Order:            Little Endian#字节顺序 
CPU(s):                48 #逻辑cpu颗数
On-line CPU(s) list:   0-47 #在线CPU
Thread(s) per core:    2 #每个核心线程
Core(s) per socket:    12 #每个cpu插槽核数/每颗物理cpu核数
Socket(s):             2 #cpu插槽数 
NUMA node(s):          2  #非统一内存访问节点
Vendor ID:             GenuineIntel #cpu厂商ID 
CPU family:            6
Model:                 85
Model name:            Intel(R) Xeon(R) Silver 4116 CPU @ 2.10GHz
Stepping:              4
CPU MHz:               2177.406
CPU max MHz:           2101.0000
CPU min MHz:           800.0000
BogoMIPS:              4200.00
Virtualization:        VT-x
Hypervisor vendor:     vertical #虚拟化架构
Virtualization type:   full #cpu支持的虚拟化技术
L1d cache:             32K
L1i cache:             32K
L2 cache:              1024K
L3 cache:              16896K
NUMA node0 CPU(s):     0-11,24-35
NUMA node1 CPU(s):     12-23,36-47
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cdp_l3 invpcid_single pti intel_ppin ssbd mba ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm mpx rdt_a avx512f avx512dq rdseed adx smap clflushopt clwb intel_pt avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts pku ospke flush_l1d

通过以上参数可以看到当前的系统有两个CPU卡槽,每一个卡槽有12个core,而每一个core则有2个和核心线程。

所以对应的cpu 数量为:
cpu_count = socket * core per socket * thread per core = 2 * 12 * 2 = 48

性能基础之CPU、物理核、逻辑核概念与关系

psutil

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章