<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux系統(tǒng)啟動(dòng)時(shí)間優(yōu)化方案

          Linux系統(tǒng)啟動(dòng)時(shí)間優(yōu)化方案

          作者: 時(shí)間:2011-05-20 來(lái)源:網(wǎng)絡(luò) 收藏
          以下是我上次裁減后內(nèi)核的分析:

          本文引用地址:http://www.ex-cimer.com/article/150727.htm

            內(nèi)核: 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)。

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

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

            對(duì)于上面分析結(jié)果中的 2、3 兩項(xiàng),CELF已有專項(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)的漂移已經(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)。方法類似,最后在內(nèi)核啟動(dòng)參數(shù)中增加:

            migration_cost=4000,4000

            而Intel的網(wǎng)卡驅(qū)動(dòng)初始化優(yōu)化起來(lá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ì)性的專項(xiàng)優(yōu)化,如:

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

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

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();