日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践

發(fā)布時(shí)間:2024/1/23 linux 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Alibaba Cloud Linux 2 (原Aliyun Linux 2)是阿里云操作系統(tǒng)團(tuán)隊(duì)基于社區(qū)版 4.19 LTS 內(nèi)核打造的一款針對(duì)云產(chǎn)品優(yōu)化的下一代 Linux 操作系統(tǒng)發(fā)行版,不僅提供 Linux 社區(qū)的最新增強(qiáng)功能,也提供了云上最佳用戶體驗(yàn)并針對(duì)阿里云基礎(chǔ)設(shè)施做了深度的優(yōu)化。今年 3 月 26 日Alibaba Cloud Linux 2 LTS 正式發(fā)布,這是一個(gè)重要的里程碑。在 LTS 版本中,阿里云操作系統(tǒng)團(tuán)隊(duì)將提供長(zhǎng)期的技術(shù)支持、穩(wěn)定的安全更新以及持續(xù)的特性與優(yōu)化。

阿里云同時(shí)推出了基于 Alibaba Cloud Linux 2 LTS 的快速啟動(dòng)版鏡像,當(dāng)前正在火熱公測(cè)中,用戶可以在北京、杭州、張家口、香港等可用區(qū)的控制臺(tái)中購(gòu)買試用。Alibaba Cloud Linux 2 LTS 為快速啟動(dòng)版做了大量?jī)?yōu)化工作,本文將深度披露相關(guān)操作系統(tǒng)側(cè)的優(yōu)化技術(shù)細(xì)節(jié)。

鏡像目前在北京、杭州、張家口、香港等可用區(qū)公測(cè),歡迎購(gòu)買試用。

1、Linux 系統(tǒng)啟動(dòng)流程簡(jiǎn)介

我們首先需要定義 Linux 系統(tǒng)啟動(dòng),這里我們定義為從系統(tǒng)上電到用戶能夠登錄終端的時(shí)間為啟動(dòng)時(shí)長(zhǎng),對(duì)于云上用戶來(lái)說(shuō),從 Guest OS 啟動(dòng)到用戶可以通過(guò) ssh 登錄的階段,為系統(tǒng)啟動(dòng)階段。通用 Linux 操作系統(tǒng)啟動(dòng)大致分為三個(gè)階段:引導(dǎo)階段(第一階段),內(nèi)核啟動(dòng)階段(第二階段)及用戶態(tài)啟動(dòng)階段(第三階段),相關(guān)流程如下圖所示:

下面來(lái)看看各階段大致的啟動(dòng)流程。

第一階段

Bootloader 是位于系統(tǒng)引導(dǎo)扇區(qū)的一段獨(dú)立的系統(tǒng)程序,用于系統(tǒng)啟動(dòng)初期的硬件初始化,系統(tǒng)分區(qū)識(shí)別,系統(tǒng)內(nèi)核加載及跳轉(zhuǎn)執(zhí)行。目前應(yīng)用比較廣泛的 bootloader 是用于通用系統(tǒng)的 Grub2 和嵌入式系統(tǒng)的 uboot。Grub2 是多重引導(dǎo)器(multiboot),提供交互界面,默認(rèn)配置下 Grub2 有5秒交互超時(shí)時(shí)間,啟動(dòng)耗時(shí)較長(zhǎng)。

第二階段

Bootloader 加載 Linux 內(nèi)核(一般為壓縮內(nèi)核 vmlinuz)到內(nèi)存,并運(yùn)行內(nèi)核自解壓縮程序,解壓后跳轉(zhuǎn)至start_kernel(),開始內(nèi)核初始化流程:

第三階段

Linux 內(nèi)核完成一系列初始化動(dòng)作之后,開始運(yùn)行 init 程序,創(chuàng)建 PID 為 1 的用戶態(tài)進(jìn)程,將系統(tǒng)控制權(quán)從內(nèi)核態(tài)跳轉(zhuǎn)到用戶態(tài)。init 程序會(huì)繼續(xù)進(jìn)行用戶態(tài)啟動(dòng)流程,開啟各種必要的或是預(yù)先配置的系統(tǒng)服務(wù),最后啟動(dòng)登陸服務(wù),完成整個(gè)系統(tǒng)的啟動(dòng)。

