物理 CPU vs 邏輯 CPU vs 核心 vs 線程 vs Socket
當我們試著通過 Linux 命令 nproc 和 lscpu 了解一臺計算機 CPU 級的架構(gòu)和性能時,我們總會發(fā)現(xiàn)無法正確地理解相應的結(jié)果,因為我們會被好幾個術(shù)語搞混淆:物理 CPU、邏輯 CPU、虛擬 CPU、核心、線程和 Socket 等等。如果我們又增加了超線程(不同于多線程),我們就會開始不知道計算機里面到底有多少核心,我們搞不明白為什么像 htop 這樣的命令會在我們認為買的是一臺單核計算機上返回擁有 8 個 CPU 的結(jié)果。這樣的情況一片混亂。

起源:單核CPU和超線程
在諸如多核、虛擬 CPU 和邏輯 CPU 這樣的概念誕生前,在奔騰系列處理器的年代,大部分計算機在它們的主板上裝備了一塊不大不小的芯片,我們把它叫做微處理器、處理器或直接叫 CPU。只有很少數(shù)需要更強處理能力的企業(yè)能夠負擔得起同一塊主板上安裝 2 塊以上的處理器的費用:這些就是多處理器系統(tǒng)。這些處理器與主板上其它元件的通信通過一個連接器或 Socket 來完成。那我們很容易能計算得到一塊主板上有多少連接器或 Socket,那么這塊主板上最多就能有相同數(shù)量的 CPU。如果你需要更多的計算能力,你只需要尋找一塊能夠支持更多處理器的主板即可。
但是后來 Intel 意識到多處理器系統(tǒng)里,處理器之間通過系統(tǒng)總線進行通信是非常低效的,因為總線傳輸速度較慢。這樣就會經(jīng)常發(fā)生的性能瓶頸,無法最大化利用 CPU 的計算能力。

為了改善這個處境于是誕生了超線程技術(shù)。超線程的大意是復制一些 CPU 單元到同一塊芯片上,比如寄存器或者一級緩存,這樣可以在兩個執(zhí)行線程里共享這些數(shù)據(jù),而無需經(jīng)由系統(tǒng)總線和避免因為訪問速度導致的性能下降問題。超線程還帶來另外一個好處是可以當一個進程在等待中斷的時候,另一進程仍然可以使用同一個 CPU 進行執(zhí)行而且無需停止。
這種方式可以加速多個被處理的進程,比傳統(tǒng)的單個核心(未開啟超線程)提供更高的整體性能。操作系統(tǒng)有點像被欺騙的意思,因為它被提供了兩個虛擬 CPU或者邏輯 CPU 并且可以“同時”執(zhí)行兩個進程。但是要非常注意的是,它并不能帶來兩倍的處理能力,也不提供完全并行計算能力。
這樣, 從 Linux 或者其他操作系統(tǒng)的視角來看,一個單核 CPU 計算機通過超線程技術(shù)呈現(xiàn)出雙核 CPU 的效果,但兩個邏輯 CPU 實際上在同一個物理 CPU 中執(zhí)行。
又一點復雜:多核架構(gòu)的出現(xiàn)
正如我在前面部分所說的,盡管開啟了超線程的 CPU 能夠提供更強的計算能力,但并不能提供 2 倍的處理能力和 2 個獨立的 CPU,所以我打算進一步縮小 CPU 元件的視角,并且把它們都安裝到統(tǒng)一塊芯片上。如此一來每個被壓縮的處理器都叫做核心,并且允許使用同一塊硅晶的內(nèi)部共享總線進行更快的通信。從那一刻開始再也不需要較慢的系統(tǒng)總線了。

不同于超線程技術(shù),我們現(xiàn)在擁有多個完全獨立的 CPU 服務于任何任務,每個任務可以分配一個核心。確實,從性能的角度來看,擁有單個多核芯片要比同一個主板上擁有多個單核芯片提供更好的性能。當然,擁有一個雙數(shù)核心要比單數(shù)核心更好。
在操作系統(tǒng)層,一個物理的四核處理器可以看做是四個 CPU。但這些可能是四個邏輯 CPU 或者非物理的 LCPU。如果處理器還提供了超線程支持,那么像htop 和 nproc 的命令會看到系統(tǒng)里有八個 CPU,但是可能在一個八核 CPU上看到少于八核的結(jié)果。
1LCPU = 1線程
最后我們通常發(fā)現(xiàn)支持四線程的處理器,每個核心兩個線程這樣,這僅僅表示同時可以執(zhí)行任務的線程,并且與一個 LCPU 能夠提供的處理能力等價。如果一個處理器每個核心能夠支持兩個線程說明它啟用了超線程,否則正常來說線程數(shù)與核心數(shù)一致。

邏輯CPU vs 虛擬CPU
虛擬 CPU 這個術(shù)語通常會被與邏輯 CPU 進行比較,但是有一點細微的差別:虛擬CPU 更加被局限在計算虛擬化的領(lǐng)域里,它表示那些與從底層硬件(可以是物理CPU 也可以是邏輯 CPU、開啟超線程與否)映射到虛擬機的處理器。一般情況下,宿主機上一個邏輯 CPU 映射到虛擬機里的一個虛擬 CPU,所以它們可以看做是相同含義的術(shù)語。