當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] 在上次完成嵌入式應(yīng)用的Linux裁減后,Linux的啟動(dòng)時(shí)間仍需要 7s 左右,雖然勉強(qiáng)可以接受,但仍然沒(méi)有達(dá)到我個(gè)人所追求的目標(biāo)——2s 以?xún)?nèi)。況且,在實(shí)際的商用環(huán)

 在上次完成嵌入式應(yīng)用的Linux裁減后,Linux的啟動(dòng)時(shí)間仍需要 7s 左右,雖然勉強(qiáng)可以接受,但仍然沒(méi)有達(dá)到我個(gè)人所追求的目標(biāo)——2s 以?xún)?nèi)。況且,在實(shí)際的商用環(huán)境中,設(shè)備可靠性的要求可是“5個(gè)9”(99.999%,即OOS時(shí)間低于5分鐘/年),這就意味著每減少一秒鐘Linux啟動(dòng)(設(shè)備復(fù)位)時(shí)間,對(duì)可靠性都是一個(gè)明顯的提升。

言歸正傳,如何著手對(duì)Linux的啟動(dòng)時(shí)間進(jìn)行優(yōu)化呢?

CELF(The Consumer Electronics Linux Forum)論壇為我們指引了一個(gè)方向。

(1)首先是對(duì)Linux啟動(dòng)過(guò)程的跟蹤和分析,生成詳細(xì)的啟動(dòng)時(shí)間報(bào)告。

較為簡(jiǎn)單可行的方式是通過(guò)PrintkTime功能為啟動(dòng)過(guò)程的所有內(nèi)核信息增加時(shí)間戳,便于匯總分析。PrintkTime最早為CELF所提供的一個(gè)內(nèi)核補(bǔ)丁,在后來(lái)的Kernel 2.6.11版本中正式納入標(biāo)準(zhǔn)內(nèi)核。所以大家可能在新版本的內(nèi)核中直接啟用該功能。如果你的Linux內(nèi)核因?yàn)槟承┰虿荒芨聻?.6.11之后的版本,那么可以參考CELF提供的方法修改或直接下載它們提供的補(bǔ)?。簂inuxforum.org/CelfPubWiki">http://tree.celinuxforum.org/CelfPubWiki /PrintkTimes

開(kāi)啟PrintkTime功能的方法很簡(jiǎn)單,只需在內(nèi)核啟動(dòng)參數(shù)中增加“time”即可。當(dāng)然,你也可以選擇在編譯內(nèi)核時(shí)直接指定“Kernel hacking”中的“Show timing information on printks”來(lái)強(qiáng)制每次啟動(dòng)均為內(nèi)核信息增加時(shí)間戳。這一種方式還有另一個(gè)好處:你可以得到內(nèi)核在解析啟動(dòng)參數(shù)前所有信息的時(shí)間。因此,我選擇后一種方式。

當(dāng)完成上述配置后,重新啟動(dòng)Linux,然后通過(guò)以下命令將內(nèi)核啟動(dòng)信息輸出到文件:

dmesg -s 131072 >ktime

然后利用一個(gè)腳本“show_delta”(位于Linux源碼的scripts文件夾下)將上述輸出的文件轉(zhuǎn)換為時(shí)間增量顯示格式:

/usr/src/linux-x.xx.xx/scripts/show_delta ktime >dtime

這樣,你就得到了一份關(guān)于Linux啟動(dòng)時(shí)間消耗的詳細(xì)報(bào)告。

(2)然后,我們就來(lái)通過(guò)這份報(bào)告,找出啟動(dòng)中相對(duì)耗時(shí)的過(guò)程。

必須明確一點(diǎn):報(bào)告中的時(shí)間增量和內(nèi)核信息之間沒(méi)有必然的對(duì)應(yīng)關(guān)系,真正的時(shí)間消耗必須從內(nèi)核源碼入手分析。

