1. 程式人生 > >文件緩存回寫簡述

文件緩存回寫簡述

inter 大於 臟數據 路徑 req cal bsp 來看 ack

1 文件緩存回寫的時機

(1)周期性回寫,周期為dirty_writeback_interval,默認5s;

(2)塊設備首次出現臟數據;

(3)臟頁達到限額,包括dirty_bytes、dirty_background_bytes、dirty_ratio、dirty_background_ratio;

(4)剩余內存過少,喚醒所有回寫線程;

(5)syscall sync,喚醒所有回寫線程;

(6)syscall syncfs,同步一個超級快對應的文件系統;

(7)syscall fsync/fdatasync,同步某個文件

(8)laptop模式,完成blk io request之後,啟動laptop_mode_wb_timer;

2 回寫流程

3 dirty_writeback_intervaldirty_expire_interval

dirty_writeback_interval是回寫線程的循環周期,當然,循環的前提是塊設備存在臟數據;

dirty_expire_interval是臟數據的超時時間,超過這個時間的臟數據將會馬上放入回寫隊列,但是這個模式只有一條路徑,啟用的writeback_work是for_kupdate模式,目前看這條路徑只有在周期性回寫最後創建一個此類work檢查超時臟數據;

周期性回寫的流程如下:

bdi_writeback_workfn

--> wb_do_writeback

--> wb_writeback

--> wb_check_old_data_flush

--> for_kupdate模式wb_writeback

--> wb_check_background_flush

--> for_background模式wb_writeback

for_kupdate模式只回寫dirty_expire_interval之前的臟數據;

for_background模式回寫當前所有臟數據;

從此流程來看,dirty_expire_interval的作用不大,只是作為一種可選模式。

4 系統掉電時最長丟失多少臟數據

從回寫周期來看,無論是塊設備首先臟數據還是回寫線程的循環周期,都是間隔dirty_writeback_interval,它的默認值是5s。但是由於寫臟數據的過程並不在這個間隔時間內,所以丟失的數據可能長於5s。

而臟數據的回寫采取FIFO的策略,所以最老的數據也不會停留很久,所以這個最長時間可以理解為略大於5s.

文件緩存回寫簡述