鄭媛 康艷麗 孫建英
摘要:在服務(wù)器系統(tǒng)中,PCIe設(shè)備已成為不可或缺的組成部分,由于各種原因,會遇到非常低概率的PCIe設(shè)備在啟動過程丟失問題,對服務(wù)器的正常運行造成嚴(yán)重的影響。服務(wù)器啟動過程的檢測PCIe設(shè)備丟失及恢復(fù)的功能,通過檢測PCIe設(shè)備在啟動過程中的鏈路訓(xùn)練結(jié)果,實現(xiàn)對設(shè)備丟失情況的監(jiān)測,并在發(fā)現(xiàn)設(shè)備丟失時采取相應(yīng)的恢復(fù)措施,經(jīng)實驗驗證,該方法可以有效提高服務(wù)器的運行穩(wěn)定性和可靠性,避免因PCIe設(shè)備丟失而造成的損失。
關(guān)鍵詞:服務(wù)器;啟動過程;PCIe;丟失檢測;恢復(fù)
中圖分類號:TP306? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2023)34-0091-03
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID)
0 引言
隨著云計算和大數(shù)據(jù)的快速發(fā)展,數(shù)據(jù)中心服務(wù)器數(shù)量呈爆發(fā)式增長。PCIe設(shè)備是服務(wù)器中的重要組成部分,PCIe千兆萬兆網(wǎng)卡設(shè)備支撐大型局域網(wǎng);PCIe磁盤陣列卡提高了存儲容量及存儲性能;圖形處理器GPU提供了更強大的圖片處理能力;還有HBA[1]卡,HCA[2]卡,固態(tài)硬盤(NVMe) ,新興的智能網(wǎng)卡[3](SmartNIC) 等。它們的穩(wěn)定性對服務(wù)器的正常運行有著至關(guān)重要的影響。然而,由于各種原因,如硬件故障、驅(qū)動程序錯誤或兼容性問題等,PCIe設(shè)備可能會出現(xiàn)丟失情況,一旦發(fā)生將嚴(yán)重影響系統(tǒng)的穩(wěn)定性和可靠性。
在服務(wù)器的硬件系統(tǒng)中,UEFI平臺是一種新的固件接口標(biāo)準(zhǔn),取代了傳統(tǒng)的BIOS,實現(xiàn)開機啟動過程對服務(wù)器主板上硬件以及各種輸入輸出設(shè)備的初始化、設(shè)備驅(qū)動程序和配置管理程序等,為計算機提供最底層的硬件設(shè)置和控制,可以為PCIe設(shè)備的故障檢測提供最直接信息,為故障恢復(fù)提供最快速的修復(fù)方法。
1 啟動過程中PCIe設(shè)備檢測現(xiàn)狀
目前,在服務(wù)器啟動過程中,UEFI固件代碼會檢測PCIe設(shè)備降速降帶寬故障和AER錯誤,使用封裝的IPMI命令,通過服務(wù)器主板上帶外管理固件BMC (Baseboard Management Controller,基板管理控制器)連接的KCS[4]接口,將PCIe故障上報給BMC,記錄故障信息到BMC SEL[5]日志中。但是,啟動過程沒有及時預(yù)警或上報PCIe設(shè)備丟失情況,多數(shù)情況都是啟動到系統(tǒng)下才能發(fā)現(xiàn)有PCIe設(shè)備丟失故障。啟動過程中的低概率PCIe設(shè)備丟失問題由于發(fā)生概率比較低,分析驗證耗時長,收效甚微,對服務(wù)器生產(chǎn)和用戶運維都會有很大影響。因此,如何快速準(zhǔn)確地檢測低概率PCIe設(shè)備的丟失情況并采取相應(yīng)的恢復(fù)措施成為一個重要的問題。
2 啟動過程中PCIe設(shè)備丟失原因分析
在服務(wù)器啟動過程,PCIe設(shè)備丟失問題多數(shù)跟PCIe鏈路訓(xùn)練[6](Link Training) 出現(xiàn)問題有關(guān)。PCIe設(shè)備的鏈路訓(xùn)練是由PCIe鏈路物理層[7]的鏈路訓(xùn)練狀態(tài)機(LTSSM[8]) 自動完成,PCIe鏈路雙方通過自動協(xié)商鏈路速率和帶寬,調(diào)節(jié)發(fā)送和接收參數(shù),從而使得PCIe鏈路達(dá)到最佳信號質(zhì)量。
以英特爾X86服務(wù)器為例,最新X86服務(wù)器處理器集成IO(Integrated IO,以下簡稱IIO) 提供PCIe根端口,可以配置X2,X4,X8,X16等帶寬,提供GEN1、GEN2、GEN3、GEN4、GEN5速率支持。UEFI固件中的英特爾參考代碼IIO的初始化部分,分為IIO早期鏈路訓(xùn)練和IIO后期鏈路訓(xùn)練兩個階段。IIO早期鏈路訓(xùn)練階段之前,UEFI固件先要根據(jù)主板硬件設(shè)計,主要配置IIO PCIe根端口的帶寬,IIO早期鏈路訓(xùn)練階段,為PCIe根端口在鏈接訓(xùn)練之前進行鏈路時鐘,鏈路均衡值等相關(guān)寄存器設(shè)置,啟動PCIe根端口的鏈接訓(xùn)練。IIO后期鏈路訓(xùn)練階段開始時,所有PCIe的根端口鏈路訓(xùn)練已經(jīng)完成,該階段主要任務(wù)是為PCIe設(shè)備枚舉、資源分配及加載驅(qū)動程序之前配置所有PCIe接口,初始化IIO DMI和PCIe根端口相關(guān)PCI配置空間寄存器。
在IIO后期鏈路訓(xùn)練階段開始時,輪詢所有IIO PCIe根端口,檢查鏈路狀態(tài)。讀取PCIe根端口配置空間鏈路狀態(tài)寄存器(Link Status Register) ,如果檢查到bit[3:0]當(dāng)前鏈路速值(Current Link Speed) 和 bit[9:4] 協(xié)商鏈路帶寬值(Negotiated Link Width) 為非零值,而bit[13] 數(shù)據(jù)鏈路層鏈路激活值(Data Link Layer Link Active) 值(該位表示數(shù)據(jù)鏈路控制和管理狀態(tài)機的狀態(tài),返回值為1表示設(shè)備正常工作的狀態(tài),否則返回0) 為零,表示該PCIe根端口鏈路訓(xùn)練沒有完成,IIO參考代碼當(dāng)前操作是將該PCIe根端口隱藏,后續(xù)不再對該PCIe端口進行枚舉及分配PCIe相關(guān)資源,從而出現(xiàn)服務(wù)器啟動階段PCIe設(shè)備丟失的情況。
3 PCIe設(shè)備丟失檢測及恢復(fù)功能設(shè)計
為了解決啟動過程中因鏈路訓(xùn)練導(dǎo)致PCIe設(shè)備低概率丟失問題,對英特爾IIO參考代碼部分進行了改進。在IIO后期鏈路訓(xùn)練階段開始時,讀取PCIe鏈路訓(xùn)練相關(guān)寄存器信息,如果發(fā)現(xiàn)PCIE鏈路失敗,在服務(wù)器啟動階段屏幕顯示,并向BMC發(fā)送告警信息,記錄到BMC SEL日志中。然后對PCIe設(shè)備發(fā)送熱重置命令,重新進行PCIe鏈路訓(xùn)練,如果嘗試多次熱重置命令不能使PCIe鏈路恢復(fù),再通過執(zhí)行重啟系統(tǒng)命令的方式來恢復(fù)。
3.1 PCIe設(shè)備丟失檢測及恢復(fù)功能原理
在IIO后期鏈路訓(xùn)練階段開始,輪詢讀取PCIe根端口鏈路狀態(tài)寄存器值時:
1) 判斷當(dāng)前IIO PCIe根端口鏈路PCI配置空間鏈路狀態(tài)寄存器的當(dāng)前鏈路速率值和協(xié)商鏈路帶寬值是否為0。如果為0,說明該根端口沒有接入PCIe設(shè)備,繼續(xù)輪詢下一個;如果不為0,判斷數(shù)據(jù)鏈路層鏈路激活值是否為0,如果不為0,說明IIO PCIe根端口和PCIe設(shè)備鏈路訓(xùn)練完成,繼續(xù)輪詢下一個;如果為0,PCIE鏈路訓(xùn)練沒有完成,該PCIe根端口沒有激活。
2) 在這種數(shù)據(jù)鏈路層鏈路激活值為0情況下:
①首先通過編寫代碼將鏈路失敗PCIe根端口的BDF(Bus,Device,F(xiàn)unction,總線號,設(shè)備號,功能號)信息,紅色字體顯示到屏幕進行預(yù)警。用戶通過查看屏幕顯示及時了解到具體的PCIe設(shè)備有出現(xiàn)鏈路訓(xùn)練失敗情況。
②其次將對應(yīng)當(dāng)前PCIe根端口的BDF信息通過跟BMC約定自定義命令格式,通過IPMI命令發(fā)送給BMC,記錄具體PCIe根端口鏈路訓(xùn)練失敗情況到BMC SEL日志,便于后面用戶檢查SEL告警日志。
③然后增加功能代碼對鏈路訓(xùn)練失敗PCIe根端口進行恢復(fù)操作,嘗試對當(dāng)前PCIe根端口的橋控制寄存器(Bridge Control Register) 的bit[6]二次總線復(fù)位值(Secondary Bus Reset) 去寫1,通過軟件方式讓該PCIe根端口觸發(fā)熱重置,重新進行鏈路訓(xùn)練。
④PCIe鏈路訓(xùn)練是PCIe根端口和PCIe設(shè)備之間物理層的硬件行為,UEFI固件設(shè)置等待時間,待PCIe鏈路訓(xùn)練完成,再去判斷當(dāng)前PCIe根端口的鏈路狀態(tài)寄存器中數(shù)據(jù)鏈路層鏈路激活值是否為1,同時讀取當(dāng)前鏈路速率值和協(xié)商鏈路帶寬值是否達(dá)到該設(shè)備的預(yù)期值,即該PCIe設(shè)備是否達(dá)到支持的標(biāo)稱速率和帶寬。如果條件不滿足,則嘗試再次對該PCIe根端口熱重置,再次進行鏈路訓(xùn)練。
⑤對該PCIe根端口熱重置3次后,如果其數(shù)據(jù)鏈路層鏈路激活值仍為0, 或讀取當(dāng)前鏈路速率值和協(xié)商鏈路帶寬值一直沒有達(dá)到預(yù)期設(shè)置,再次記錄PCIe設(shè)備鏈路訓(xùn)練失敗情況到BMC SEL日志,UEFI固件通過執(zhí)行ResetSystem命令讓系統(tǒng)重啟,重新跑IIO初始化階段,恢復(fù)PCIe設(shè)備重新識別。
⑥如果熱重置后,PCIe根端口的數(shù)據(jù)鏈路層鏈路激活值為1,當(dāng)讀取當(dāng)前鏈路速率值和協(xié)商鏈路帶寬值也達(dá)到預(yù)期設(shè)置,繼續(xù)輪詢其他 PCIe根端口。
3) 所有IIO PCIe根端口輪詢結(jié)束,服務(wù)器啟動過程繼續(xù)執(zhí)行。服務(wù)器啟動過程中,對PCIe設(shè)備丟失檢測和恢復(fù),具體流程圖如圖1所示。
3.2 PCIe設(shè)備丟失檢測及恢復(fù)功能驗證
針對PCIe設(shè)備丟失問題驗證,設(shè)計兩個實驗來驗證功能的有效性。
首先在研發(fā)實驗室搭建服務(wù)器驗證機臺,將導(dǎo)入PCIe設(shè)備丟失檢測及恢復(fù)功能的UEFI固件版本更新到待驗證服務(wù)器上。通過對服務(wù)器啟動過程中PCIe設(shè)備注錯測試,驗證該功能是否可以有效解決PCIe設(shè)備丟失后再恢復(fù)的問題。
然后對實際故障服務(wù)器機器進行驗證,將復(fù)現(xiàn)過啟動過程中PCIe設(shè)備丟失問題的PCIe設(shè)備和主板等設(shè)備搭建服務(wù)器測試機器一共3臺,進行穩(wěn)定性測試驗證。先用測試機器跑穩(wěn)定性驗證跑出PCIe設(shè)備丟失問題,再將導(dǎo)入PCIe設(shè)備丟失檢測及恢復(fù)功能的UEFI固件版本更新到待測服務(wù)器機器上,然后再進行穩(wěn)定性驗證。BMC SEL解析日志記錄到的PCIe根端口鏈路失敗的日志如圖2所示。
4 結(jié)論
歷時數(shù)月,通過模擬注錯和實際搭建PCIe丟卡服務(wù)器測試機器長達(dá)數(shù)十萬次穩(wěn)定性驗證,實驗結(jié)果表明,該PCIe設(shè)備丟失檢測及恢復(fù)功能設(shè)計能夠有效檢測上報PCIe設(shè)備的丟失情況,并對PCIe設(shè)備進行恢復(fù)鏈路訓(xùn)練,讓PCIe設(shè)備重新被識別,保證了服務(wù)器系統(tǒng)的穩(wěn)定性和可靠性,對工廠服務(wù)器生產(chǎn)測試和用戶運維管理具有一定的應(yīng)用價值。
參考文獻(xiàn):
[1] 俞則人,柴小麗,陸偉.基于FPGA的光纖通道HBA卡設(shè)計與實現(xiàn)[J].信息技術(shù),2015,39(10):206-209.
[2] 謝林甫.面向InfiniBand控制器的PCI Express接口設(shè)計實現(xiàn)[D].成都:電子科技大學(xué),2016.
[3] 王祎晨.一種ARM架構(gòu)SOC智能網(wǎng)卡設(shè)計及路由優(yōu)化方法[J].中國科技信息,2023(5):85-87.
[4] 汪濤.服務(wù)器基本輸入輸出系統(tǒng)和基板管理控制器之間紅魚接口的設(shè)計實現(xiàn)[J].信息記錄材料,2022,23(3):154-156.
[5] 楊金穎,高文煒,羅雪,等.基于VPX平臺的國產(chǎn)BMC設(shè)計與實現(xiàn)[J].微電子學(xué)與計算機,2021,38(8):80-86.
[6] 王齊.PCI Express 體系結(jié)構(gòu)導(dǎo)讀[M].北京:機械工業(yè)出版社,2010.
[7] 張亮.PCIe總線物理層的設(shè)計與驗證[D].西安:西安電子科技大學(xué),2013.
[8] 布達(dá)科.PCI Express系統(tǒng)體系結(jié)構(gòu)標(biāo)準(zhǔn)教材[M].田玉敏,譯.北京:電子工業(yè)出版社,2005.
【通聯(lián)編輯:代影】