下面由欄目給大家介紹總結關(guān)于Linux磁盤(pán)緩存的相關(guān)知識,希望對需要的朋友有所幫助!
前言
最近遇到了一起跟磁盤(pán)相關(guān)的線(xiàn)上故障,借此總結一下之前不太了解的Linux磁盤(pán)緩存相關(guān)的知識。
總的來(lái)說(shuō)磁盤(pán)緩存出現的原因大概有兩個(gè):第一是訪(fǎng)問(wèn)磁盤(pán)的速度遠慢于訪(fǎng)問(wèn)內存的速度,通過(guò)在內存中緩存磁盤(pán)內容可以提高訪(fǎng)問(wèn)速度;第二是根據程序的局部性原理,數據一旦被訪(fǎng)問(wèn)過(guò),就很有可能在短時(shí)間內再次被訪(fǎng)問(wèn),所以在內存中緩存磁盤(pán)內容可以提高程序運行速度。
局部性原理
程序局部性原理:程序在執行時(shí)呈現出局部性規律,即在一段時(shí)間內,整個(gè)程序的執行僅限于程序中的某一部分。相應地,執行所訪(fǎng)問(wèn)的存儲空間也局限于某個(gè)內存區域,具體來(lái)說(shuō),局部性通常有兩種形式:時(shí)間局部性和空間局部性。
時(shí)間局部性:被引用過(guò)一次的存儲器位置在未來(lái)會(huì )被多次引用。
空間局部性:如果一個(gè)存儲器的位置被引用,那么將來(lái)他附近的位置也會(huì )被引用。
頁(yè)緩存
Linux系統中為了減少對磁盤(pán)的IO操作,會(huì )將打開(kāi)的磁盤(pán)內容進(jìn)行緩存,而緩存的地方則是物理內存,進(jìn)而將對磁盤(pán)的訪(fǎng)問(wèn)轉換成對內存的訪(fǎng)問(wèn),有效提高程序的速度。Linux的緩存方式是利用物理內存緩存磁盤(pán)上的內容,稱(chēng)為頁(yè)緩存(page cache)。
頁(yè)緩存是由內存中的物理頁(yè)面組成的,其內容對應磁盤(pán)上的物理塊。頁(yè)緩存的大小會(huì )根據系統的內存空閑大小進(jìn)行動(dòng)態(tài)調整,它可以通過(guò)占用內存以擴張大小,也可以自我收縮以緩解內存使用壓力。
在虛擬內存機制出現以前,操作系統使用塊緩存系列,但是在虛擬內存出現以后,操作系統管理IO的粒度更大,因此采用了頁(yè)緩存機制,頁(yè)緩存是基于頁(yè)的、面向文件的緩存機制。
頁(yè)緩存的讀取
Linux系統在讀取文件時(shí),會(huì )優(yōu)先從頁(yè)緩存中讀取文件內容,如果頁(yè)緩存不存在,系統會(huì )先從磁盤(pán)中讀取文件內容更新到頁(yè)緩存中,然后再從頁(yè)緩存中讀取文件內容并返回。
大致過(guò)程如下:
進(jìn)程調用庫函數read發(fā)起讀取文件請求
內核檢查已打開(kāi)的文件列表,調用文件系統提供的read接口
找到文件對應的inode,然后計算出要讀取的具體的頁(yè)
通過(guò)inode查找對應的頁(yè)緩存,1)如果頁(yè)緩存節點(diǎn)命中,則直接返回文件內容;2)如果沒(méi)有對應的頁(yè)緩存,則會(huì )產(chǎn)生一個(gè)缺頁(yè)異常(page fault)。這時(shí)系統會(huì )創(chuàng )建新的空的頁(yè)緩存并從磁盤(pán)中讀取文件內容,更新頁(yè)緩存,然后重復第4步
讀取文件返回
所以說(shuō),所有的文件內容的讀取,無(wú)論最初有沒(méi)有命中頁(yè)緩存,最終都是直接來(lái)源于頁(yè)緩存。
頁(yè)緩存的寫(xiě)入
因為頁(yè)緩存的存在,當一個(gè)進(jìn)程調用write時(shí),對文件的更新僅僅是被寫(xiě)到了文件的頁(yè)緩存中,讓后將對應的頁(yè)標記為dirty,整個(gè)過(guò)程就結束了。Linux內核會(huì )在周期性地將臟頁(yè)寫(xiě)回到磁盤(pán),然后清理掉dirty標識。
由于寫(xiě)操作只會(huì )把變更寫(xiě)入頁(yè)緩存,因此進(jìn)程并不會(huì )因此為阻塞直到磁盤(pán)IO發(fā)生,如果此時(shí)計算機崩潰,寫(xiě)操作的變更可能并沒(méi)有發(fā)生在磁盤(pán)上。所以對于一些要求比較嚴格的寫(xiě)操作,比如數據系統,就需要主動(dòng)調用fsync等操作及時(shí)將變更同步到磁盤(pán)上。讀操作則不同,read通常會(huì )阻塞直到進(jìn)程讀取到數據,而為了減少讀操作的這種延遲,Linux系統還是用了“預讀”的技術(shù),即從磁盤(pán)中讀取數據時(shí),內核將會(huì )多讀取一些頁(yè)到頁(yè)緩存中。
回寫(xiě)線(xiàn)程
頁(yè)緩存的回寫(xiě)是由內核中的單獨的線(xiàn)程來(lái)完成的,回寫(xiě)線(xiàn)程會(huì )在以下3種情況下進(jìn)行回寫(xiě):
空閑內存低于閾值時(shí)。當空閑內存不足時(shí),需要釋放掉一部分緩存,由于只有不臟的頁(yè)才能被釋放,所以需要把臟頁(yè)都回寫(xiě)到磁盤(pán),使其變?yōu)榭苫厥盏母蓛舻捻?yè)。
臟頁(yè)在內存中處理時(shí)間超過(guò)閾值時(shí)。這是為了確保臟頁(yè)不會(huì )無(wú)限期的留在內存中,減少數據丟失的風(fēng)險。
當用戶(hù)進(jìn)程調用sync和fsync系統調用時(shí)。這是為了給用戶(hù)進(jìn)程提供強制回寫(xiě)的方法,滿(mǎn)足回寫(xiě)要求嚴格的使用場(chǎng)景。
回寫(xiě)線(xiàn)程的實(shí)現
頁(yè)緩存的回收
Linux中頁(yè)緩存的替換邏輯是一個(gè)修改過(guò)的LRU實(shí)現,也稱(chēng)為雙鏈策略。和以前不同,Linux維護的不再是一個(gè)LRU鏈表,而是維護兩個(gè)鏈表:活躍鏈表和非活躍鏈表。處于活躍鏈表上的頁(yè)面被認為是“熱”的且不會(huì )被換出,而在非活躍鏈表上的頁(yè)面則是可以被換出的。在活躍鏈表中的頁(yè)面必須在其被訪(fǎng)問(wèn)時(shí)就處于非活躍鏈表中。兩個(gè)鏈表都被偽LRU規則維護:頁(yè)面從尾部加入,從頭部移除,如同隊列。兩個(gè)鏈表需要維持平衡–如果活躍鏈表變得過(guò)多而超過(guò)了非活躍鏈表,那么活躍鏈表的頭頁(yè)面將被重新移回到非活躍鏈表中,一遍能再被回收。雙鏈表策略解決了傳統LRU算法中對僅一次訪(fǎng)問(wèn)的窘境。而且也更加簡(jiǎn)單的實(shí)現了偽LRU語(yǔ)義。這種雙鏈表方式也稱(chēng)作LRU/2。更普遍的是n個(gè)鏈表,故稱(chēng)LRU/n。
【推薦學(xué)習:《》】
總結
在這次遇到的線(xiàn)上故障中,根本原因在于在業(yè)務(wù)邏輯中使用了臨時(shí)文件做緩存,一個(gè)臨時(shí)文件創(chuàng )建后如果在短時(shí)間內刪除,這時(shí)候對這個(gè)文件的操作都是在頁(yè)緩存內進(jìn)行,不會(huì )實(shí)際回寫(xiě)到磁盤(pán)。當程序出現問(wèn)題響應變慢時(shí),臨時(shí)文件存活時(shí)間變長(cháng),就可能會(huì )使其被回寫(xiě)到磁盤(pán)上,導致磁盤(pán)壓力過(guò)大,進(jìn)而影響整個(gè)系統。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站