專利名稱:一種Linux下針對機械硬盤的預(yù)讀方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種Linux下針對機械硬盤的預(yù)讀方法。
技術(shù)背景
隨著軟件越來越復(fù)雜化,軟件的啟動速度也越來越慢,其通常主要因素源自啟動時刻軟件對磁盤的隨機訪問。
目前常見的機械硬盤,雖然有著不錯的順序訪問性能,然而其隨機訪問性能卻不尚ο
于是一些預(yù)讀技術(shù)就被提出,來優(yōu)化軟件的啟動速度。預(yù)讀主要是在磁盤空閑間隙,按照磁盤順序,提前讀取接下來要訪問的內(nèi)容。
預(yù)讀主要包含兩個任務(wù)——“收集需要預(yù)讀的文件片斷”和“預(yù)讀文件片斷”。
目前在Linux上,已有預(yù)讀方法如下
1.收集需要預(yù)讀的文件片斷在軟件啟動階段采用fanotify/inotify系統(tǒng)調(diào)用來監(jiān)視哪些文件被打開。啟動完成后,再依次對前述打開過的文件使用mincore系統(tǒng)調(diào)用, 來獲知文件的哪些部分在內(nèi)存中,在內(nèi)存中的部分被認(rèn)為是啟動過程中被讀取的,從而被記錄下來,形成類似“文件路徑區(qū)間1,區(qū)間2,... ”的一條記錄。
最后將上述記錄按照所在磁盤位置排列,寫入到一個文件中。
2.預(yù)讀文件片斷在軟件啟動一開始,預(yù)讀程序根據(jù)上點生成的記錄文件,逐個打開文件并通過readahead/posi^fadvise系統(tǒng)調(diào)用,來指示操作系統(tǒng)內(nèi)核進行預(yù)讀。
然而上述預(yù)讀方法表現(xiàn)并不盡如人意。
首先,預(yù)讀操作按照了磁盤序,固然提高了磁盤效率,卻往往會干擾正常的讀訪問。例如某軟件啟動時,依次訪問了四個文件片段a,b,c,d,而其磁盤順序為d,c,b,a。這樣在啟動時刻,按照磁盤序預(yù)讀的d并不是立即需要的,反而與啟動的軟件競爭磁盤帶寬。
其次,預(yù)讀僅僅涵蓋了啟動時刻的文件訪問,卻忽略了對文件系統(tǒng)元數(shù)據(jù)的訪問。 在實測中,啟動時刻相當(dāng)一部分磁盤訪問對應(yīng)到了文件系統(tǒng)的元數(shù)據(jù)。發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種Linux下針對機械硬盤的預(yù)讀方法,該方法可以有效改善機械硬盤上的軟件啟動速度。
為了解決上述的技術(shù)問題,本發(fā)明的一種Linux下針對機械硬盤的預(yù)讀方法,包括步驟
1)收集需要預(yù)讀的文件片斷。
無縫記錄軟件正常啟動過程中的磁盤讀訪問。與已有方案相比,記錄對象為磁盤塊,從而能記錄對文件系統(tǒng)元數(shù)據(jù)的讀??;每次讀取塊的順序和塊號都將被記錄。
啟動完成后,按照其磁盤塊被訪問的順序,寫入到預(yù)讀鏡像。與已有方案相比,寫入的是預(yù)讀內(nèi)容的一個副本,而非引用。
2)預(yù)讀文件片斷。
軟件啟動時刻,將優(yōu)先嘗試從預(yù)讀鏡像中讀取所需塊。與已有方案相比,由于預(yù)讀鏡像磁盤塊的順序與訪問順序一致,從而既滿足了最大利用機械磁盤特性,又能避免預(yù)讀非急需內(nèi)容,干擾正常啟動。
3)維持預(yù)讀鏡像的有效性。
定期同步預(yù)讀鏡像中的磁盤塊副本。由于軟件更新等原因造成的原件更新,將被發(fā)現(xiàn)并更新到鏡像中的磁盤塊副本中。
采用本發(fā)明所提出的預(yù)讀方法,有效地把軟件啟動時刻的磁盤隨機讀訪問轉(zhuǎn)化為順序讀取,最大利用機械磁盤特性。同時預(yù)讀順序與正常訪問順序一致,有效解決了原有預(yù)讀干擾問題。另外,對于文件系統(tǒng)元數(shù)據(jù)的讀訪問,也能進行預(yù)讀。
下面結(jié)合附圖和具體實施方式
對本發(fā)明作進一步詳細(xì)的說明。
圖1是本發(fā)明“收集需要預(yù)讀的文件片斷”任務(wù)在軟件啟動階段的工作流程圖2是本發(fā)明“收集需要預(yù)讀的文件片斷”任務(wù)在軟件啟動完成后的工作流程圖3是本發(fā)明“預(yù)讀文件片斷”任務(wù)的工作流程圖4是本發(fā)明“維持預(yù)讀鏡像的有效性”任務(wù)的工作流程圖;具體實施方式
本發(fā)明實現(xiàn)使用了 Linux內(nèi)核的LVM子系統(tǒng),LVM子系統(tǒng)能夠?qū)⒍鄠€磁盤或鏡像文件按照不同目標(biāo)需求,組成一個虛擬的磁盤。
在本發(fā)明中,需要為LVM子系統(tǒng)增加一個readahead目標(biāo),該目標(biāo)下,預(yù)讀鏡像與機械磁盤組成一個虛擬的磁盤。readahead目標(biāo)對預(yù)讀的三個任務(wù)實現(xiàn)如下
1)收集需要預(yù)讀的文件片斷在軟件啟動階段,對磁盤塊的讀請求被依次記錄到一塊內(nèi)存區(qū)域。圖1顯示了這個工作流。
在啟動完成后,通知readahead目標(biāo),生成預(yù)讀鏡像。圖2顯示了這個工作流,即根據(jù)先前記錄,依次從機械磁盤上讀取磁盤塊填充到預(yù)讀鏡像。預(yù)讀鏡像是啟動時讀取的磁盤塊集合的一個副本,按照讀取的順序排列。
2)預(yù)讀文件片斷所有磁盤的訪問將通過虛擬磁盤。其中讀請求優(yōu)先從預(yù)讀鏡像中滿足。圖3顯示了這個工作流,點狀虛線代表請求的磁盤塊不在預(yù)讀鏡像時,再從機械硬盤中查找。
3)維持預(yù)讀鏡像的有效性所有磁盤的訪問將通過虛擬磁盤,如果發(fā)現(xiàn)更新磁盤塊在預(yù)讀鏡像中有副本,則對副本置位無效。系統(tǒng)周期性對無效副本進行重填。圖4顯示了這個工作流。
在說明書附圖中,圖1-3帶有數(shù)字的小方框代表一個讀請求,圖4中帶有數(shù)字的小方框代表一個寫請求。框中數(shù)字代表請求的磁盤塊號。
上述實施例不以任何方式限制本發(fā)明,凡是采用等同替換或等效變換的方式獲得的技術(shù)方案均落在本發(fā)明的保護范圍內(nèi)。
權(quán)利要求
1. 一種Linux下針對機械硬盤的預(yù)讀方法,其特征在于包括以下步驟1)收集需要預(yù)讀的文件片斷,無縫記錄軟件正常啟動過程中的磁盤讀訪問,啟動完成后,按照其磁盤塊被訪問的順序,寫入到預(yù)讀鏡像;2)預(yù)讀文件片斷,軟件啟動時刻,將優(yōu)先嘗試從預(yù)讀鏡像中讀取所需塊;3)維持預(yù)讀鏡像的有效性,定期同步預(yù)讀鏡像中的磁盤塊副本,對于各種原因造成的原件更新,將被發(fā)現(xiàn)并更新到鏡像中的磁盤塊副本中。
全文摘要
本發(fā)明公開了一種Linux下針對機械硬盤的預(yù)讀方法,改方法包括步驟1)收集需要預(yù)讀的文件片斷;2)預(yù)讀文件片斷;3)維持預(yù)讀鏡像的有效性;采用本發(fā)明所提出的預(yù)讀方法,有效地把軟件啟動時刻的磁盤隨機讀訪問轉(zhuǎn)化為順序讀取,最大利用機械磁盤特性。同時預(yù)讀順序與正常訪問順序一致,有效解決了原有預(yù)讀干擾問題。另外,對于文件系統(tǒng)元數(shù)據(jù)的讀訪問,也能進行預(yù)讀。
文檔編號G06F3/06GK102520884SQ20111042000
公開日2012年6月27日 申請日期2011年12月15日 優(yōu)先權(quán)日2011年12月15日
發(fā)明者吳少剛, 張福新, 陳杰 申請人:江蘇中科夢蘭電子科技有限公司