1. 程式人生 > >PCIe Switch高階功能及應用

PCIe Switch高階功能及應用

PCI-E Switch晶片,估計不少人已經聽說過這個東西了。但是估計多數人對其基本功能知之甚少。PCI-E Switch作為最先進的生產力,已經被廣泛應用在了傳統儲存系統,以及少量品牌/型號的伺服器平臺。 筆者作為擁有全球最領先PCI-E Switch產品的PMC-Sierra公司的系統架構師,想在這裡為大家普及一下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.FanoutFanout(擴充套件、擴開、散開的意思)是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。 PMC-Sierra公司Switchtec旗下的PCI-E Switch產品則支援動態分配。具體的實現手段筆者就不能透露了。不過,對於內行開發者來講,這些都不是問題,問題是對應的晶片內部的架構是否足夠靈活可配置,這是限制高階功能設計的關鍵。 2.Fabric上文中說過,不管是PCI-X還是PCI-E體系標準內,只支援樹形拓撲。樹形拓撲的問題在於,路徑過長,整個網路的直徑太大。另外,無法實現冗餘,一旦某個鏈路故障,鏈路後方的分支全部無法訪問。 於是, 支援Fabric成了一個非常複雜的高階功能。這個場景目前還很少有人使用,對於整機架伺服器比如天蠍等,其對這項功能興趣則比較大。然而,目前這個技術的實現還非常初級不完善,也沒有形成標準。

3.IOVSR-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則必須在PCI-E switch上做額外處理才可以支援。原因還是因為多個獨立系統之間是互不溝通的,如果都嘗試對PCI-E匯流排進行配置會衝突。PCI-E Switch針對MR-IOV的支援基本手段,還是靠增加一層地址對映管理來實現。 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裝置的靈活分配,從而更好的適配日益靈活的應用場景和業務需求。