優化技術專題-系統服務優化系列-CPU處理器鮮為人知的那些祕密

語言: CN / TW / HK

前提概要

所謂,知彼知己百戰不殆,針對於計算機的優化技術來講,最底層也不過是針對於CPU技術的優化了,但是如果要區優化程式,涉及到CPU的執行能力,那必須要了解CPU的原理和概念以及執行過程等概念,所以小編寫了本片的目的就是針對於CPU的相關知識進行講解,當你對CPU不在陌生的時候,也就是你超神的時候了,哈哈......

CPU相關的知識

本文介紹涉及到的知識點包含,多CPU、物理核、邏輯核、超執行緒、程序、執行緒、併發、並行,以及Linux查詢CPU和核的資訊的方法

易混淆概念

多處理器

認真辨別語境,通常是多CPU的意思;有時多是多邏輯處理器即多核的意思,好像老外常常把一個CPU裡有多個核心當成多個CPU來描述。

邏輯處理器

就是邏輯核的意思,Windows 10的中文翻譯了這個特別特別容易誤解的詞,我覺得就是可以理解為核心程式單位。

邏輯CPU

有人用了這個詞表示邏輯核的意思,但是用法的根據我保持懷疑,很容易致使誤解,由於我會認為,核就是核,CPU就是CPU,為何混為一談,好像核就是CPU同樣快取。

CPU的一~四級快取

CPU快取(Cache Memory)的出現是彌補CPU和主存(主記憶體,即記憶體條的)的速度差太大,用於提升效率的,有時可能也叫快取記憶體

快取記憶體也分了不少層,一到四級,四級不多聽但確實是有。一二級是各個核心獨有的三級快取是全部核共享的,四級快取彷佛是為了解決CPU的集顯和CPU的速度差問題(CPU內能夠有顯示卡)。通常CPU商品中只標出了三級快取,其餘都不標註。如圖所示:

這裡看不到L4 Cache,多是由於只有L1~L3才封裝在CPU裡。

一樣的多個核之間的L1、L2也會有快取一致性問題,相似多核CPU有一些協議保證多個CPU內部快取之間一致性的協議(MESI),同一個CPU內部的多核內部的快取的一致性問題應該也是有方案解決的


物理核、邏輯核和超執行緒

  • 物理核:是CPU裡實實在在封裝的物理硬體併發。
  • 邏輯核:利用超執行緒技術模擬出來的核,通常一個物理核能夠虛擬出2個,就是CPU商品標出的執行緒數,有些資料也叫邏輯CPU數
  • 超執行緒:HT,Hyper-Threading,超執行緒技術就是讓一個核模擬出兩個核的技術性能
  • 物理CPU:即主機板上插了多少個的CPU晶片
  • 虛擬CPU:假的、虛擬技術實現的CPU,相似VMWare虛擬機器中的CPU

疑惑:

邏輯核彷佛有些時候被翻譯成邏輯處理器,而處理器一般被我理解為CPU,因此邏輯核,就是邏輯CPU嗎? 但這種翻譯真的會有點模糊不清容易形成誤解。

執行緒和核的關係

  • 執行緒須要核執行,一個核在同一時間只能執行一條執行緒,這裡的核指邏輯核
  • 決定同時執行執行緒數的是邏輯核
  • 邏輯核心多少個,就能夠 “同時” 執行多少執行緒
總結

n個物理核,通常有2n個邏輯核,若是隻能同時執行物理核數個執行緒(n),那超執行緒技術模擬出來的核有什麼用? 何況不少CPU的商品也不標 “邏輯核數”,用的詞是 “執行緒數”,意思應該就是邏輯核心多少個就能同時執行多少個執行緒(2n)

x核y執行緒(y比x大)是什麼意思

CPU商品說的2核4執行緒,指2個物理核,4個邏輯核。4執行緒就是4個邏輯核的意思

程序和執行緒

程序是操做系統層面的概念,執行緒是CPU層面的東西,CPU真正執行的是執行緒而不是程序 程序是是靜態的概念,是一些資源的集合,好比程序有本身的記憶體而執行緒是動態的概念,程序能夠有多個執行緒,這些執行緒共享同一份程序的資源多程序,目前多核的狀況下,能夠作到多個程序同時執行

  • 固然也就能夠作到多個執行緒同時執行。可是單核的CPU沒法作到 “同時”執行程序。此外程序是必定有埠號嗎? 不必定,沒網路暴露的就沒有。但是肯定有程序號就對了

併發和並行

併發(concurrency)和並行(parallelism)
  • 並行是說物理上的 “同時” 被執行
  • 併發是一種程式設計,可以讓多個任務在邏輯上交織執行

併發設計的程式,能夠啟動n個執行緒,好比2個,而後交給2個核,這時兩個執行緒就是並行執行的(“同時”);這兩個執行緒也能夠被1個核 “交替” 執行。

不少時候,會認為並行就是真的同時執行,而併發就是交替執行,這是通常的理解,可是併發真正含義是指設計的程式容許同時或交替執行,是一種程式設計方案

多CPU 和 單CPU多核

估計是提升計算能力的兩個方案,最終選擇單CPU多核方案多一點

多CPU估計也有市場,也有些伺服器是多CPU的

為何單CPU多核方案更勝一籌,主要是這個方案更好?
  • 多個核心之間通訊不須要走外部的匯流排,只須要走CPU內部匯流排,會快得多另外單CPU多核也成本較多CPU低,只須要一套晶片組,一套儲存,多核之間經過晶片內部匯流排進行通訊,共享使用記憶體

  • 多核CPU快取一致性協議有MSI、MESI(Illinois Protocol)、MOSI、Synapse、Firefly及 Dragon Protocol等。