Initrd 與 Switch Root

init 是用戶態(tài)程序,存放在系統(tǒng)根文件系統(tǒng)(rootfs)里。內(nèi)核需要先掛載 rootfs,才能運(yùn)行 init 程序。通用 Linux 發(fā)行版需要支持多種磁盤設(shè)備及文件系統(tǒng),這需要內(nèi)核預(yù)加載多種可能的磁盤設(shè)備驅(qū)動(dòng)及文件系統(tǒng)相關(guān)用戶態(tài)工具軟件才能正確識(shí)別 rootfs。而這些驅(qū)動(dòng)及用戶態(tài)工具一般都存放在 rootfs 中,形成一個(gè)循環(huán)依賴。

為解決這個(gè)問(wèn)題,initrd 應(yīng)運(yùn)而生,將掛載 rootfs 必要的驅(qū)動(dòng)、用戶態(tài)工具以及其他需要預(yù)加載的代碼從 rootfs 中抽取出來(lái),并依照 rootfs 的文件結(jié)構(gòu),打包成一個(gè)小的 rootfs,做成一個(gè)內(nèi)存盤(ram disk)。內(nèi)核在掛載最終的 rootfs 之前,先從內(nèi)存中掛載 initrd,加載必要的驅(qū)動(dòng)后,先運(yùn)行 initrd 中的 init 程序,掛載最終的 rootfs。然后執(zhí)行 switch root 動(dòng)作,切換至最終的 rootfs。

Alibaba Cloud Linux 2 采用 systemd 來(lái)管理用戶空間啟動(dòng)流程,systemd 就是 init 程序,initrd 使用壓縮格式的initramfs 文件。因此在加載 initrd 之前,內(nèi)核需要先解壓縮 initramfs。

cloud-init

在阿里云 ECS 環(huán)境中,cloud-init 是一個(gè)必不可少的初始化配置工具。在實(shí)例啟動(dòng)階段能從多種數(shù)據(jù)源讀取相關(guān)數(shù)據(jù)并據(jù)此對(duì)虛擬機(jī)進(jìn)行配置,如用戶密碼,主機(jī)名,網(wǎng)絡(luò),用戶數(shù)據(jù)等等一些配置。

2、工欲善其事必先利其器

優(yōu)化系統(tǒng)啟動(dòng)時(shí)間,自然需要先對(duì)系統(tǒng)啟動(dòng)畫像,了解啟動(dòng)時(shí)間分布情況,找出系統(tǒng)啟動(dòng)耗時(shí)熱點(diǎn)。

啟動(dòng)時(shí)間測(cè)量

Linux 操作系統(tǒng)有如下常見(jiàn)的啟動(dòng)時(shí)間測(cè)量統(tǒng)計(jì)方法:

  • systemd-analyze: systemd 自帶的啟動(dòng)分析工具,能夠給出總的啟動(dòng)時(shí)間消耗,已經(jīng)用戶態(tài)服務(wù)啟動(dòng)耗時(shí)統(tǒng)計(jì)。

  • dmesg: dmesg 輸出內(nèi)核啟動(dòng)日志,時(shí)間戳能夠幫助分析內(nèi)核初始化各階段耗時(shí)情況。配合-d選項(xiàng)計(jì)算出日志間的時(shí)間差,方便快速定位內(nèi)核啟動(dòng)過(guò)程中耗時(shí)熱點(diǎn)。

  • initcall_debug: 內(nèi)核啟動(dòng)參數(shù),開啟后會(huì)統(tǒng)計(jì)內(nèi)核各初始化函數(shù)的耗時(shí)情況,相比dmesg -d更加精確。

  • printk/trace_printk: 要分析一些啟動(dòng)熱點(diǎn)的細(xì)化耗時(shí)情況時(shí),手動(dòng)增加一些 printk/trace_printk 探針能夠幫助獲取時(shí)間統(tǒng)計(jì)信息。

  • ftrace: 必要時(shí)也可開啟內(nèi)核早期 ftrace 功能,幫助分析熱點(diǎn)耗時(shí)。不過(guò)需要注意開啟 ftrace 后可能會(huì)導(dǎo)致函數(shù)延時(shí)增加,因此不宜參考 ftrace 得出函數(shù)絕對(duì)耗時(shí),可以參照 trace 結(jié)果幫助分析熱點(diǎn)函數(shù)的耗時(shí)邏輯。

