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

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