2013-09-25 21 views
0

所有人。我被困在以下問題上。在回收之前編寫一個緩存頁面

我正在使用ssd作爲硬盤緩存層的混合存儲系統。爲此,應將從硬盤讀取的數據寫入ssd以增強對該數據的後續讀取。由於Linux緩存從頁面緩存中的磁盤讀取的數據,因此可以延遲將數據寫入ssd;但是,緩存數據的頁面可能會被釋放,並且不推薦訪問釋放的頁面。這裏是一個問題:我有指向要寫入ssd的頁面的「struct page」指針。有沒有什麼辦法來確定指針表示的頁面是否有效(通過有效的我的意思是緩存頁面可以安全地寫入ssd?如果通過指針訪問釋放的頁面會發生什麼?是被釋放的頁面一樣?

回答

0

是否使用cleancache模塊釋放之前?你應該只從它那裏得到有效的網頁,並應繼續有效,直到你的回調函數完成。

0

這不是一個cleancache/(https://www.kernel.org/doc/Documentation/vm/cleancache.txt

現有的cleancache代碼的好處是,它只是在它釋放頁面之前調用你的代碼,所以在頁面駐留在RAM之前, nd當RAM中沒有剩餘空間時,內核會調用您的代碼將其備份到tmem(瞬態存儲器)中。

搜索我還發現了一個已經存在的項目,似乎做到這一點:http://bcache.evilpiepirate.org/

BCACHE是一個Linux內核模塊層高速緩存。它允許一個或多個快速 磁盤驅動器(如基於閃存的固態驅動器(SSD))充當用於一個或多個速度較慢的硬盤驅動器的 緩存。

Linux內核的Bcache修補程序允許使用SSD來緩存其他塊設備的 。它類似於ZFS的L2Arc,但Bcache也可以執行寫回緩存(除了通過緩存寫入外),並且它是 文件系統不可知的。它的設計目的是在開機時至少使用 ,並在沒有任何設置配置的情況下正常工作。通過 默認它不會緩存順序IO,只是隨機讀寫 SSD優於。它意味着適用於臺式機,服務器,高端存儲陣列,甚至可能是嵌入式。

+0

非常感謝您的回覆。實際上,我的實現基於flashcache,它與Bcache的用途類似。以下是我的問題的更具體的表達: – user2813839

+0

爲了編寫每個乾淨的頁面,有一個相應的BIO結構。但是,我希望通過將其列入隊列中來延遲提交BIO。我的問題是:1)當BIO在隊列中時,頁面是否可以被修改並因此變髒? 2)回寫是否只將頁面的修改部分寫入磁盤或整個頁面? 3)如果頁面在隊列中時是乾淨的,頁面是否可以被釋放? @lsk – user2813839

0

你所要實現的目標如下所示:頁從頁緩存驅逐

  • 之前,要進行緩存。這在概念上被稱爲受害者緩存。你可以在這附近找論文。
  • 你需要的是一種在IO期間「釘住」針對驅逐的頁面的方法。發佈IO後,您可以釋放頁面緩存頁面。
  • 但是,這將推遲驅逐,這可能需要在內存壓力期間創建更多未緩存的頁面。
  • 因此,一個可能的解決方案是在pagecache驅逐開始之前啓動緩存算法。
  • 第二種可能的解決方案是放置一堆空閒頁面,並將頁面緩存中被驅逐的頁面與空閒緩衝池中的頁面交換,並在後臺緩存被驅逐的頁面。但是,您現在需要與文件塊刪除等同步