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