【轉(zhuǎn)】INTEL x86服務(wù)器體系架構(gòu)(四)
INTEL x86服務(wù)器體系架構(gòu)(四)

雪瀑牽裳
IT 老棒槌
關(guān)注他
34 人贊同了該文章
CHA和cache
上一期,講到了虛頭八腦的知識體系結(jié)構(gòu)。
這個知識體系范疇說虛也虛,說實也實。在年輕的時候,我也特別不屑這種抽象體系。但是等個人經(jīng)驗(格物)積累到一定程度,就對其有所感悟了(致知)。
舉個現(xiàn)實的例子,某人,兩個月前還是個x86小白。就是通過這個知識體系結(jié)構(gòu)開始學習,兩個月后能夠從寄存器原理上推斷出某司的服務(wù)器診斷工具所提供的解析結(jié)果是錯誤的;也能通過x86架構(gòu)知識來推導某些冷僻參數(shù)在CMOS的目錄位置。
再舉一個關(guān)于自己的慘痛例子。其實我現(xiàn)在最后悔的是,當年上大學時對計算機應(yīng)用學科特別重視,而對基礎(chǔ)學科重視不夠。尤其各種數(shù)學,當時不過混個考試通過而已。
如今二十年過去了,我當年所重視的應(yīng)用課程,例如什么C語言、面向?qū)ο蟮?,現(xiàn)如今都已經(jīng)成了初中畢業(yè)、高中畢業(yè)后的社會職業(yè)培訓課程了。再靠這類應(yīng)用課程內(nèi)容吃飯,頂多就是個IT民工。而如今如火如荼的AI,打入門都是從模糊數(shù)學、算法講起。此時我再想深入接觸,感覺連都看都看不明白了。不禁感慨,難道自己真的要落伍了么?
基礎(chǔ)知識的積累真的是太重要了,就像是房子的地基。個人掌握的基礎(chǔ)知識深厚程度,未來會直接決定應(yīng)用知識學習的高度。
所以現(xiàn)在,雖然我也會為上小學的孩子報一門計算機類的課外輔修課程,但是我一直告誡他,這些課只是給他開拓一下眼界而已。目前階段,學好語數(shù)外,打好基礎(chǔ)是最最重要的。
再回到這個專題,上期文檔中所說的知識體系,其實不過是知識體系的基礎(chǔ),甚至還未涉及到人員、渠道、外圍接口等知識體系的幾大要素呢。這些要素同樣非常的重要。例如,沒有老師,我的好多知識點就只能通過自己的聯(lián)想和假設(shè),只能通過以后的時間和鮮血來印證,這無疑是知識成長的一大障礙。(師者,所以傳道授業(yè)解惑也。)
后面的內(nèi)容中會逐漸暴露出這一點,我在今后的內(nèi)容中也會列出未自己的想法和未驗證的猜測。(學而不思則罔。)
另外即使是算作資料體系,其實也還沒包括其他兩個重要分支:診斷和調(diào)優(yōu)。如果將來有時間,將會再開這兩個子寫列。
接著上篇留下的尾巴講。
一、SKXCPU內(nèi)部架構(gòu)
CPU內(nèi)部的邏輯圖如下:
上圖中,除了core以外,所有的模組都屬于uncore modules。
首先intel資料里一句話要強調(diào)一下:“skx CPU可以支持地址空間 48 bits,物理地址空間 46 bits。”?!@句話,我的理解有2:
1、目前x86的64位還不是真正的64位,而是32位的擴展。內(nèi)存物理空間46bits>32bits。CPU里好多寄存器還都保留著32位的影子,例如內(nèi)部好多csr寄存器還是32位的;例如好多MCA寄存器仍然以IA32來開頭。
2、另外這里的地址空間指的是虛擬地址空間也就是線性空間。這句話又牽扯到后期linux 內(nèi)核部分的線性空間與物理空間的轉(zhuǎn)換(MMU四層尋址)。
各個部件說明:
一、Mesh/Mesh stop
上面圖中 左右雙線綠色的通道/上下雙線藍色,形成了一個個方形漁網(wǎng)網(wǎng)格,類似于下面這樣一個一個方形小單元:

Intel將這個方形小單元叫做Mesh interconnect。
但是我手頭的intel資料描述里,這個mesh結(jié)構(gòu)的直接部件也就是個Meshstop,且資料里也沒對這個meshstop說出個實際的功能1,2,3;只是說這個mesh架構(gòu)與UPI連接有密切關(guān)系。另外后續(xù)相關(guān)的寄存器診斷中,基本看不到涉及mesh的相關(guān)內(nèi)容。
但是如果我們將前一代broadwell CPU和Skylake CPU的結(jié)構(gòu)圖對比看,我們可以發(fā)現(xiàn):
前一代的CPU的core/uncore部件之間是基于兩個loop ring的;
而Skylake CPU core/uncore部件之間已經(jīng)是基于這個Mesh網(wǎng)格了。
——所以從理論上說,core到最遠uncore部件的路徑在skylake CPU上被縮小了。所以理論上性能也提高了。
二、Cores
一個物理cpu socket 內(nèi)部的多個核,這個核就是core,這個核就是以前我上大學時課本里CPU的范疇。后來intel一個cpu包括了多個核,以及這個模塊、那個模塊的,所以如今你大爺仍然是你大爺,CPU卻已經(jīng)不是原來的CPU了。
所以在這里規(guī)范一下我的X86架構(gòu)和linux內(nèi)核兩個系列中的相關(guān)名詞定義:
Socket:是指物理的一個CPU,就是那個實實在在的能拿在手里砸你腦袋的小板磚。例如一個2路服務(wù)器,有兩個socket,那么在其第一層Linux操作系統(tǒng)里,一個socket對應(yīng)一個physical ID。
Cores:一個socket內(nèi)部的多個處理核心。例如同樣是上面這個2路服務(wù)器一個socket CPU有16 cores,那么在個2路服務(wù)器共有32 cores。在其第一層Linux操作系統(tǒng)里,一個socket 的core對應(yīng)該phsical ID下的一個core ID:
physical id 0的coreID 0~15;
physical id 1的coreID 0~15;
Processor:如果bios里打開的超線程,一個core 又變成了兩個邏輯,每個邏輯被稱為一個processor。那么隨著上面的例子,打開了超線程情況下,該2路服務(wù)器的redhat操作系統(tǒng)看到了64個 processor。在redhat的proc/cpuinfo里processor對應(yīng)著一個processor。這個proessor的編號稍微復雜一些,coreid根據(jù)超線數(shù)量做了一次interleave。呃,具體的,自己去看操作系統(tǒng)的說明吧。
我們再從操作系統(tǒng)回到硬件層面,硬件層面架構(gòu)以及寄存器診斷只看到socket和core,所以有時候,某些司的服務(wù)器底層硬件日志中出現(xiàn)了proc這個關(guān)鍵字,而“proc”又代表了core……到時候怎么辦?扳著手指頭數(shù)數(shù)吧……
至于skx系列的CPU類型和CoreNums 甩出個圖,不多說了:
又分鉑金系列、金牌系列、銀牌系列、銅牌系列——這是從網(wǎng)上找的圖,相關(guān)的內(nèi)容歸售前死記硬背狂噴去吧,對錯我也不care。
Core里相關(guān)的寄存器說明,在以后的寄存器部分詳細說。
三、CHA與CACHE
FLC又叫一級緩存, 分為 DCU(data) and ICU(instruction), FLC就是core內(nèi)的L1 cache。上面這個圖沒有標識出。
MLC又叫二級緩存,就是 core 外部的L2 cache(skylake將MLC放到了core外)。由CHA部件管理。
LLC又叫三級緩存,就是 core外部的L3 cache。
CHA 包括了以下部分的功能:
1、 cache管理——就是CHA的C了,就是之前Broadwell資料中對應(yīng)的cache agent(CBO)。用來保存一些cache的meta信息,管理LLC和MLC。
CBO里有一個很重要的TOR_table,來保存core的未完成的transactions;
TOR_table 示意圖如下:

未來,我們會接觸到很有名的“三振超時”故障,原因是:有長時間的transactions占用core、且無法切換出core。該故障其中的一個關(guān)鍵字就是TOR_TMOUT。(當然MLC里也有對應(yīng)寄存器報錯)
2、 core與內(nèi)存控制器imc的接口?!褪侵暗膆ost agent。
3、 另外,skylake加入了新的子部件 snoop filter來實現(xiàn)/優(yōu)化core與其他core之間的cache數(shù)據(jù)同步;
所謂的優(yōu)化,我的理解是:snoop filter里面有個表數(shù)據(jù)結(jié)構(gòu),記錄同一塊數(shù)據(jù)所關(guān)聯(lián)的core;如果有cache同步的需求,request從過去的閉著眼廣播模式轉(zhuǎn)變成了Point to target的模式,這樣就減少了總線負載。
在skylake架構(gòu)中,CHA是分布到每個core上的,CHA的編號與core的編號相同?!@點與上一代的broadwell/haswell不同。CHA、MLC部分涉及到相關(guān)的cache策略,所以是服務(wù)器性能調(diào)優(yōu)的重要組成部分。
Cache調(diào)優(yōu)的關(guān)鍵字:prefetch,或stream。CMOS的某些設(shè)置項與其有直接關(guān)聯(lián)。
另外CHA、MLC相關(guān)寄存器又涉及到服務(wù)器診斷尤其是IERR錯誤診斷。
關(guān)于CHA、MLC的疑惑和猜想(18年12月立碑):
1、 在CHA部分中LLC的描述為11-ways;MLC的描述為8-ways?!猚ache是一個存儲空間,cache有什么11路和8路之說?這種說法究竟是個什么意思?
19年3月的回答:
這個要從cache的數(shù)據(jù)結(jié)構(gòu)說起。
Cache的數(shù)據(jù)結(jié)構(gòu)分成兩層:
每一級cache,內(nèi)有多個相等的set。
Set:又叫組。每個組里有多個line。
line:是cache數(shù)據(jù)調(diào)入調(diào)出的原子單位。Line的大小又叫l(wèi)inesize。Linesize一般是64B的倍數(shù)。我記得skylake CPU的linesize是256B。
一個set組包括多少個line——專業(yè)的說法叫 多少個way 同組。
這里的11-ways,8-ways,就是指 每個set里有11個line,或沒個set里有8個line。
2、 根據(jù)intel EDS的暗示,CHA似乎分成了三個組
CHA0,3,6,9,12,,,,,
CHA1,4,7,10,13,,,,,
CHA2,5,8,11,14,,,,,
——CHA以3為interleave分布在三個組。
目前看skylake最多32個core,那么每個CHA組的成員上限是11個,那這個11是不是就是問題1里面的11-ways?
3、 我曾在一個LINUX crash分析案例中看到,如果cpu里的某個進程出現(xiàn)了一個spinlock死鎖,那么我們可以以常量NUM_INVALID_TLB_VECTORS為interleave,通過進程當前的CPUID%NUM_INVALID_TLB_VECTORS得到的余數(shù)來獲得同組相關(guān)的CPU編號,從而得到需要同時flush TLB的CPU組,從而找到spinlock可能影響的CPU們,以及上面的進程。
——這個Flush TLB組和這個CHA組是否有關(guān)聯(lián)?
——此處立個墓碑,等以后尋找答案了。
發(fā)布于 2019-03-27 13:43