還有其他一些時(shí)間測(cè)試方法,以及圖形化畫像工具,這里不一一介紹。

啟動(dòng)耗時(shí)熱點(diǎn)分析

對(duì)早期 Alibaba Cloud Linux 2 啟動(dòng)進(jìn)行測(cè)量畫像后,按耗時(shí)排序,得到如下耗時(shí)熱點(diǎn):

熱點(diǎn)耗時(shí)(ms)內(nèi)核啟動(dòng)占比總啟動(dòng)占比
mem init~353.5%0.7%
ORC unwind init~909%1.8%
buddy init25025%5%
console enable~606%1.2 %
initramfs unpack25025%5%
free initmem27027%5.4%
mouse probe65065%13%
systemd initrd600N/A12%
mount rootfs200N/A4%
cloud init2740N/A54.8%

采樣機(jī)器:ecs.g6.large 2C8G 實(shí)例

可見(jiàn):

  • 內(nèi)核啟動(dòng)階段,鼠標(biāo)探測(cè)耗時(shí)占比較高。

  • 總體啟動(dòng)耗時(shí)中,一半以上的時(shí)間消耗在用戶態(tài) cloud-init 進(jìn)程上;

3、 快速啟動(dòng)優(yōu)化

常用啟動(dòng)優(yōu)化方法

常用的啟動(dòng)優(yōu)化方法大致如下:

  • 瘦身

    • 移除不必要的代碼,如模塊,服務(wù)等,縮減啟動(dòng)初始化步驟;

    • 移除不必要的測(cè)試,調(diào)式及打印;

    • 精簡(jiǎn)共享庫(kù);

  • 異步、并行

    • 將耗時(shí)動(dòng)作從關(guān)鍵路徑移除,延后執(zhí)行;

    • 將順序動(dòng)作并行化執(zhí)行 ;

  • 原地執(zhí)行(XIP): 多用于嵌入式系統(tǒng);

  • 定制化: 將通用初始化程序定制化 ;

  • 算法優(yōu)化: 改進(jìn)算法,加速初始化時(shí)間。

我們的優(yōu)化策略

去 initrd

從前面的啟動(dòng)耗時(shí)熱點(diǎn)分析結(jié)果可以看出,initrd 解壓縮及 initrd systemd 耗時(shí)占了較大比率。

Alibaba Cloud Linux 2 只運(yùn)行于阿里云云服務(wù)器上,系統(tǒng)盤設(shè)備基本固定為 virtio-blk 設(shè)備,根文件系統(tǒng)格式基本固定為 ext4 文件系統(tǒng),去掉 initrd 方案應(yīng)該可行,理論上會(huì)優(yōu)化掉 initramfs unpack(270) + initrd systemd(560) ~ 800ms 的啟動(dòng)耗時(shí)。于是開搞:

可見(jiàn) initrd systemd 時(shí)間確實(shí)優(yōu)化掉了,但是!總的啟動(dòng)時(shí)間并沒(méi)有理論優(yōu)化收益

繼續(xù)探索原因,發(fā)現(xiàn)是內(nèi)核啟動(dòng)耗時(shí)增加了約 400ms。進(jìn)一步分析發(fā)現(xiàn),啟動(dòng)耗時(shí)熱點(diǎn)之一的 mouse probe(600ms),去 initrd 之前是與 initrd systemd 并行執(zhí)行的。

去掉initrd后,這部分時(shí)間就直接計(jì)入內(nèi)核啟動(dòng)時(shí)間了。抵去優(yōu)化掉的 initramfs unpacking 的 200ms,內(nèi)核實(shí)際增加了 400ms 左右。

因此,要最大化去 initrd 的優(yōu)化收益,必須同時(shí)解決 mouse probe 的耗時(shí)。

