站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        總結(jié)Linux磁盤緩存相關(guān)知識

        下面由linux系統(tǒng)教程欄目給大家介紹總結(jié)關(guān)于Linux磁盤緩存的相關(guān)知識,希望對需要的朋友有所幫助!

        前言

        最近遇到了一起跟磁盤相關(guān)的線上故障,借此總結(jié)一下之前不太了解的Linux磁盤緩存相關(guān)的知識。

        總的來說磁盤緩存出現(xiàn)的原因大概有兩個:第一是訪問磁盤的速度遠慢于訪問內(nèi)存的速度,通過在內(nèi)存中緩存磁盤內(nèi)容可以提高訪問速度;第二是根據(jù)程序的局部性原理,數(shù)據(jù)一旦被訪問過,就很有可能在短時間內(nèi)再次被訪問,所以在內(nèi)存中緩存磁盤內(nèi)容可以提高程序運行速度。

        局部性原理

        程序局部性原理:程序在執(zhí)行時呈現(xiàn)出局部性規(guī)律,即在一段時間內(nèi),整個程序的執(zhí)行僅限于程序中的某一部分。相應(yīng)地,執(zhí)行所訪問的存儲空間也局限于某個內(nèi)存區(qū)域,具體來說,局部性通常有兩種形式:時間局部性和空間局部性。

        時間局部性:被引用過一次的存儲器位置在未來會被多次引用。

        空間局部性:如果一個存儲器的位置被引用,那么將來他附近的位置也會被引用。

        頁緩存

        Linux系統(tǒng)中為了減少對磁盤的IO操作,會將打開的磁盤內(nèi)容進行緩存,而緩存的地方則是物理內(nèi)存,進而將對磁盤的訪問轉(zhuǎn)換成對內(nèi)存的訪問,有效提高程序的速度。Linux的緩存方式是利用物理內(nèi)存緩存磁盤上的內(nèi)容,稱為頁緩存(page cache)。

        頁緩存是由內(nèi)存中的物理頁面組成的,其內(nèi)容對應(yīng)磁盤上的物理塊。頁緩存的大小會根據(jù)系統(tǒng)的內(nèi)存空閑大小進行動態(tài)調(diào)整,它可以通過占用內(nèi)存以擴張大小,也可以自我收縮以緩解內(nèi)存使用壓力。

        在虛擬內(nèi)存機制出現(xiàn)以前,操作系統(tǒng)使用塊緩存系列,但是在虛擬內(nèi)存出現(xiàn)以后,操作系統(tǒng)管理IO的粒度更大,因此采用了頁緩存機制,頁緩存是基于頁的、面向文件的緩存機制。

        頁緩存的讀取

        Linux系統(tǒng)在讀取文件時,會優(yōu)先從頁緩存中讀取文件內(nèi)容,如果頁緩存不存在,系統(tǒng)會先從磁盤中讀取文件內(nèi)容更新到頁緩存中,然后再從頁緩存中讀取文件內(nèi)容并返回。

        大致過程如下:

        • 進程調(diào)用庫函數(shù)read發(fā)起讀取文件請求

        • 內(nèi)核檢查已打開的文件列表,調(diào)用文件系統(tǒng)提供的read接口

        • 找到文件對應(yīng)的inode,然后計算出要讀取的具體的頁

        • 通過inode查找對應(yīng)的頁緩存,1)如果頁緩存節(jié)點命中,則直接返回文件內(nèi)容;2)如果沒有對應(yīng)的頁緩存,則會產(chǎn)生一個缺頁異常(page fault)。這時系統(tǒng)會創(chuàng)建新的空的頁緩存并從磁盤中讀取文件內(nèi)容,更新頁緩存,然后重復(fù)第4步

        • 讀取文件返回

        所以說,所有的文件內(nèi)容的讀取,無論最初有沒有命中頁緩存,最終都是直接來源于頁緩存。

        頁緩存的寫入

        因為頁緩存的存在,當一個進程調(diào)用write時,對文件的更新僅僅是被寫到了文件的頁緩存中,讓后將對應(yīng)的頁標記為dirty,整個過程就結(jié)束了。Linux內(nèi)核會在周期性地將臟頁寫回到磁盤,然后清理掉dirty標識。

        由于寫操作只會把變更寫入頁緩存,因此進程并不會因此為阻塞直到磁盤IO發(fā)生,如果此時計算機崩潰,寫操作的變更可能并沒有發(fā)生在磁盤上。所以對于一些要求比較嚴格的寫操作,比如數(shù)據(jù)系統(tǒng),就需要主動調(diào)用fsync等操作及時將變更同步到磁盤上。讀操作則不同,read通常會阻塞直到進程讀取到數(shù)據(jù),而為了減少讀操作的這種延遲,Linux系統(tǒng)還是用了“預(yù)讀”的技術(shù),即從磁盤中讀取數(shù)據(jù)時,內(nèi)核將會多讀取一些頁到頁緩存中。

        回寫線程

        頁緩存的回寫是由內(nèi)核中的單獨的線程來完成的,回寫線程會在以下3種情況下進行回寫:

        • 空閑內(nèi)存低于閾值時。當空閑內(nèi)存不足時,需要釋放掉一部分緩存,由于只有不臟的頁才能被釋放,所以需要把臟頁都回寫到磁盤,使其變?yōu)榭苫厥盏母蓛舻捻摗?/p>

        • 臟頁在內(nèi)存中處理時間超過閾值時。這是為了確保臟頁不會無限期的留在內(nèi)存中,減少數(shù)據(jù)丟失的風(fēng)險。

        • 當用戶進程調(diào)用sync和fsync系統(tǒng)調(diào)用時。這是為了給用戶進程提供強制回寫的方法,滿足回寫要求嚴格的使用場景。

        回寫線程的實現(xiàn)

        名稱 版本 說明
        bdflush 2.6版本以前 bdflush 內(nèi)核線程在后臺運行,系統(tǒng)中只有一個 bdflush 線程,當內(nèi)存消耗到特定閥值以下時,bdflush 線程被喚醒。kupdated 周期性的運行,寫回臟頁。 但是整個系統(tǒng)僅僅只有一個 bdflush 線程,當系統(tǒng)回寫任務(wù)較重時,bdflush 線程可能會阻塞在某個磁盤的I/O上,導(dǎo)致其他磁盤的I/O回寫操作不能及時執(zhí)行。
        pdflush 2.6版本引入 pdflush 線程數(shù)目是動態(tài)的,取決于系統(tǒng)的I/O負載。它是面向系統(tǒng)中所有磁盤的全局任務(wù)的。 但是由于 pdflush 是面向所有磁盤的,所以有可能出現(xiàn)多個 pdflush 線程全部阻塞在某個擁塞的磁盤上,同樣導(dǎo)致其他磁盤的I/O回寫不能及時執(zhí)行。
        flusher線程 2.6.32版本以后引入 flusher 線程的數(shù)目不是唯一的,同時flusher線程不是面向所有磁盤的,而是每個flusher線程對應(yīng)一個磁盤

        頁緩存的回收

        Linux中頁緩存的替換邏輯是一個修改過的LRU實現(xiàn),也稱為雙鏈策略。和以前不同,Linux維護的不再是一個LRU鏈表,而是維護兩個鏈表:活躍鏈表和非活躍鏈表。處于活躍鏈表上的頁面被認為是“熱”的且不會被換出,而在非活躍鏈表上的頁面則是可以被換出的。在活躍鏈表中的頁面必須在其被訪問時就處于非活躍鏈表中。兩個鏈表都被偽LRU規(guī)則維護:頁面從尾部加入,從頭部移除,如同隊列。兩個鏈表需要維持平衡–如果活躍鏈表變得過多而超過了非活躍鏈表,那么活躍鏈表的頭頁面將被重新移回到非活躍鏈表中,一遍能再被回收。雙鏈表策略解決了傳統(tǒng)LRU算法中對僅一次訪問的窘境。而且也更加簡單的實現(xiàn)了偽LRU語義。這種雙鏈表方式也稱作LRU/2。更普遍的是n個鏈表,故稱LRU/n。

        【推薦學(xué)習(xí):《linux視頻教程》】

        總結(jié)

        在這次遇到的線上故障中,根本原因在于在業(yè)務(wù)邏輯中使用了臨時文件做緩存,一個臨時文件創(chuàng)建后如果在短時間內(nèi)刪除,這時候?qū)@個文件的操作都是在頁緩存內(nèi)進行,不會實際回寫到磁盤。當程序出現(xiàn)問題響應(yīng)變慢時,臨時文件存活時間變長,就可能會使其被回寫到磁盤上,導(dǎo)致磁盤壓力過大,進而影響整個系統(tǒng)。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产亚洲曝欧美不卡精品| 久久精品亚洲精品国产欧美| 国产亚洲精品精品国产亚洲综合| 麻豆aⅴ精品无码一区二区 | 国产精品尹人在线观看| 2020亚洲男人天堂精品| 人妻无码久久精品| 国产精品v欧美精品v日本精| 久久96国产精品久久久| 国产精品亚洲日韩欧美色窝窝色欲 | 亚洲一日韩欧美中文字幕欧美日韩在线精品一区二 | 亚洲精品无码不卡在线播放HE| freesexvideos精品老师毛多| 宅男宅女精品国产AV天堂| 久久国产乱子伦精品免费午夜| 真实国产乱子伦精品免费| 99久久99久久精品免费看蜜桃| 欧美午夜精品久久久久免费视| 综合人妻久久一区二区精品| 久久九九久精品国产| 精品精品国产高清a毛片| 在线欧美v日韩v国产精品v| 国产精品欧美日韩| 2020久久精品国产免费| 国产成人精品视频播放| 97久久精品无码一区二区天美| 国产精品亚洲成在人线| 国产乱人伦偷精品视频免下载| 乱色精品无码一区二区国产盗| 午夜DY888国产精品影院| 日韩精品无码免费一区二区三区| 中文字幕精品亚洲无线码二区| 亚洲中文字幕无码久久精品1| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久久久国产精品麻豆AR影院 | 国精品无码一区二区三区在线| 精品亚洲麻豆1区2区3区| 久久精品国产亚洲av麻豆小说| 国产精品无码日韩欧| 精品亚洲永久免费精品| 亚洲综合国产精品|