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

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

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

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

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