這一點(diǎn)對(duì)于稍微熟悉編程的朋友來(lái)說(shuō)都不難理解,因?yàn)闀r(shí)間增量只是兩次調(diào)用printk之間的時(shí)間差值。通常來(lái)說(shuō),內(nèi)核啟動(dòng)過(guò)程中在完成一些耗時(shí)的任務(wù),如創(chuàng)建hash索引、probe硬件設(shè)備等操作后會(huì)通過(guò)printk將結(jié)果打印出來(lái),這種情況下,時(shí)間增量往往反映的是信息對(duì)應(yīng)過(guò)程的耗時(shí);但有些時(shí)候,內(nèi)核是在調(diào)用printk輸出信息后才開(kāi)始相應(yīng)的過(guò)程,那么報(bào)告中內(nèi)核信息相應(yīng)過(guò)程的時(shí)間消耗對(duì)應(yīng)的是其下一行的時(shí)間增量;還有一些時(shí)候,時(shí)間消耗在了兩次內(nèi)核信息輸出之間的某個(gè)不確定的時(shí)段,這樣時(shí)間增量可能就完全無(wú)法通過(guò)內(nèi)核信息反應(yīng)出來(lái)了。

所以,為了準(zhǔn)確判斷真正的時(shí)間消耗,我們需要結(jié)合內(nèi)核源碼進(jìn)行分析。必要的時(shí)候,例如上述第三種情形下,還得自己在源碼中插入printk打印,以進(jìn)一步確定實(shí)際的時(shí)間消耗過(guò)程。

以下是我上次裁減后Linux內(nèi)核的啟動(dòng)分析:

內(nèi)核啟動(dòng)總時(shí)間: 6.188s

關(guān)鍵的耗時(shí)部分:

1) 0.652s - Timer,IRQ,Cache,Mem Pages等核心部分的初始化

2) 0.611s - 內(nèi)核與RTC時(shí)鐘同步

3) 0.328s - 計(jì)算Calibrating Delay(4個(gè)CPU核心的總消耗)

4) 0.144s - 校準(zhǔn)APIC時(shí)鐘

5) 0.312s - 校準(zhǔn)Migration Cost

6) 3.520s - Intel E1000網(wǎng)卡初始化

下面,將針對(duì)上述各部分進(jìn)行逐一分析和化解。

(3)接下來(lái),進(jìn)行具體的分項(xiàng)優(yōu)化。

CELF已經(jīng)提出了一整套針對(duì)消費(fèi)類(lèi)電子產(chǎn)品所使用的嵌入式Linux的啟動(dòng)優(yōu)化方案,但是由于面向不同應(yīng)用,所以我們只能部分借鑒他們的經(jīng)驗(yàn),針對(duì)自己面對(duì)的問(wèn)題作出具體的分析和嘗試。

內(nèi)核關(guān)鍵部分(Timer、IRQ、Cache、Mem Pages……)的初始化目前暫時(shí)沒(méi)有比較可靠和可行的優(yōu)化方案,所以暫不考慮。

對(duì)于上面分析結(jié)果中的 2、3 兩項(xiàng),CELF已有專(zhuān)項(xiàng)的優(yōu)化方案:“RTCNoSync”和“PresetLPJ”。

前者通過(guò)屏蔽啟動(dòng)過(guò)程中所進(jìn)行的RTC時(shí)鐘同步或者將這一過(guò)程放到啟動(dòng)后進(jìn)行(視具體應(yīng)用對(duì)時(shí)鐘精度的需求而定),實(shí)現(xiàn)起來(lái)比較容易,但需要為內(nèi)核打補(bǔ)丁。似乎CELF目前的工作僅僅是去掉了該過(guò)程,而沒(méi)有實(shí)現(xiàn)所提到的“延后”處理RTC時(shí)鐘的同步??紤]到這個(gè)原因,我的方案中暫時(shí)沒(méi)有引入這一優(yōu)化(畢竟它所帶來(lái)的時(shí)間漂移已經(jīng)達(dá)到了“秒”級(jí)),繼續(xù)關(guān)注中。

