最佳答案

前段時間在開發一個使用SSD做快取的系統,在高速寫入資料時會出現大量的磁碟快取。太多的磁碟快取如果沒有及時的寫入磁碟中,在機器出現問題時是非常危險的,這樣會導致很多的資料丟失,但是如果實時的將資料刷入磁碟中,這樣寫入效率有太低了。為了弄明白linux系統的這種磁碟寫入特性,最近深入的學習了一下。 VFS(Virtual File System)的存在使得linux可以相容不同的檔案系統,例如ext3、ext4、xfs、ntfs等等,其不僅具有為所有的檔案系統實現一個通用的外介面的作用,還具有另一個與系統性能相關的重要作用——快取。VFS中引入了高速磁碟快取的機制,這屬於一種軟體機制,允許核心將原本存在磁碟上的某些資訊儲存在RAM中,以便對這些資料的進一步訪問能快速進行,而不必慢速訪問磁碟本身。高速磁碟快取可大致分為以下三種:

目錄項快取記憶體——主要存放的是描述檔案系統路徑名的目錄項物件

索引節點快取記憶體——主要存放的是描述磁碟索引節點的索引節點物件

頁快取記憶體——主要存放的是完整的資料頁物件,每個頁所包含的資料一定屬於某個檔案,同時,所有的檔案讀寫操作都依賴於頁快取記憶體。其是linux核心所使用的主要磁碟快取記憶體。 正是由於快取的引入,所以VFS檔案系統採用了檔案資料延遲寫的技術,因此,如果在呼叫系統介面寫入資料時沒有使用同步寫模式,那麼大多資料將會先儲存在快取中,待等到滿足某些條件時才將資料刷入磁盤裡。

核心是如何將資料刷入磁碟的呢?在看完以下兩點後就能得到答案。

1. 把髒頁寫入磁碟 正如我們所瞭解的,核心不斷用包含塊裝置資料的頁填充頁快取記憶體。只要程序修改了資料,相應的頁就被標記為髒頁,即把它的PG_dirty標誌位置。 Unix系統允許把髒緩衝區寫入塊裝置的操作延遲執行,因為這種策略可以顯著地提高系統的效能。對快取記憶體中的頁的幾次寫操作可能只需對相應的磁碟塊進行一次緩慢的物理更新就可以滿足。此外,寫操作沒有讀操作那麼緊迫,因為程序通常是不會因為延遲寫而掛起,而大部分情況都因為延遲讀而掛起。正是由於延遲寫,使得任一物理塊裝置平均為讀請求提供服務將多於寫請求。一個髒頁可能直到最後一刻(即直到系統關閉時)都一直逗留在主存中。然而,從延遲寫策略的侷限性來看,它有兩個主要的缺點: 一、如果發生了硬體錯誤或者電源掉電的情況,那麼就無法再獲得RAM的內容,因此,從系統啟動以來對檔案進行的很多修改就丟失了。 二、頁快取記憶體的大小(由此存放它所需的RAM的大小)就可要很大——至少要與所訪問塊裝置的大小不同。因此,在下列條件下把髒頁重新整理(寫入)到磁碟:

頁快取記憶體變得太滿,但還需要更多的頁,或者髒頁的數量已經太多。

自從頁變成髒頁以來已過去太長時間。

程序請求對塊裝置或者特定檔案任何待定的變化都進行重新整理。透過呼叫sync()、fsync()或者fdatasync()系統呼叫來實現。 緩衝區頁的引入是問題更加複雜。與每個緩衝區頁相關的緩衝區首部使核心能夠了解每個獨立塊緩衝區的狀態。如果至少有一個緩衝區首部的PG_Dirty標誌被置位,就應該設定相應緩衝區頁的PG_dirty標誌。當核心選擇要重新整理的緩衝區時,它掃描相應的緩衝區首部,並只把髒塊的內容有效的寫到磁碟。一旦核心把緩衝區的所有髒頁重新整理到磁碟,就把頁的PG_dirty標誌清0。

2. pdflush核心執行緒 早期版本的linux使用bdfllush核心執行緒系統地掃描頁快取記憶體以搜尋要重新整理的髒頁,並且使用另一個核心執行緒kupdate來保證所有的頁不會髒太長時間。linux 2.6用一組通用核心執行緒pdflush替代上述兩個執行緒。這些核心執行緒結構靈活,它們作用於兩個引數:一個指向執行緒要執行的函式的指標和一個函式要用的引數。系統中pdflush核心執行緒的數量是要動態調整的:pdflush執行緒太少時就建立,太多時就殺死。因為這些核心執行緒所執行的函式可以阻塞,所以建立多個而不是一個pdflush核心執行緒可以改善系統性能。根據下面的原則控制pdflush執行緒的產生和消亡:

必須有至少兩個,最多八個pdflush核心執行緒

如果最近一次pdflush變為空閒的時間超過了1s,就應該刪除一個pdflush執行緒 所有的pdflush核心執行緒都有pdflush_work描述符,其資料結構如下:

型別 欄位 說明 struct task_struct who 指向核心執行緒描述符的指標 void (*) (unsigned long) fn 核心執行緒所執行的回撥函式 unsigned long arg0 給回撥函式的引數 struct list head list pdflush_list連結串列的連結 unsigned long when_i_went_to_sleep 當核心執行緒可用時的時間(以jiffies表示)

