標籤:頁緩衝 資料同步 頁交換 頁回收 swap
這篇說說Linux的頁快取資料同步和頁回收機制。資料同步和頁回收是兩個獨立的概念,資料同步處理的是記憶體/緩衝的資料和後備裝置的資料一致問題,頁回收處理的是在記憶體空間不足時如何回收已指派的實體記憶體頁,來獲得足夠空間分配乾淨頁,支援優先順序更高的工作。資料同步在任意時刻都有可能觸發,頁回收則是在實體記憶體使用達到一定閥值的時候觸發。
資料同步就是把實體記憶體和頁緩衝中的髒頁寫回到後備裝置的檔案中去。有兩種方式可以調用資料同步
1. 周期性的調用,主要是pdflush機制
2. 強制調用,比如調用sync, fsync系統調用。當髒頁數量很多時,核心也會強制進行資料同步,來控制髒頁的數量,使資料同步造成的IO盡量平滑
pdflush是一組核心線程,相當於核心維護了一個pdflush線程池,根據資料同步的負載來分配pdflush線程,一個pdflush線程可以對應一個塊裝置,這樣多個pdflush線程對應多個塊裝置,可以避免單個塊裝置的IO負載過大影響其他塊裝置的資料同步。
cat /proc/sys/vm/nr_pdflush_threads 可以查看當前系統啟動的pdflush線程數量
給出了sync等系統調用觸發的資料完整性同步(即同步所有的髒頁),以及pdflush觸發的周期性刷出同步所調用的核心功能
1. 可以看到資料同步的目標主要是檔案系統的對象,比如檔案系統超級塊,檔案inode中繼資料,檔案inode資料區塊。
2. 不管是資料完整性同步,還是flush同步,最後的調用路徑都彙集到了sync_sb_inodes函數,這個函數會同步給定超級塊的所有髒inodes
同步一個超級塊的所有髒inodes 如果每次都要遍曆所有的inode鏈表去過濾髒inode,那效率是相當低下的。實際上核心專門維護了一個髒inode鏈表,通過超級塊的super_block --> s_dirty指標指向這個髒inode鏈表,這樣只要依次對這個鏈表的inode進行同步即可。
對一個inode同步包括兩部分,中繼資料同步和資料區塊同步,核心提供了很多標誌位來細化資料同步的操作細節。
比較幾個強制同步的系統調用
sync:同步所有的髒頁,是資料完整性同步。當IO請求發送到請求隊列後就返回,不等待磁碟操作的完成。當磁碟發生故障時可能造成資料丟失
fsync: 對單個檔案的中繼資料和資料區塊同步,等待直到磁碟操作完成後才返回,保證了資料的可靠性
fdatasync: 對單個檔案的資料區塊同步,等待直到磁碟操作完成後才返回,保證了資料的可靠性
msync:對mmap產生的髒頁進行同步
頁回收機制包含了三部分,資料刷出flush, 交換swap, 釋放release.
資料刷出flush和資料同步是類似的,就是把有後備檔案的頁緩衝都同步到磁碟,從而可以回收這些頁面
交換swap主要是對匿名映射,私人映射,malloc動態分配的記憶體這些沒有後備檔案的記憶體頁進行回收,把他們交換到位於磁碟的交換區,從而可以回收這些頁面
釋放release主要是一些針對一些LRU的唯讀記憶體頁,在壓力大的情況下直接釋放,從而可以回收這樣頁面
核心的頁面回收機制主要要解決幾個問題:
1. 採用何種回收演算法來保證最大的收益
2. 回收哪些頁
3. 如何組織交換區,如何存取交換區中頁
4. 在回收壓力大的情況下如何避免頁顛簸
電腦底層知識拾遺(七)頁快取資料同步和頁回收機制