一、簡介
由于頁高速緩存的緩存作用,寫操作實際上會被延遲。當頁高速緩存中的資料比背景存儲的資料更新時,那麼該資料就被稱做髒資料。在記憶體中累積起來的髒頁最終必須被寫回磁盤。
在以下兩種情況發生時,髒頁被寫回磁盤:
1、當空閑記憶體低于一個特定的門檻值時,核心必須将髒頁寫回磁盤,以便釋放記憶體。
2、當髒頁在記憶體中駐留時間超過一個特定的門檻值時,核心必須将逾時的髒頁寫回磁盤,以確定髒頁不會無限期地駐留在記憶體中。
上面兩種工作的目的完全不同。實際上,在老核心中,這是由兩個獨立的核心線程分别完成的。但是在2.6核心中,由一群核心線程—pdflush背景回寫例程—統一執行兩種工作。
我們來看看這兩個目标是如何具體實作的。
首先,當系統中的空閑記憶體低于一個特定的門檻值時,pdflush線程将髒頁重新整理回磁盤。該背景回寫例程的目的在于在可用實體記憶體過低時,釋放髒頁以重新獲得記憶體。特定的記憶體門檻值可以通過dirty_background_ratio參數設定。當空閑記憶體比門檻值dirty_ background_ratio還低時,核心便會調用函數wakeup_bdflush()喚醒一個pdflush線程,随後pdflush線程進一步調用函數background_writeout()開始将髒頁寫回磁盤。函數background_ writeout()需要一個長整型參數,該參數指定試圖回寫的頁面數目。函數background_writeout()會連續地寫出資料,直到滿足以下兩個條件:
1、已經有指定的最小數目的頁被寫出到磁盤。
2、空閑記憶體數已經回升,超過了門檻值dirty_background_ratio。
上述條件確定了pdflush操作可以減輕系統中記憶體不足的壓力。回寫操作不會在達到這兩個條件前停止,除非pdflush寫回了所有的髒頁,沒有剩下的髒頁可再被寫回了。
要滿足第二個目标,pdflush背景例程會被周期性喚醒(和空閑記憶體是否過低無關),将那些在記憶體中駐留時間過長的髒頁寫出,確定記憶體中不會有長期存在的髒頁。加入系統發生崩潰,則記憶體會處于混亂之中,而那些在記憶體中還沒來得及寫回磁盤的髒頁就會丢失,是以周期性同步回寫非常重要。在系統啟動時,核心初始化一個定時器,讓它周期地喚醒pdflush線程,随後使其運作函數wb_kupdate()。該函數将把所有駐留時間超過百分之dirty_expire_centisecs秒的髒頁寫回。然後定時器将再次被初始化為百分之dirty_expire_ centisecs秒後喚醒pdflush線程。總而言之,pdflush線程周期地被喚醒并且把超過特定期限的髒頁寫回磁盤。
二、proc下的相關控制參數
系統管理者可以在/proc/sys/vm中設定回寫相關的參數,也可以通過sysctl系統調用設定它們。
/proc/sys/vm/dirty_ratio
這個參數控制一個程序在檔案系統中的檔案系統寫緩沖區的大小,機關是百分比,表示系統記憶體的百分比,表示當一個程序中寫緩沖使用到系統記憶體多少的時候,再有磁盤寫操作時開始向磁盤寫出資料。增大之會使用更多系統記憶體用于磁盤寫緩沖,也可以極大提高系統的寫性能。但是,當你需要持續、恒定的寫入場合時,應該降低其數值,一般預設是 40。
/proc/sys/vm/dirty_background_ratio
這個參數控制檔案系統的pdflush程序,在何時重新整理磁盤。機關是百分比,表示系統總記憶體的百分比,意思是當磁盤的髒資料緩沖到系統記憶體多少的時候,pdflush開始把髒資料重新整理到磁盤。增大會使用更多系統記憶體用于磁盤寫緩沖,也可以極大提高系統的寫性能。但是,當你需要持續、恒定的寫入場合時,應該降低其數值,一般預設是10。
/proc/sys/vm/dirty_writeback_centisecs
Pdflush寫背景程序每隔多久被喚醒并執行把髒資料寫出到硬碟。機關是 1/100 秒。預設數值是500,也就是 5 秒。如果你的系統是持續地寫入動作,那麼實際上還是降低這個數值比較好,這樣可以把尖峰的寫操作削平成多次寫操作。設定方法如下:
echo 200 >/proc/sys/vm/dirty_writeback_centisecs
/proc/sys/vm/dirty_expire_centisecs
這個參數聲明Linux核心寫緩沖區裡面的髒資料多“舊”了之後,pdflush 程序就開始考慮寫到磁盤中去。機關是 1/100秒。預設是 30000,也就是 30 秒的資料就算舊了,将會重新整理磁盤。對于特别重載的寫操作來說,這個值适當縮小也是好的,但也不能縮小太多,因為縮小太多也會導緻IO提高太快。建議設定為 1500,也就是15秒算舊。
echo 1500 >/proc/sys/vm/ dirty_expire_centisecs