PCI-E Switch芯片,估計不少人已經(jīng)聽說過這個東西了。但是估計多數(shù)人對其基本功能知之甚少。PCI-E Switch作為最先進(jìn)的生產(chǎn)力,已經(jīng)被廣泛應(yīng)用在了傳統(tǒng)存儲系統(tǒng),以及少量品牌/型號的服務(wù)器平臺。
冬瓜哥作為擁有全球最領(lǐng)先PCI-E Switch產(chǎn)品的Microsemi公司的系統(tǒng)架構(gòu)師,想在這里為大家普及一下PCI-E Switch的基本知識。
背景介紹
PCI-E大家都了解,主板上有PCI-E槽,里面的金手指就是一堆信號線,其直接被連接到了CPU內(nèi)部的PCI-E控制器上。然而,當(dāng)前的Intel平臺CPU每顆最大支持40個通道(Lane),一般來講萬兆網(wǎng)卡使用8個通道即可,高端顯卡需要x16通道因為在3D運(yùn)算時需要的吞吐量巨大(冬瓜哥的PC使用了老主板來配了塊GTX980顯卡,只能運(yùn)行在x8模式上,但是3D性能基本沒什么變化,證明x8基本已經(jīng)足夠)。一般的存儲卡也使用x8,但是后端12Gb/s SAS存儲卡(HBA卡、Raid卡)普遍過渡到了x16。
但是,對于一些高端產(chǎn)品來講,尤其是那些傳統(tǒng)存儲系統(tǒng),每顆CPU提供x40個通道就顯得不夠用了。傳統(tǒng)存儲系統(tǒng)的一個特殊要求就是后端和前端HBA數(shù)量比較大,所以CPU自帶的通道數(shù)量無法滿足。另外,傳統(tǒng)存儲控制器之間需要做各種數(shù)據(jù)交換和同步,一般也是用PCI-E,這又增加了對通道數(shù)量的消耗。
對于一般的高端服務(wù)器,普遍都是雙路、四路配置,雙路下提供x80通道,理論上可連接10個x8的PCI-E設(shè)備,去掉一些用于管理、內(nèi)部嵌入式PCI-E設(shè)備的通道占用之后,連接8個設(shè)備不在話下,可以覆蓋幾乎所有應(yīng)用場景。
但是,**隨著用戶對融合、統(tǒng)一、效率、空間、能耗要求的不斷提升,近年來出現(xiàn)了不少高密度模塊化服務(wù)器平臺,或者說,開放式刀片。這類服務(wù)器平臺對PCI-E方面產(chǎn)生了一些特殊需求,比如Partition和MR-IOV。**下面,冬瓜哥就詳細(xì)展開介紹這些知識。
基本功能
1.Fanout
Fanout(擴(kuò)展、擴(kuò)開、散開的意思)是PCI-E switch的基本功能,或者說,PCI-E標(biāo)準(zhǔn)體系一開始就是應(yīng)對通道數(shù)量不夠用才設(shè)計了PCI-E Switch這個角色。
在PCI-E之前的一代標(biāo)準(zhǔn)是PCI-X,那時候并沒有Switch的概念,F(xiàn)anout采用的是橋接的形式,形成一個樹形結(jié)構(gòu),如上圖中間所示。**Switch的概念是在PCI-E時代引入的,其相對于橋最大的一個本質(zhì)區(qū)別就是同一個Bus內(nèi)部的多個角色之間采用的是Switch交換而不是Bus。**PCI-X時代真的是使用共享Bus傳遞數(shù)據(jù),這就意味著仲裁,意味著低效率。
然而,PCI-E保留了PCI-X體系的基本概念,比如依然沿用“Bus”這個詞,以及“橋/Bridge”這個詞,但是這兩個角色都成為了虛擬角色。一個Switch相當(dāng)于一個虛擬橋+虛擬Bus的集合體,每個虛擬橋(VB)之下只能連接一個端點設(shè)備(也就是最終設(shè)備/卡,End Point/EP)或者級聯(lián)另外一個Switch,而不能連接到一個Bus,因為物理Bus已經(jīng)沒了。這種Fanout形式依然必須遵循樹形結(jié)構(gòu),因為樹形結(jié)構(gòu)最簡單,沒有環(huán)路,不需要考慮復(fù)雜路由。
2.Partition
分區(qū)功能相當(dāng)于以太網(wǎng)Switch里的Vlan,相當(dāng)于SAS Switch/Expander里的Zone。
如上圖所示,兩臺或者多臺機(jī)器,可以連接到同一片PCI-E Switch,在Switch做分區(qū)配置,將某些EP設(shè)備分配給某個服務(wù)器。這樣可以做到統(tǒng)一管理,靈活分配。每臺服務(wù)器的BIOS或者OS在枚舉PCI-E總線時只會發(fā)現(xiàn)分配給它的虛擬橋、虛擬BUS、和EP。多個分區(qū)之間互不干擾。
**多臺獨立服務(wù)器連接到同一片Switch上,如果不做Partition,是會出現(xiàn)問題的,**因為兩個OS會分別枚舉同一堆PCI-E總線內(nèi)的角色,并為其分配訪問地址,此時會出現(xiàn)沖突。
3.NTB
有些特殊場景下,比如傳統(tǒng)存儲系統(tǒng)中的多個控制器,它們之間需要同步很多數(shù)據(jù)和控制信息,希望使用PCI-E鏈路直接通信。問題是,圖中的兩臺服務(wù)器并不可以直接通信,因為必須身處兩個不同的分區(qū)中。為了滿足這個需求,出現(xiàn)了NTB技術(shù)。其基本原理是地址翻譯,因為兩個不同的系統(tǒng)(術(shù)語System Image,SI)各有各的地址空間,是重疊的。那么只要在PCI-E Switch內(nèi)部將對應(yīng)的數(shù)據(jù)包進(jìn)行地址映射翻譯,便可以實現(xiàn)雙方通信。這種帶有地址翻譯的橋接技術(shù)叫做None Transparent Bridge,非透明橋。
高級功能
1.Dynamic Partition
上文中的分區(qū)配置必須是靜態(tài)配置,必須在BIOS啟動之前,也就是CPU加電之前,對PCI-E Switch進(jìn)行分區(qū)配置,可以使用BMC做配置。分區(qū)配置好之后,在系統(tǒng)運(yùn)行期間,不能夠動態(tài)改變。這就意味著,某個PCI-E卡如果被分配到了服務(wù)器A,則其不能在不影響服務(wù)器A和B的運(yùn)行前提下,被動態(tài)重新分配到服務(wù)器B。
Microsemi公司Switchtec旗下的PCI-E Switch產(chǎn)品則支持動態(tài)分配。具體的實現(xiàn)手段冬瓜哥就不透露了。不過,對于內(nèi)行開發(fā)者來講,這些都不是問題,問題是對應(yīng)的芯片內(nèi)部的架構(gòu)是否足夠靈活可配置,這是限制高級功能設(shè)計的關(guān)鍵。
2.Fabric
上文中說過,不管是PCI-X還是PCI-E體系標(biāo)準(zhǔn)內(nèi),只支持樹形拓?fù)洹湫瓮負(fù)涞膯栴}在于,路徑過長,整個網(wǎng)絡(luò)的直徑太大。另外,無法實現(xiàn)冗余,一旦某個鏈路故障,鏈路后方的分支全部無法訪問。
于是,**支持Fabric成了一個非常復(fù)雜的高級功能。這個場景目前還很少有人使用,對于整機(jī)架服務(wù)器比如天蝎等,其對這項功能興趣則比較大。**然而,目前這個技術(shù)的實現(xiàn)還非常初級不完善,也沒有形成標(biāo)準(zhǔn)。
3.IOV
SR-IOV,不少人都聽說過,但卻不知道里面具體的門道,Single Root IO Virtualization里的Root是什么意思?Single Root又何解?還有Multi Root IOV,這又是什么鬼?
SR-IOV,是指把插在一臺服務(wù)器上的一塊PCI-E卡虛擬成多塊虛擬卡,給運(yùn)行在這臺服務(wù)器上的多個虛擬機(jī)用,每個虛擬機(jī)都識別到一個PCI-E卡,但是VM并不知道這個卡是虛擬出來的。
如果不虛擬成多塊卡,多個VM怎么共享這個設(shè)備?答,必須通過Hypervisor提供的服務(wù)來使用該設(shè)備。Hypervisor會在VM內(nèi)安裝一個驅(qū)動程序,這個驅(qū)動會虛擬一個并不存在的設(shè)備,比如 “XXX牌以太網(wǎng)卡”,這個驅(qū)動會真的與OS協(xié)議棧掛接上,從而接收上層下發(fā)的數(shù)據(jù)包。但是這個驅(qū)動收到數(shù)據(jù)包之后,由于根本不存在實際的網(wǎng)卡,這個驅(qū)動其實是將這個包發(fā)送給了Hypervisor,或者有些虛擬機(jī)實現(xiàn)是使用一個domain 0特權(quán)VM來負(fù)責(zé)與真實硬件打交道,那么這個驅(qū)動會將數(shù)據(jù)發(fā)送給這個特權(quán)VM,Guest VM與特權(quán)VM之間通過進(jìn)程間通信來傳遞數(shù)據(jù),Hypervisor或者特權(quán)VM收到數(shù)據(jù)之后,再通過真實的驅(qū)動,比如“Intel xxx Ethernet card”將數(shù)據(jù)包發(fā)送給真實網(wǎng)卡。
這么一轉(zhuǎn)發(fā),就慢了,因為內(nèi)存拷貝的代價比較高,吞吐量要求如果很大的話,這種方式就不行了。于是,SR-IOV出馬解決了這個問題。SR-IOV需要直接在PCI-E卡的硬件里虛擬出多個子設(shè)備。如何做到?
首先,支持SR-IOV的PCI-E卡,需要向系統(tǒng)申請成倍的地址空間,想虛擬出幾個設(shè)備,就需要按照SR-IOV的規(guī)范格式來聲明相比原先幾倍的地址空間。這個地址空間會在內(nèi)核或者BIOS枚舉PCI-E設(shè)備的時候被獲取到,系統(tǒng)會將為該設(shè)備申請的地址空間段的基地址寫入設(shè)備寄存器。比如某網(wǎng)卡虛擬出8個虛擬網(wǎng)卡來,然后由內(nèi)核PCI-E管理模塊向系統(tǒng)申報8個PCI-E設(shè)備。隨后就是由Hypervisor將對應(yīng)的設(shè)備映射給對應(yīng)的VM,VM中加載對應(yīng)的Host Driver。Hypervisor還需要執(zhí)行地址翻譯,或者硬件輔助的地址翻譯。
只要PCI-E設(shè)備自身支持SR-IOV,PCI-E Switch不需要做任何額外處理即可原生支持。但是**MR-IOV則必須基于支持SR-IOV的板卡,加上在PCI-E switch上做額外處理才可以支持。**原因還是因為多個獨立系統(tǒng)之間是互不溝通的,如果都嘗試對PCI-E總線進(jìn)行配置會沖突。PCI-E Switch針對MR-IOV的支持基本手段,還是靠增加一層地址映射管理來實現(xiàn)。
4. 組播(Multicast)
在傳統(tǒng)雙控或者多控存儲系統(tǒng)中,緩存鏡像是一個必須動作。緩存鏡像有多種方式可以實現(xiàn)。第一種,某控制器將數(shù)據(jù)讀入其自身內(nèi)存,然后使用NTB方式將數(shù)據(jù)拷貝到對方的一個或者多個控制器內(nèi)存從而實現(xiàn)鏡像。拷貝過程可以采用programmed IO方式或者DMA方式(前提是對應(yīng)的PCIE switch上提供DMA控制器)。另一種方式則是采用組播方式,底層程序員首先對整個PCIE switch域中的switch做配置,將某些端口后面的某些地址空間設(shè)置為同屬于一個組播組,這樣,凡是命中該組播組地址空間的寫操作,均被PCIE switch廣播寫入到同組內(nèi)的對應(yīng)地址上。這種方式實現(xiàn)鏡像的好處是不消耗任何Host端CPU資源。目前,PCIE Multicast這個功能,只有一家支持(支持Dynamic Partition的那家),并且只有Posted方式的返回數(shù)據(jù)才可以被組播。PCIE寫操作都是Posted,讀操作都是none posted。注意,Host讀盤的過程底層其實是盤向Host主存的PCIE寫事務(wù),PCIE設(shè)備枚舉過程中的配置讀操作是真讀。過于底層的細(xì)節(jié)冬瓜哥就不多介紹了。
Dell PowerEdge FX2平臺對
PCI-E Switch的應(yīng)用
Dell PowerEdge FX2是一款2U多節(jié)點服務(wù)器平臺框架,其采用一個2U的Chassis機(jī)箱,最大可以容納:
2個1U Server Sled
或者1個1U Server Sled+2個1U半寬存儲Sled
或者1個1U半寬Server Sled+3個1U半寬存儲Sled
或者4個1U半寬Server Sled
或者2個1U半寬Server Sled+2個1U半寬存儲Sled
或者3個1U半寬Server Sled+1個1U半寬存儲Sled
或者8個1U四分之一寬Server Sled
多種靈活組合都可實現(xiàn)。
機(jī)箱背面有8個PCI-E槽位。
**這8個PCI-E槽位可以被靈活的分配給機(jī)箱正面的各種組合的Server Sled。這就得益于PCI-E Switch以及Partition功能的使用。**冬瓜哥畫了一張示意圖來向大家介紹一下其內(nèi)部的導(dǎo)向路徑。如下圖所示,1/2號槽位所連接的端口與服務(wù)器Sled1所連接的端口處于紅色分區(qū)之內(nèi),3/4槽位與服務(wù)器Sled2處于黃色分區(qū)。而5/6/7/8槽位、存儲Sled、服務(wù)器Seld3則同處于藍(lán)色分區(qū)內(nèi)。意味著,服務(wù)器Sled3會識別到5/6/7/8槽位上的PCI-E卡(如有),同時識別到存儲Sled上的RAID卡。
基于Web的配置界面,通過連接到BMC,可以對整個FX2平臺所囊括的所有Sled進(jìn)行全局配置,包括分配對應(yīng)的PCI-E槽位,也就是底層的對PCI-E Switch的分區(qū)操作。
通過對PCI-E Switch分區(qū)功能的靈活運(yùn)用,Dell PowerEdge FX2平臺可以實現(xiàn)后面8個PCI-E設(shè)備的靈活分配,從而更好的適配日益靈活的應(yīng)用場景和業(yè)務(wù)需求。
審核編輯:劉清
評論
查看更多