進行 Linux 內核與固件開發的時候,每每須要屢次的重啓,會浪費大把的時間。 |
在全部我擁有或使用過的電腦中,啓動最快的那臺是 20 世紀 80 年代的電腦。在你把手從電源鍵移到鍵盤上的時候,BASIC 解釋器已經在等待你輸入命令了。對於現代的電腦,啓動時間從筆記本電腦的 15 秒到小型家庭服務器的數分鐘不等。爲何它們的啓動時間有差異?linux
那臺直接啓動到 BASIC 命令行提示符的 20 世紀 80 年代微電腦,有着一顆很是簡單的 CPU,它在通電的時候就當即開始從一個內存地址中獲取和執行指令。由於這些系統的 BASIC 在 ROM 裏面,基本不須要載入的時間——你很快就進到 BASIC 命令提示符中了。同時代更加複雜的系統,好比 IBM PC 或 Macintosh,須要一段可觀的時間來啓動(大約 30 秒),儘管這主要是由於須要從軟盤上讀取操做系統的緣故。在能夠加載操做系統以前,只有很小一部分時間是花費在固件上的。緩存
現代服務器每每在從磁盤上讀取操做系統以前,在固件上花費了數分鐘而不是數秒。這主要是由於現代系統日益增長的複雜性。CPU 再也不可以只是運行起來就開始全速執行指令,咱們已經習慣於 CPU 頻率變化、節省能源的待機狀態以及 CPU 多核。實際上,在現代 CPU 內部有數量驚人的更簡單的處理器,它們協助主 CPU 核心啓動並提供運行時服務,好比在過熱的時候壓制頻率。在絕大多數 CPU 架構中,在你的 CPU 內的這些核心上運行的代碼都以不透明的二進制 blob 形式提供。服務器
在 OpenPOWER 系統上,全部運行在 CPU 內部每一個核心的指令都是開源的。在有 OpenBMC(好比 IBM 的 AC922 系統和 Raptor 的 TALOS II 以及 Blackbird 系統)的機器上,這還延伸到了運行在基板管理控制器Baseboard Management Controller上的代碼。這就意味着咱們能夠一探究竟,到底爲何從接入電源線到顯示出熟悉的登陸界面花了這麼長時間。架構
若是你是內核相關團隊的一員,你可能啓動過許多內核。若是你是固件相關團隊的一員,你可能要啓動許多不一樣的固件映像,接着是一個操做系統,來確保你的固件仍能工做。若是咱們能夠減小硬件的啓動時間,這些團隊能夠更有生產力,而且終端用戶在搭建系統或重啓安裝固件或系統更新的時候會對此表示感激。優化
過去的幾年,Linux 發行版的啓動時間已經作了不少改善。現代的初始化系統在處理並行和按需任務上作得很好。在一個現代系統上,一旦內核開始執行,它能夠在短短數秒內進入登陸提示符界面。這裏短短的數秒不是優化啓動時間的下手之處,咱們要到更早的地方:在咱們到達操做系統以前。操作系統
在 OpenPOWER 系統上,固件經過啓動一個存儲在固件閃存芯片上的 Linux 內核來加載操做系統,它運行一個叫作 Petitboot 的用戶態程序去尋找用戶想要啓動的系統所在磁盤,並經過 kexec 啓動它。有了這些優化,啓動 Petitboot 環境只佔了啓動時間的百分之幾,因此咱們還得從其餘地方尋找優化項。命令行
在 Petitboot 環境啓動前,有一個先導固件,叫作 Skiboot,在它以前有個 Hostboot。在 Hostboot 以前是 Self-Boot Engine,一個晶圓切片(die)上的單獨核心,它啓動單個 CPU 核心並執行來自 Level 3 緩存的指令。這些組件是咱們能夠在減小啓動時間上取得進展的主要部分,由於它們花費了啓動的絕大部分時間。或許這些組件中的一部分沒有進行足夠的優化或儘量作到並行?blog
另外一個研究路徑是重啓時間而不是啓動時間。在重啓的時候,咱們真的須要對全部硬件從新初始化嗎?內存
正如任何現代系統那樣,改善啓動(或重啓)時間的方案已經變成了更多的並行執行、解決遺留問題、(能夠認爲)做弊的結合體。ci