文件緩存回寫簡述
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_interval與dirty_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.
文件緩存回寫簡述