李仁剛,任智新 ,王江為,闞宏偉,張 闖,公維鋒
1.高效能服務(wù)器和存儲技術(shù)國家重點實驗室,濟(jì)南 250013
2.浪潮電子信息產(chǎn)業(yè)股份有限公司,濟(jì)南 250013
隨著“云計算”在學(xué)術(shù)及工業(yè)界的成功,數(shù)以萬計的服務(wù)器分布在國內(nèi)外各云平臺廠家的數(shù)據(jù)中心中,而且數(shù)量和規(guī)模還在不斷的增長[1-2]。高可靠性是云計算平臺的一個重要指標(biāo),很多重要的應(yīng)用,比如金融軟件、醫(yī)療服務(wù)、電子商務(wù)等部署在這些服務(wù)器集群中。這類應(yīng)用一旦發(fā)生故障,會造成不同程度的經(jīng)濟(jì)損失甚至影響生命安全[3]。
內(nèi)存故障雖然已不如計算機(jī)發(fā)展早期時那樣普遍,但是在數(shù)據(jù)中心里,即便是小概率的故障,一旦發(fā)生,可能就是災(zāi)難性的、無可挽回的,所以在內(nèi)存發(fā)生故障時,高效保護(hù)內(nèi)存數(shù)據(jù)是一項不容忽視的工作。雖然業(yè)界已經(jīng)提出了各種各樣內(nèi)存數(shù)據(jù)保護(hù)技術(shù),但在普遍性、通用性、開發(fā)難度上很難做到兼容,故本文提出一種基于FPGA 的實現(xiàn)方法,不僅可以恢復(fù)大塊故障數(shù)據(jù),加入的設(shè)備對計算機(jī)系統(tǒng)透明無需在軟硬件上做其他處理,并且支持在線替換。
Schroeder 等人曾經(jīng)做了一次為期兩年的內(nèi)存故障追蹤,樣本是谷歌的數(shù)據(jù)中心Warehouse-Scale Computers(WSC)內(nèi)數(shù)十萬臺服務(wù)器[4],實驗發(fā)現(xiàn),每年大約有三分之一的服務(wù)器遭遇過內(nèi)存錯誤,平均22 000次可糾正錯誤和1 次不可糾正錯誤。對于這三分之一的服務(wù)器,每2.5小時就要糾正1次內(nèi)存錯誤,而在一個僅有奇偶校驗位錯誤保護(hù)的WSC 中,每發(fā)生一個內(nèi)存奇偶校驗位錯誤,服務(wù)器都必須重新啟動,這一特性會將價值1.5億美元的設(shè)施性能降低6%[5]。德國的一項研究數(shù)據(jù)表明,一些宇宙射線等會對內(nèi)存數(shù)據(jù)造成軟件破壞[6],除此之外,還可能發(fā)生內(nèi)存芯片內(nèi)部短路或其他原因?qū)е聝?nèi)存的物理性損壞,總之,內(nèi)存故障發(fā)生率遠(yuǎn)超過大多數(shù)人的常規(guī)認(rèn)知。
為了降低內(nèi)存故障引起的服務(wù)器重啟或者宕機(jī)發(fā)生率,業(yè)界提出了在軟件和硬件上更好保護(hù)數(shù)據(jù)的方法[7]。硬件上常見的是加入ECC(Error Correcting Code,錯誤檢查和糾正)功能,可做到單bit 糾錯多bit 上報,但是當(dāng)大塊內(nèi)存數(shù)據(jù)出錯時,無論是高級ECC[8]還是Chipkill[9](一種ECC 內(nèi)存保護(hù)技術(shù))技術(shù),都無能為力。而內(nèi)存熱備份技術(shù)[10]是對工作內(nèi)存進(jìn)行完全的備份,當(dāng)出現(xiàn)大塊故障時,可使用備份內(nèi)存的數(shù)據(jù),保證系統(tǒng)正常工作。若使用計算機(jī)系統(tǒng)的內(nèi)存控制器實現(xiàn)該功能,無疑會增加軟件的工作量、系統(tǒng)研制難度及周期,若使用專用芯片代替軟件處理方式,雖然在處理速度上更勝一籌,但是不具備良好的通用性,不同的服務(wù)器不同的內(nèi)存協(xié)議,都需要開發(fā)新的芯片,造成成本和研發(fā)周期的增加。
FPGA 是目前最常用來處理高速數(shù)據(jù)傳輸?shù)钠骷?,具有良好的并行計算能力,支持電路重?gòu)和流水,并且其比ASIC(專用集成電路)有更好的通用性。本文提出基于FPGA實現(xiàn)內(nèi)存數(shù)據(jù)保護(hù)的方法,不依賴服務(wù)器類型以及軟件的操作系統(tǒng),可以從硬件上提高內(nèi)存可靠性,而且該方法支持熱替換,內(nèi)存發(fā)生故障后,熱備內(nèi)存直接代替故障內(nèi)存繼續(xù)工作,而故障內(nèi)存在不關(guān)機(jī)的情況下可直接被拔掉,更換成新內(nèi)存。另外,該方法對內(nèi)存型號亦不做限制,升級內(nèi)存時,可升級FPGA 的燒寫文件,而不需要重新設(shè)計硬件,大大提高了開發(fā)效率。
以FPGA做處理器的內(nèi)存熱備份技術(shù),其工作原理是:具有內(nèi)存熱備份功能的板卡與主控制器接口采用標(biāo)準(zhǔn)的DIMM(Dual-Inline-Memory-Modules,雙列直插式存儲模塊)接口(1路),服務(wù)器像訪問標(biāo)準(zhǔn)內(nèi)存一樣訪問內(nèi)存熱備份卡,而熱備卡帶兩路內(nèi)存條,數(shù)據(jù)備份和故障檢測操作在FPGA中實現(xiàn)。利用這種方式,任意一個計算機(jī)都可以通過加入熱備卡的方式實現(xiàn)內(nèi)存熱備份,而計算機(jī)硬件及軟件不需要做改變。
系統(tǒng)實現(xiàn)框圖如圖1所示,控制指令和寫數(shù)據(jù)從服務(wù)器端下發(fā),F(xiàn)PGA將寫數(shù)據(jù)加入校驗碼后同時寫到兩個DDR內(nèi)存中;主機(jī)讀取DDR數(shù)據(jù)時,F(xiàn)PGA同時讀取兩個內(nèi)存的數(shù)據(jù),進(jìn)行校驗,正常情況下會選擇主內(nèi)存數(shù)據(jù)反饋給服務(wù)器,當(dāng)主內(nèi)存出現(xiàn)故障時,F(xiàn)PGA 會自動將熱備內(nèi)存中的數(shù)據(jù)反饋給服務(wù)器,不會有數(shù)據(jù)延遲、斷層等現(xiàn)象發(fā)生。
圖1 系統(tǒng)實現(xiàn)框圖
內(nèi)存熱備份卡對服務(wù)器來說是一個標(biāo)準(zhǔn)內(nèi)存,由FPGA 控制的備份內(nèi)存對主機(jī)不可見。內(nèi)存的上電初始化時序控制、預(yù)充電、刷新、讀寫等命令都由主機(jī)控制。FPGA 實現(xiàn)內(nèi)存Physical(PHY,端口物理層)接口、命令解析、冗余控制以及解碼和通路選擇功能。邏輯實現(xiàn)功能如圖2所示。
圖2 FPGA實現(xiàn)的邏輯功能圖
為了滿足CPU操作DDR的讀寫時序[11],F(xiàn)PGA須保證在協(xié)議規(guī)定的時間內(nèi)完成所有的操作。本文在設(shè)計之初對Altera和Xilinx兩大FPGA廠商的相關(guān)IP進(jìn)行對比分析[12],主要是對內(nèi)部集成的DDR 控制器以及高速接口IP[13]的延時做了對比驗證,結(jié)果如表1所示(單位是系統(tǒng)主頻時鐘周期個數(shù))。
表1 IP延時值
經(jīng)過仿真驗證,使用FPGA內(nèi)集成的DDR_Controller(MIG)或者其他接口IP,都無法滿足CPU對內(nèi)存讀延時的要求。故本文采用FPGA 底層原語[14],用搭積木的方式實現(xiàn)PHY接口,實現(xiàn)雙倍速率數(shù)據(jù)的采集。
PHY 接口根據(jù)所連接的對象不同而分成兩種:(1)與服務(wù)器主板DIMM接口互聯(lián)的作為“內(nèi)存接口”的PHY_Dev;(2)與兩個內(nèi)存 DIMM 接口互聯(lián)作為“控制器接口”的PHY_Host接口,兩種接口因功能不同而采用不同的實現(xiàn)方式。
(1)PHY_Dev接口實現(xiàn)
根據(jù)DIMM 接口的數(shù)據(jù)頻率和FPGA 工作頻率之比,可選擇I/ODDR 或者輸入輸出串并轉(zhuǎn)換器(I/Oserdes)原語做數(shù)據(jù)串/并、并/串轉(zhuǎn)換,文本為了達(dá)到最優(yōu)的性能,采用了寫側(cè)通路頻率比2∶1、讀側(cè)通路頻率比1∶1的方式實現(xiàn),具體如圖3所示。
根據(jù)數(shù)據(jù)類型的不同,每種接口在FPGA邏輯內(nèi)部又分為命令(CMD)通路和數(shù)據(jù)/數(shù)據(jù)選通(DQ/DQS)通路??刂破靼l(fā)起的命令數(shù)據(jù)CMD,在FPGA 內(nèi)屬于單向?qū)懲ǖ?,進(jìn)入FPGA 后先經(jīng)過輸入緩存(IBUF);接著經(jīng)過輸入延遲模塊(IDELAY)進(jìn)入ISERDES,完成雙倍速率及上下沿數(shù)據(jù)的采集(一個FPGA 周期采集4 Byte數(shù)據(jù)),最后進(jìn)入邏輯命令解析模塊;對于DQ 數(shù)據(jù),是雙向的,從控制器下發(fā)到邏輯時是寫通路,同樣使用ISERDES原語,完成雙倍速率及DDR雙沿數(shù)據(jù)的轉(zhuǎn)換;而讀通路即數(shù)據(jù)輸出給控制器,此時邏輯工作頻率與接口頻率一致,使用ODDR 完成雙沿數(shù)據(jù)的轉(zhuǎn)換即可;對于DQS數(shù)據(jù)選通信號,雖然從屬性上也是雙向的,但從控制器下發(fā)到FPGA 邏輯后,數(shù)據(jù)并沒有繼續(xù)傳遞,當(dāng)做單向數(shù)據(jù)處理;輸出時同DQ 一樣,使用了ODDR 原語,在與PAD 接口處使用了IOBUFDS 原語以產(chǎn)生差分信號。使用此方法實現(xiàn)的PHY 接口,延時僅需三個控制器接口頻率周期,大大降低使用FPGA實現(xiàn)內(nèi)存控制時帶來的固有延時,是本文的關(guān)鍵之所在。
(2)PHY_Host接口實現(xiàn)
FPGA與內(nèi)存設(shè)備端PHY接口是Dev側(cè)的逆過程,但實現(xiàn)上要更復(fù)雜,因為要考慮DDR的特性,在進(jìn)入正常數(shù)據(jù)操作之前先由FPGA 控制進(jìn)行讀寫均衡初始化訓(xùn)練操作,PHY組成結(jié)構(gòu)如圖4所示。
其中,DQS的狀態(tài)與Dev側(cè)不同,是雙向的,是由于在寫通路時,由FPGA 產(chǎn)生與數(shù)據(jù)DQ 同步的數(shù)據(jù)選通信號,寫入到內(nèi)存中;而讀通路時,為了保證DQ與DQS的同步,同時將二者經(jīng)過內(nèi)部邏輯后反饋給控制器,所以DQS雙向。
本文僅實現(xiàn)內(nèi)存熱備份的功能,不做內(nèi)存控制,故FPGA解析控制器發(fā)送的命令后,生成內(nèi)部需要的控制信號,控制信號透傳即可。而數(shù)據(jù)的處理是將寫數(shù)據(jù)加入校驗碼之后同時寫到兩個內(nèi)存中,兩個內(nèi)存的數(shù)據(jù)完全一致,互為備份。
當(dāng)主機(jī)發(fā)起讀操作時,F(xiàn)PGA 同時從兩個內(nèi)存讀取數(shù)據(jù),對兩路數(shù)據(jù)進(jìn)行解碼以及故障判斷,若兩路均正確則選擇主內(nèi)存數(shù)據(jù)反饋給主機(jī);若主內(nèi)存故障,F(xiàn)PGA自動將備份內(nèi)存數(shù)據(jù)反饋給主機(jī),完成無縫的數(shù)據(jù)對接,很好地保證了內(nèi)存數(shù)據(jù)的正確性和完整性。同時,F(xiàn)PGA 會發(fā)出故障報警,提醒更換故障內(nèi)存,在不需要關(guān)閉服務(wù)器的情況下,可替換掉故障內(nèi)存。
圖3 PHY_Dev側(cè)接口結(jié)構(gòu)圖
圖4 PHY_Host接口結(jié)構(gòu)圖
但是由于兩個內(nèi)存保存的內(nèi)容完全一致、互為備份,所以實際容量只有一半,帶來功耗及成本的成倍增加,這也是為了滿足高端容錯需求,避免更新設(shè)備時宕機(jī)帶來的損失,實現(xiàn)在線更換內(nèi)存,同時也是滿足了研發(fā)的原型機(jī)中主板控制器的讀延時要求。另外,由于FPGA 的可重配性,當(dāng)不使用熱備份功能時,可以修改FPGA的邏輯功能,只控制一路容量*2的內(nèi)存。
本文使用DDR3內(nèi)存作為測試驗證對象,通過仿真對邏輯功能進(jìn)行驗證。將DDR3 內(nèi)存顆粒模型與自有邏輯進(jìn)行集成后,聯(lián)合仿真。分別對DDR進(jìn)行了刷新、預(yù)充電、激活、寫-讀、寫-寫、讀-讀等操作驗證,功能均正確,且滿足讀延時時序要求,如圖5 為一次讀操作仿真結(jié)果,讀數(shù)據(jù)與寫入的數(shù)據(jù)一致。
在以Xilinx Virtex-6芯片為主控的內(nèi)存熱備份卡硬件平臺上進(jìn)行了驗證,硬件平臺在設(shè)計之初要充分考慮電源及DDR 信號的完整性[15],以滿足高速數(shù)據(jù)傳輸?shù)奶匦?。在驗證初期,F(xiàn)PGA作為控制器發(fā)起對兩個內(nèi)存條的操作,除了基本的刷新、激活、預(yù)充電等操作外,還進(jìn)行了讀寫操作驗證。通過在如圖6 ChipScope 中觀測的驗證結(jié)果可以看出,F(xiàn)PGA 可以正讀寫內(nèi)存,PHY_Host接口的邏輯及硬件電路功能驗證正確。
在與主機(jī)控制器對接測試之前,采用“自測”方式對內(nèi)存熱備份卡作為“內(nèi)存”的功能進(jìn)行測試,即采用一塊功能完全一致的內(nèi)存熱備份卡充當(dāng)“主機(jī)”,將被測板卡插入到“主機(jī)”熱備卡的DIMM插槽中,“主機(jī)”熱備卡的FPGA 發(fā)起控制DDR3 的一系列操作,驗證“內(nèi)存”響應(yīng)是否正確,同樣使用ChipScope 觀測,結(jié)果與圖6 一致,兩塊內(nèi)存熱備份卡自測的驗證平臺如圖7所示,驗證了PHY_Dev接口邏輯及硬件電路功能的正確性。
最后將內(nèi)存熱備份卡插入浪潮高端服務(wù)器原型機(jī)的主板上,驗證與主機(jī)控制器進(jìn)行數(shù)據(jù)交互功能的正確性。目前,插入內(nèi)存熱備份卡的高端服務(wù)器已經(jīng)成功加載完BIOS,進(jìn)入操作系統(tǒng)運(yùn)行應(yīng)用程序。向主內(nèi)存注入故障,系統(tǒng)并沒有因此宕機(jī),可繼續(xù)工作,從而驗證了該方法在工程實踐中的可用性。
圖5 讀操作仿真結(jié)果
圖6 內(nèi)存熱備份卡Host側(cè)接口功能測試結(jié)果
圖7 兩板自測連接圖
本文首次提出了使用FPGA 實現(xiàn)內(nèi)存熱備份的方法,特別地,對于DDR數(shù)據(jù)采集,使用底層IO原語方式實現(xiàn)PHY接口,有效降低了FPGA內(nèi)高速接口數(shù)據(jù)處理的延時,解決了采用FPGA 實現(xiàn)內(nèi)存熱備份存在的瓶頸;同時基于IODELAY 單元實現(xiàn)自動調(diào)整時鐘與數(shù)據(jù)Skew 的方法,解決了寫均衡/讀校準(zhǔn)實現(xiàn)難的問題。利用本方法設(shè)計的內(nèi)存熱備份卡通過了與高端服務(wù)器天梭K1、TS580等機(jī)型適配的測試。該項技術(shù)在高可靠應(yīng)用場景中,比如大規(guī)模部署服務(wù)器的云計算數(shù)據(jù)中心,可有效保護(hù)內(nèi)存數(shù)據(jù),減少由內(nèi)存故障引起的宕機(jī),提高服務(wù)器的可靠性和穩(wěn)定性,進(jìn)而保證特殊行業(yè)的高需求;而且可應(yīng)用在服務(wù)器BIOS 不做任何改動,直接實現(xiàn)內(nèi)存條備份的場景中,具有一定的易操作性及可擴(kuò)展性。