天天看點

伺服器中加速BIOS啟動的方法

  對于用于一線的主伺服器而言,年均當機時間是衡量其穩定性的重要名額。是以,系統出現故障後,能夠盡快恢複尤其重要。在現在的高端伺服器中,CPU有多個,記憶體容量日益增加,有的多達512G甚至達到數T容量,接入的PCIE闆卡也越來越多,這極大地增加了BIOS系統自檢和裝置掃描的時間。此外,由于傳統BIOS的設計,冷啟動比熱啟動本身就需要多耗費幾倍的時間。例如,本人在一款最新的基于Intel E5雙CPU的伺服器上的測試表明,冷啟動到GRUB需要195秒,而熱啟動隻需要52秒。為什麼冷啟動比熱啟動需要耗費多得多的時間?有沒有哪些措施來加快BIOS啟動呢?

    帶着這些疑問,結合之前在某國産CPU BIOS上的工作經驗,仔細閱讀了Intel BIOS Write Guide,有下面的一些思考和發現,希望能夠起到抛磚引玉的作用。

    每顆Intel E5晶片都是多核心,在BIOS啟動的過程中,它會根據CPU ID和約定的機制決定哪顆CPU是Bootsrap Processor (BSP),哪顆CPU是Application Processor(AP)。通常BSP會用來做大部分的系統初設化的工作,包括初設化Cache/TLB/Memory Controler/PCIE Root complex和裝置,而AP大部分時間處于等待狀态,直到BSP完成主要的任務,發送核間中斷來喚醒AP。事實上BSP完成的主要任務,AP也能夠協助完成。對每個核而言,它自己内部的Cache、TLB都可以由自己獨立初始化。連接配接外設上的多個PCIE Root Port和對應的卡,也可以由AP協助完成。這樣一來,k個處理器器的Cache/TLB/IIO/PCIE等内部子產品的初始化的時間,并發執行後可以縮減到初始化一個處理器内部Cache/TLB/IIO/PCIE的時間。

    此外,在做記憶體控制器初始化時候,會經過記憶體布局掃描、控制器參數訓練、記憶體讀寫自測等步驟。這個階段,AP同樣能夠分擔BSP控制器的工作,完成記憶體自檢自測的工作,這就能夠最大程度地并行地做系統自檢和裝置掃描初始化。這樣一來,假設之前系統初始化需要耗時T,系統有n個處理器,并行化後,初始化的時間能夠縮減到T/n。在這個階段也可以做許多優化:

    第一、僅在記憶體布局和序列号改變的情況下,重新訓練控制器參數。記憶體的某些參數和具體記憶體型号、主機闆布線等相關,為了适應這些不同,第一次啟動或者冷啟動之後,需要經過訓練這些參數才能适配具體的闆卡和配置。但是在熱啟動的時候,如果通過Smbus/i2c檢測到記憶體布局和型号都沒有改變,可以直接使用上一次儲存的參數,然後接着做後面的記憶體讀寫自測。這樣就可以節省出記憶體參數訓練的時間。對一般DDR控制器而言,記憶體參數訓練往往占了記憶體初始化的大部分時間。這就要求在每次訓練完DDR控制器的控制參數之後,能夠把這些參數儲存到非易失性存儲媒體上,比如flash或者eerom。因為這個時候記憶體并沒有初始化好,堆棧無法建立起來,需要通過較複雜的彙編語言來實作讀寫flash/eerom。當然如果約定好了調用接口,并且有足夠多的寄存器可用,這個階段應該也可以使用基于寄存器堆棧的C語言程式設計實作。

    第二、利用多個處理器并發執行記憶體自檢測試。在記憶體初始化的一個關鍵步驟就是,需要執行多種模式的記憶體讀寫測試,以確定使用的記憶體參數能夠支援多種情況下的記憶體讀寫都正确無誤。傳統的方法是多個測試模式逐一在CPU上運作,判斷讀寫的值是否一緻。事實上,這個階段完全可以充分利用多核處理器的優點,同一個處理器上的其它核都可以同時配置設定不同的模式,然後同時執行。這樣既可以驗證參數的正确性,同時也是對連接配接到這個CPU上的DDR控制器的一個壓力測試。

    第三、利用多個處理器并發執行記憶體初始化。現在的高端伺服器,不管是為了提高性能,還是為了實作Activate-Active/Active-Pass的High Availablilty,都很可能有不止一個處理器。每個處理器上有一個或多個記憶體控制器,都需要初始化。傳統的方法是這些工作都交由BSP去做,AP隻用等待其完成就好。其實,理論上每個記憶體控制器都可以交由多核處理器上的一個核完成,通常可以選用和記憶體控制器挨着較近的處理器核。這樣m個記憶體控制器初始化的時間可以優化成接近一個記憶體控制器初始化的時間。

    除了上述并行處理的通用方法之外,還可以根據CPU提供的特性來加快BIOS啟動。有的CPU重新開機後,既支援從LPC Flash取指,也支援從SPI Flash取指執行。從LPC總線取指令的速度比從SPI Flash取指令的速度滿很多,啟動模式從LPC改成SPI就能明顯加快BIOS啟動。這也就是為什麼現在大部分處理器都使SPI Flash取指的原因。有的CPU還支援進階的Cache的操作,能夠把最近通路指令或資料的相鄰指令或資料緩存到Cache中去,後面的通路都會從Cache去執行,這比從SPI Flash通路資料或者指令會塊上幾個數量級。最後,如果BIOS啟動階段有很多定向到慢速接口的輸出(比如序列槽),也會明顯影響BIOS啟動速度,是以盡可能去掉不必要的序列槽輸出,也會提高BIOS啟動速度。

綜上所述,可以通過并行化、利用CPU特性加快BIOS啟動,減少系統當機時間,提高使用者體驗。

本文轉自存儲之廚51CTO部落格,原文連結:http://blog.51cto.com/xiamachao/1691096 ,如需轉載請自行聯系原作者

繼續閱讀