中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

有哪些Linux磁盤緩存相關知識

發布時間:2021-10-29 16:44:35 來源:億速云 閱讀:188 作者:iii 欄目:建站服務器

本篇內容介紹了“有哪些Linux磁盤緩存相關知識”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

前言

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

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

局部性原理

程序局部性原理:程序在執行時呈現出局部性規律,即在一段時間內,整個程序的執行僅限于程序中的某一部分。相應地,執行所訪問的存儲空間也局限于某個內存區域,具體來說,局部性通常有兩種形式:時間局部性和空間局部性。

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

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

頁緩存

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

頁緩存是由內存中的物理頁面組成的,其內容對應磁盤上的物理塊。頁緩存的大小會根據系統的內存空閑大小進行動態調整,它可以通過占用內存以擴張大小,也可以自我收縮以緩解內存使用壓力。

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

頁緩存的讀取

Linux系統在讀取文件時,會優先從頁緩存中讀取文件內容,如果頁緩存不存在,系統會先從磁盤中讀取文件內容更新到頁緩存中,然后再從頁緩存中讀取文件內容并返回。

大致過程如下:

  • 進程調用庫函數read發起讀取文件請求

  • 內核檢查已打開的文件列表,調用文件系統提供的read接口

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

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

  • 讀取文件返回

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

頁緩存的寫入

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

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

回寫線程

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

  • 空閑內存低于閾值時。當空閑內存不足時,需要釋放掉一部分緩存,由于只有不臟的頁才能被釋放,所以需要把臟頁都回寫到磁盤,使其變為可回收的干凈的頁。

  • 臟頁在內存中處理時間超過閾值時。這是為了確保臟頁不會無限期的留在內存中,減少數據丟失的風險。

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

回寫線程的實現

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

頁緩存的回收

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

“有哪些Linux磁盤緩存相關知識”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

车致| 杨浦区| 枞阳县| 玉龙| 得荣县| 永兴县| 荣昌县| 五常市| 张家界市| 浦江县| 安乡县| 浦东新区| 广南县| 浠水县| 招远市| 图木舒克市| 奉节县| 安丘市| 青州市| 韶山市| 招远市| 宜黄县| 叶城县| 亳州市| 大宁县| 马尔康县| 永济市| 凤城市| 靖州| 吉林省| 会昌县| 海口市| 虎林市| 财经| 淅川县| 富阳市| 鞍山市| 宜州市| 勃利县| 华阴市| 道孚县|