延遲probe

通用 Linux 系統(tǒng)需要支持多種 IO 設(shè)備,而鼠標(biāo)鍵盤是比較常用的輸入設(shè)備,特別是鼠標(biāo),產(chǎn)品繁多,接口多樣。系統(tǒng)啟動(dòng)過(guò)程中加載鼠標(biāo)驅(qū)動(dòng)后,需要掃描多種 IO 總線來(lái)探測(cè)鼠標(biāo)設(shè)備,這一過(guò)程非常耗時(shí)。

依據(jù)前面提到的優(yōu)化方法,我們有兩種方案:

  • 對(duì)云環(huán)境定制鼠標(biāo)驅(qū)動(dòng),固定探測(cè) virtio 設(shè)備;

  • 將鼠標(biāo)探測(cè)從啟動(dòng)關(guān)鍵路徑剝離,延遲探測(cè),與后面系統(tǒng)啟動(dòng)服務(wù)并行;

  • 第一種方案需要重構(gòu)相關(guān)代碼,成本較高;而且定制化限制較多,無(wú)法與開源社區(qū)協(xié)作。因此需要思考第二種方法:延遲探測(cè)。一種簡(jiǎn)單可行的方法是將原本內(nèi)置(built-in)的設(shè)備驅(qū)動(dòng)重新編譯為內(nèi)核模塊(kernel module),因內(nèi)核模塊存放在根文件系統(tǒng),所以加載時(shí)機(jī)被動(dòng)推遲到根文件系統(tǒng)掛載之后,此時(shí)內(nèi)核已經(jīng)啟動(dòng)完成,自然與用戶態(tài)初始化進(jìn)程并行執(zhí)行。

    測(cè)試結(jié)果如下:

    帶 initrd 啟動(dòng)

    不帶 initrd 啟動(dòng)

    可見(jiàn),內(nèi)核啟動(dòng)時(shí)間縮減約 200ms,優(yōu)化掉 initrd systemd 時(shí)間;鼠標(biāo)設(shè)備探測(cè)延后至 userspace 初始化階段,導(dǎo)致userspace 啟動(dòng)時(shí)間略有增加。獲得預(yù)期的啟動(dòng)時(shí)間優(yōu)化。

    內(nèi)存初始化優(yōu)化

    內(nèi)存初始化也是內(nèi)核啟動(dòng)熱點(diǎn)之一,特別是在大規(guī)格實(shí)例上,內(nèi)存初始化耗時(shí)占比較高。圖中為 750GB 實(shí)例內(nèi)存初始化耗時(shí):

    mem init 耗時(shí)近 2s

    buddy init 耗時(shí) 1.8s

    內(nèi)存初始化動(dòng)作是在內(nèi)核啟動(dòng)的關(guān)鍵路徑上,優(yōu)化思路是并行初始化。因內(nèi)存初始化時(shí)機(jī)較早,系統(tǒng)多CPU還未初始化完成,所以需要將內(nèi)存初始化延后至CPU初始化完成之后,采用多線程并行執(zhí)行內(nèi)存初始化。這部分工作社區(qū)已經(jīng)完成,通過(guò)內(nèi)核配置deferred struct page init特性來(lái)開啟。

    開啟后,內(nèi)存初始化延后,按 NUMA node 并行執(zhí)行:

    前半部耗時(shí)約 0.2s

    后半部耗時(shí)約 1.3s

    free initmem 修復(fù)

    早期 Alibaba Cloud Linux 2 啟動(dòng)優(yōu)化前有一個(gè)概率性的啟動(dòng)熱點(diǎn),free initmem 到 buddy 系統(tǒng)時(shí),會(huì)大概率出現(xiàn)200ms 以上延時(shí),dmesg 日志顯示如下,耗時(shí)超過(guò) 200ms:

    1

    [ ? 0.687494] rtc_cmos 00:00: setting system clock to 2020-03-03 15:09:38 UTC (1583248178)

    2

    [ ? 0.915315] Freeing unused kernel image memory: 1836K

    總結(jié)

    以上是生活随笔為你收集整理的uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。