計算機底層知識拾遺(七)頁緩存數據同步和頁回收機制

這篇說說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. 在回收壓力大的情況下如何避免頁顛簸


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章