多CPU的市場:多CPU適用於大計算量,對速度(時間)不(太)敏感的任務,好比一些工程建模,或者像SATI找外星人這種極端的,跑上幾千年都不著急的。

單CPU單核

單CPU單核 跑多執行緒效率必定下降嗎?

不必定:

  • 下降:若是多執行緒跑的都是CPU密集型任務,有可能會下降效率,由於僅有的一個核被用滿了還要被排程來排程去浪費時間
  • 提高:若是多執行緒跑的都是IO密集型任務,有可能會提升,由於IO比CPU執行慢得多,來回切換執行緒,讓這個核物盡其用。其排程損耗是值得的

舉個例子:我有兩家店(兩個任務),這兩家店隔了一條街道,我招了一個工人(一個CPU核),若是打理一家店鋪就很忙得不可開交,你還讓他打理兩家店,來回在兩家店跑來跑去,這反而下降了效率。若是這兩個店鋪都是處理1小時事情以後閒3個小時的,顯然讓他來回在兩家店跑能榨乾他的價值,能提升效率。

單CPU多核

常常會聽到CPU都普及多核了,程式設計應該好好利用,其實確實是存在目前的程式設計沒有充分利用多核CPU的效能,不過多是由於多執行緒的程式設計比較複雜的緣由。

單CPU多核,對於多執行緒確實提高做用大。不要錢的話確定是多核比單核CPU好的呀。

Linux中檢視CPU和核資訊

cat /proc/cpuinfo 

獲得的資訊應該是以邏輯核為單位的列表資訊。每一個邏輯核的資訊包括其歸屬的物理核ID(core id),以及其歸屬的物理CPU的ID(physical id)

列出物理CPU及各自的物理核數

cat /proc/cpuinfo | grep -E "physical id|cpu cores" | sed 'N;s/\n/ /' | sort | uniq

假設輸出以下,則表示有2個物理CPU,第一個CPU有4個物理核,第二個CPU也是4個:

physical id : 0 cpu cores : 4
physical id : 1 cpu cores : 4

列出物理CPU及各自的邏輯核數

cat /proc/cpuinfo | grep "physical id" | sort | uniq -c

假設輸出以下,則表示有兩個物理CPU,各自包含8個邏輯核

8 physical id : 0
8 physical id : 1

查詢CPU型別(虛擬、真實)

cat /proc/cpuinfo後檢視model name,

例如:

Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz 大概表示是真實CPU或者QEMU Virtual CPU version (cpu64-rhel6) 表示虛擬CPU

查詢CPU是否支援超執行緒

  • 物理核心和物理CPU列表展示:兩個物理CPU中各存在4個物理核心
physical id : 0 cpu cores : 4
physical id : 1 cpu cores : 4
  • 邏輯核心數碼,和對應的物理CPU的id
8 physical id : 0
8 physical id : 1

能夠得出第一個CPU(physical id是0)支援,由於其物理核4個邏輯核卻又8個,第二個CPU(id是1)一樣也支援。若是物理核和邏輯核的數量相等,不表明不支援,可能沒開啟超執行緒技術開關

top命令顯示的核數是?

輸入top按1能夠展現出全部邏輯核,從Cpu0~CpuN,就是說有N+1個邏輯核。

是邏輯核數。

6、Java程序佔用CPU超過100% top檢視程序的%CPU值,為何會CPU佔用率超過100%

由於該程序佔用超過一個核,佔滿2個核就是200%了。

/proc/cpuinfo檔案解釋

  • model name:是CPU的型號主頻一些資訊

例如Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz或者QEMU Virtual CPU version (cpu64-rhel6)應該能大概看得出是虛擬CPU仍是真實的CPU


  • processor:指邏輯核ID,好比0,表示第1個邏輯核,不是零個邏輯核意思
  • physical id:物理CPU的ID,0表示第一個
  • core id:物理核的ID,0表示第一個
  • cpu cores:該物理CPU有多少個物理核
  • siblings該物理CPU有多少個邏輯核跟cpu cores不同表示開啟了超執行緒技術,不然表示不支援該技術或者未開啟

指令總結(重點學習,以後可能會用的上哦!)

  • 一、物理CPU數

cat /proc/cpuinfo | grep 'physical id' | uniq |wc -l

uniq是為了去掉多個邏輯核同屬於一個物理CPU

  • 二、物理核數(全部CPU)

cat /proc/cpuinfo | grep 'core id' | uniq |wc -l

uniq為了去掉多個邏輯核屬於同一個物理核

上述計算方式是計算全部CPU加起來有多少核,並非計算某個CPU有多少核

  • 三、物理核數(某個CPU)

cat /proc/cpuinfo 後檢視cpu cores,該值記錄了對應的物理CPU(以該條目中的physical id標識)有多少個物理核。

  • 四、邏輯核數(全部CPU)

邏輯核數,有些地方會邏輯CPU數

cat /proc/cpuinfo | grep 'processor' | wc -l

  • 五、邏輯核數(某個CPU)

cat /proc/cpuinfo後檢視siblings,該值記錄了對應的物理CPU(以該條目中的physical id標識做分組)有多少個邏輯核。

  • 六、檢視是否支援超執行緒

cat /proc/cpuinfo後檢視siblings和cpu cores不一致,說明該physical id的CPU支援超執行緒,若是一致,明不支援超執行緒,或者超執行緒未開啟。

「其他文章」