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