現代計算機的系統架構十分復雜。在服務器中,雙路處理器已經十分常見。最近Arm處理器實現雙路共384核心,要知道目前Linux內核最高只支持256核,這就有點尷尬。
多路處理器將越來越普遍,對性能的影響和傳統架構有不小的差別,這個議題放到后面再討論。首先需要厘清幾個概念,在計算機的主板上,有幾個CPU插座,就是掛載幾顆CPU,通常是Socket插槽。還有H插槽式的,主要在筆記本等小型設備。而每顆CPU可以集成很多核,又叫Core,這里Core說的是物理Core。每個物理Core又能夠支持兩個邏輯核。所以和CPU相關的概念至少有三個:1、處理器,是指插在主板插槽那個芯片。雙路處理器是指兩顆芯片。2、物理核,是在芯片中真正集成的,光刻機實打實刻出來。3、邏輯核,通過超線程技術,在物理核基礎上模擬出來。這三個概念會在下面內容中,會有嚴格的區分。在操作系統命令中,主要看到的是邏輯核,不太關注到物理核和多路處理器。
雖然傳統架構相對簡單,但和現代架構要解決的問題卻是一樣的。我們以傳統的單處理器為例,主板上搭載北橋芯片和南橋芯片。北橋芯片主要負責高速連接,通過內存控制器,連接內存和顯卡。CPU通過前端總線FSB和北橋芯片讀寫內存和顯卡。南橋芯片主要負責低速連接,如I/O接口,包括網卡和磁盤,還有鍵盤鼠標等。這里要畫個重點,北橋芯片和南橋芯片的作用,這個很容易被忽略。
先聲明下,邏輯核在高速緩存上如何共享,我沒有專門研究過,可能會有所不同。在物理核上,主要有L1和L2高速緩存,L3高速緩存目前是片內共享的,即整個CPU內部共享的。更早之前,L2和L3是集成在主板上。L1高速緩存被拆分成L1d和L1i,即數據緩存和指令緩存。
說完前面的基礎資料后,我們來看下一個指令執行時的延遲是什么情況。
1、如果數據在寄存器中,1個cycle。
2、如果數據在高速緩存中,3-20個cycle。
3、如果數據在主存中,則需要通過FSB,向北橋芯片的內存控制器發起讀取指令,240個cycle。
上述的3個值不是精準的值,但數量級差不多。
說完以上內容,就很容易理解幾個場景下,這些硬件如何影響到性能,以及影響程度有多大。
1、等待I/O,通過低速南橋芯片讀寫數據,對延遲影響無需贅述。
2、線程切換,線程的上下文被回寫到主存,再次被調度時,至少要面對幾個性能懲罰,緩存缺失,邏輯核漂移。
對于這個問題的解決,多數會采用CPU親和的解決方案。這里有個坑,并不是相鄰的邏輯核就是在一起。
3、原子操作和內存屏障,這個問題和緩存一致性協議是一起的。多核在同時讀寫一塊內存時,都要考慮這個問題。
但我們在前面說過,L3緩存是片內共享,所以在單路處理器系統中,基本在L3緩存就解決了。包括目前由disruptor引起很火的偽共享問題,并沒有所說的,對性能有那么大的影響。
4、緩存行和巨頁問題,這是作為基礎知識就好了。主要體現在內存管理這塊。