本部落格原創文章屬本人lurker0ster所有,歡迎**。
**時需同意以下條件:
1. 必須保持版權資訊,以及文章出處http://blog.csdn.net/lurker0ster/
2. 不准演繹,修改,必須完整**全部內容。
***************====分割線********************
前面的blog提到利用sreadahead程式可以加快啟動,那麼究竟是它是利用什麼原理做到的呢?
其實,sreadahead程式的原理是在啟動時預先讀取啟動中需要的檔案載入到記憶體中,從而減少檔案等待時間。這個程式是arjan van de ven 寫的。
sreadahead的核心就是linux的readahead api。要達到目的需要做兩件事:記錄啟動過程中載入過的檔案資訊;在核心啟動啟動結束之後早啟動之前預讀取這些檔案。對於前者,arjan最早是通過hack ext3檔案系統的inode來實現的,並且新增加了ext3_ioc_inode_jiffies的ioctl呼叫。網上能查到的資料都是說這樣實現,實際上是錯誤的。這樣的做法,只能對ext3檔案系統起作用,為了達到通用和優化效率的目的,最新版本的patch改為對sys_open進行hook。
通過研讀源**可以發現,sreadahead的追蹤功能是通過對debugfs的tracing/current_tracer和tracing/tracing_enabled進行設定開啟的。**中對應的函式是trace_start。patch過的核心會啟動sys_open的hook,在記憶體中記錄下啟動過程中讀取過的檔案,以及其偏移位址和內容大小。
當程式呼叫trace_stop時,它會開啟debugfs中的tracing/trace,從而得到所有的檔案列表,然後記錄在ra陣列中。由於debugfs存在於記憶體中,程式最後會把資料儲存在pack檔案中(/var/lib/sreadahead/pack)。
下次啟動過程中sreadahead啟動後會先檢查pack檔案是否存在。如果存在,則從裡面讀取檔案資訊,並通過readahead系統呼叫把檔案讀入cache中。之後,lilinux如何需要讀取對應的檔案,就直接在記憶體中讀取。這裡的做法,實際上就是把零散的io讀操作集中在一起(起了四個執行緒,依次讀取檔案列表中的檔案),只是減少了等待時間,檔案讀取時間沒有節省。
乙個需要提到的內容是檔案系統的readahead引數。我們知道linux檔案系統優化措施之一就是readahead(預讀取),在正常的檔案讀取操作中,linux會預讀取請求內容後面的128kb內容存在記憶體中,如何應用程式繼續讀取,則直接從記憶體中讀取。在sreadahead程式中由於通常都是小檔案,128kb的預讀取對效能影響比較大,所有在執行讀取操作時程式會設定改引數為16kb(通過函式readahead_set_len實現)。
另外ubuntu的列表上有人提到trace_stop函式會對檔案列表進行氣泡排序和剔除重覆記錄(
sort_ra_by_name();
remove_dupes();
get_ra_blocks();
)使得程式很占用cpu。其實氣泡排序沒有什麼必要,就算一定要排序也可以延後到啟動完成之後再排序。
在實踐中,必須實際測試sreadahead的效能,因為小記憶體的系統已經報告使用了該程式反而使得啟動時間變長。
ubuntu維護了自己的實現(ureadahead),由scott james remnant 維護,原理是一樣的。
挑戰啟動極速 1
本部落格原創文章屬本人lurker0ster所有,歡迎 時需同意以下條件 1.必須保持版權資訊,以及文章出處http blog.csdn.net lurker0ster 2.不准演繹,修改,必須完整 全部內容。分割線 寫這篇blog純屬炒冷飯。源頭是google最近展示的chrome os的啟動時間...
4S關機的原理
pc機在按住4秒時會自動關機,這個原理是什麼呢?一般pc機的各種電是由ec或super io控制的,筆記本上是由ec控制的,當按住power bottom 4s時南橋會拉掉slp s3 slp s4 slp s5 ec接收到這些訊號後,會把系統的電全部拉掉,從而實現關機。具體步驟是 1,按住powe...
孝感品牌汽車4S店位址 電話大全
上海通用別克 銷售 400 811 0712 轉 11 分機號 地 址 孝感市孝南經濟開發區澴川路與仙女路交匯處 經 銷 商 湖北愛康大通 汽車銷售服務 商鋪空間 長安馬自達 喜事 400 811 0712 轉 13 分機號 地 址 湖北省孝感市槐蔭大道9號 經 銷 商 湖北愛康眾馳汽車銷售服務 商...