后者是通過(guò)在啟動(dòng)參數(shù)中強(qiáng)制指定LPJ值而跳過(guò)實(shí)際的計(jì)算過(guò)程,這是基于LPJ值在硬件條件不變的情況下不會(huì)變化的考慮。所以在正常啟動(dòng)后記錄下內(nèi)核信息中的“Calibrating Delay”數(shù)值后就可以在啟動(dòng)參數(shù)中以下面的形式強(qiáng)制指定LPJ值了:

lpj=9600700

上面分析結(jié)果中的 4、5 兩項(xiàng)都是SMP初始化的一部分,因此不在CELF研究的范疇(或許將來(lái)會(huì)有采用多核的MP4出現(xiàn)?……),只能自力更生了。研究了一下SMP的初始化代碼,發(fā)現(xiàn)“Migration Cost”其實(shí)也可以像“Calibrating Delay”采用預(yù)置的方式跳過(guò)校準(zhǔn)時(shí)間。方法類(lèi)似,最后在內(nèi)核啟動(dòng)參數(shù)中增加:

migration_cost=4000,4000

而Intel的網(wǎng)卡驅(qū)動(dòng)初始化優(yōu)化起來(lái)就比較麻煩了,雖然也是開(kāi)源,但讀硬件驅(qū)動(dòng)完全不比讀一般的C代碼,況且建立在如此膚淺理解基礎(chǔ)上的“優(yōu)化”修改也實(shí)在難保萬(wàn)全?;诳煽啃缘目紤],我最終在兩次嘗試均告失敗后放棄了這一條路。那么,換一個(gè)思維角度,可以借鑒CELF在“ParallelRCScripts”方案中的“并行初始化”思想,將網(wǎng)卡驅(qū)動(dòng)獨(dú)立編譯為模塊,放在初始化腳本中與其它模塊和應(yīng)用同步加載,從而消除Probe阻塞對(duì)啟動(dòng)時(shí)間的影響??紤]到應(yīng)用初始化也可能使用到網(wǎng)絡(luò),而在我們的實(shí)際硬件環(huán)境中,只有eth0是供應(yīng)用使用的,因此需要將第一個(gè)網(wǎng)口初始化的0.3s時(shí)間計(jì)算在內(nèi)。

除了在我的方案中所遇到的上述各優(yōu)化點(diǎn),CELF還提出了一些你可能會(huì)感興趣的有特定針對(duì)性的專(zhuān)項(xiàng)優(yōu)化,如:[!--empirenews.page--]

ShortIDEDelays - 縮短IDE探測(cè)時(shí)長(zhǎng)(我的應(yīng)用場(chǎng)景中不包含硬盤(pán),所以用不上)

KernelXIP - 直接在ROM或Flash中運(yùn)行內(nèi)核(考慮到兼容性因素,未采用)

IDENoProbe - 跳過(guò)未連接設(shè)備的IDE口

OptimizeRCScripts - 優(yōu)化initrd中的linuxrc腳本(我采用了BusyBox更簡(jiǎn)潔的linuxrc)

以及其它一些尚處于設(shè)想階段的優(yōu)化方案,感興趣的朋友可以訪問(wèn)CELF Developer Wiki了解詳情。

(4)優(yōu)化結(jié)果

經(jīng)過(guò)上述專(zhuān)項(xiàng)優(yōu)化,以及對(duì)inittab、rcS腳本的冗余裁減,整個(gè)Linux內(nèi)核的啟動(dòng)時(shí)間從優(yōu)化前的 6.188s 下降到了最終的 2.016s,如果不包含eth0的初始化,則僅需 1.708s(eth0初始化可以和系統(tǒng)中間件及部分應(yīng)用加載并行),基本達(dá)到了既定目標(biāo)。與Kexec配合,可以大大降低軟件故障導(dǎo)致的復(fù)位時(shí)間,有效的提升了產(chǎn)品的可靠性。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