當系統沒有要重新整理的髒頁時,pdflush執行緒會自動處於睡眠狀態,最後由pdflush_operation()函式來喚醒。那麼在這個過程中pdflush核心執行緒主要完成了哪些工作呢?其中一些工作與髒資料的重新整理有關。尤其是pdflush通常執行下面的回撥函式之一: 1. background_writeout(): 系統地掃描頁快取記憶體以搜尋要重新整理的髒頁。

為了得到需要重新整理的髒頁,就要徹底的搜尋與在磁碟上有映像的索引節點相應的所有address_space物件(是一棵搜尋樹)。由於頁快取記憶體可能有大量的頁,如果用一個單獨的執行流來掃描整個快取記憶體,會令CPU和磁碟長時間繁忙,因此,linux使用一種複雜的機制把對頁快取記憶體的掃描劃分為幾個執行流。當記憶體不足或者使用者顯式的(使用者態程序發出sync()系統呼叫等)呼叫請求重新整理操作時會執行wakeup_bdflush()函式。wakeup_bdflush()函式會呼叫pdflush_operation()喚醒pdflush核心執行緒,並委託它執行回撥函式background_writeout()。background_writeout()函式有效的從頁快取記憶體中獲得指定數量的髒頁,並把它寫回磁碟。此外,執行background_writeout()函式的pdflush核心執行緒只有在滿足以下兩個條件下才能被喚醒:一是對頁快取記憶體中的頁內容進行了修改,二是引起髒頁部分增加到超過某個髒背景閾值。背景閾值通常設定為系統中所有頁的10%,不過可以透過修改檔案/proc/sys/vm/dirty_background_ratio來調整該值。

繼續學習常見問答

三代吉利帝豪油箱多少升

三代吉利帝豪油箱容量為54升。油箱的容積是衡量汽車儲油能力的標準。油箱的容積越大,加的油就越多。車輛續航時間越長越強,跑得越遠,可以減少加油次數。外觀方面,帝豪GL的前臉非常時尚,非常適合年輕人,整個前臉有很強的層次感。鍍鉻條裝飾的家族式進...


吉利遠景ge7油箱幾升的

吉利遠景ge7的油箱容量為48升。1.根據官方資料和專業評測,吉利遠景ge7的工信部油耗資料為5.8L/100km,綜合工況續航里程為828km。根據這個數字和油耗公式,我們可以大約計算出ge7的油箱容量為48升。2.ge7車型是一款以節油...


2014款吉利gx7油箱是多少升的

吉利gx7的燃油箱容積為60L。外觀:時尚動感的車身線條貫徹整個車身,並採用了規格為225/65-R17的五輻條樣式輪轂。新車的軸距則達到了2661mm,整車的長寬高為4541×1833×1700mm。內飾:車廂內飾依舊採用了家用車當前時下...


充電器的瓦數高與低有什麼區別

通用的手機充電器一般都是5V電壓輸出,輸出電壓是一樣的,但不同的充電器輸出功率有所不同,因為平板的電池容量更大,需要的充電功率更大,所以平板用的充電器功率會更大。充電器的功率可以用電流為標示。充電器的功率也不是越大越好的,充電器只是提供充電...


oppo充電器頭從哪看多少W

oppo充電器頭從背面看多少W可以按照如下方式進行計算:1、充電器輸出電壓乘以輸出電流,如普通手機充電器輸出為5V-2A既5X2=10W,充電器上會有標註但標註的為充電器端最大輸出值而並不一定是手機充電的功率,實際充電輸出會因手機可承受的功...


充電器瓦數大小有什麼區別

充電器瓦數越大充電越快,瓦數越小充電越慢。通用的手機充電器一般都是5V電壓輸出,輸出電壓是一樣的,但不同的充電器輸出功率有所不同,因為平板的電池容量更大,需要的充電功率更大,所以平板用的充電器功率會更大。充電器的功率可以用電流為標示。充電器...


win10怎麼調視訊記憶體

按Delete鍵進入BIOS;1、找到集顯調節位置,一般是在Chipset-NorthBridge子項中;2、找到IGDMemory,該選項是整合顯示卡視訊記憶體大小設定選項;3、按下回車鍵,選擇一個較大的視訊記憶體,按下回車鍵儲存,之後按...


手機號碼的郵箱格式是什麼

手機號碼[email protected]或者手機號碼[email protected]。現在很多網站都支援手機號碼註冊的郵箱!如果是移動手機,郵箱的格式是“通行證/手機號/別名@139.com”。電子郵箱(E-MAILBOX)是透過網路電子郵局為網路客戶提供的網路交流的電...


高鐵充電寶能帶幾個

1-2個左右。乘坐高鐵對移動電源沒有限制,也就是說帶多少毫安的充電寶都可以上高鐵的。充電寶不屬於《鐵路旅客運輸規程》中所規定的旅客禁止或限量攜帶物品,乘坐高鐵對於移動電源是沒有明確的規定的,所以高鐵是可以帶充電寶的。在乘坐高鐵時不會管乘客攜...


高鐵座椅上有沒有充電

都有。高鐵座椅上肯定有充電口。高鐵、動車是最近十年發展起來的新型列車,為方便廣大旅客充電使用,按照標準都配備有充電口,旅客可以給手機、電腦等小功率電器充電使用,充電口通常就在座位下方。就連普客列車臥鋪車廂都有充電口,你乘坐一次就知道了。一些...