對於用於一線的主服務器而言,年均宕機時間是衡量其穩定性的重要指標。所以,系統出現故障後,可以儘快恢復尤爲重要。在如今的高端服務器中,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。在這個階段也能夠作許多優化:併發
第1、僅在內存佈局和序列號改變的狀況下,從新訓練控制器參數。內存的某些參數和具體內存型號、主板佈線等相關,爲了適應這些不一樣,第一次啓動或者冷啓動以後,須要通過訓練這些參數才能適配具體的板卡和配置。可是在熱啓動的時候,若是經過Smbus/i2c檢測到內存佈局和型號都沒有改變,能夠直接使用上一次保存的參數,而後接着作後面的內存讀寫自測。這樣就能夠節省出內存參數訓練的時間。對通常DDR控制器而言,內存參數訓練每每佔了內存初始化的大部分時間。這就要求在每次訓練完DDR控制器的控制參數以後,可以把這些參數保存到非易失性存儲介質上,好比flash或者eerom。由於這個時候內存並無初始化好,堆棧沒法創建起來,須要經過較複雜的彙編語言來實現讀寫flash/eerom。固然若是約定好了調用接口,而且有足夠多的寄存器可用,這個階段應該也可使用基於寄存器堆棧的C語言編程實現。ide
第2、利用多個處理器併發執行內存自檢測試。在內存初始化的一個關鍵步驟就是,須要執行多種模式的內存讀寫測試,以確保使用的內存參數可以支持多種狀況下的內存讀寫都正確無誤。傳統的方法是多個測試模式逐一在CPU上運行,判斷讀寫的值是否一致。事實上,這個階段徹底能夠充分利用多核處理器的優勢,同一個處理器上的其它核均可以同時分配不一樣的模式,而後同時執行。這樣既能夠驗證參數的正確性,同時也是對鏈接到這個CPU上的DDR控制器的一個壓力測試。佈局
第3、利用多個處理器併發執行內存初始化。如今的高端服務器,不論是爲了提升性能,仍是爲了實現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啓動,減小系統宕機時間,提升用戶體驗。優化