SSD 作為經常讀取數據的讀取記憶體
我正在尋找利用 SSD 來加速我的系統的方法。在《Linux 相當於 ReadyBoost?”(以及觸發我的研究)我了解了bcache、dm-cache和EnhanceIO。所有這三個似乎都能夠在 SSD 上記憶體讀取數據。
但是,除非我遺漏了什麼,否則這三個似乎都在第一次讀取時將文件/塊/範圍/任何內容儲存在記憶體中。大型順序讀取可能是一個例外,但否則似乎每次讀取記憶體未命中都會導致某些內容被記憶體。我希望記憶體能夠記憶體我經常使用的那些讀取。我擔心對我所有的 maildir 文件的正文進行搜尋或在某個大目錄中進行遞歸 grep 可能會驅逐我經常閱讀的大部分內容。
**是否有任何技術可以記憶體經常讀取的文件,而不是最近讀取的文件?**建立某種形式的活動集或類似的東西?我想自適應替換可能是一個描述我所追求的術語。
缺少這些,我想知道使用 LVM 作為底層是否有意義,並在其上建構幾個支持 bcache 的設備。這個想法是,例如郵件讀取不會驅逐記憶體
/usr
等。每個掛載的文件系統都將獲得自己的固定大小的記憶體,或者根本沒有。**有沒有人有在 lvm 上使用 bcache 的經驗?**有反對這種方法的理由嗎?也歡迎任何替代建議。但是請注意,我正在尋找可以在 Linux 上用於生產的東西。我認為具有 L2ARC 功能的 ZFS 不屬於該類別(目前),儘管如果您確信相反的觀點,歡迎您爭論這一點。使用 LVM 的原因是我希望能夠根據需要調整為這些不同文件系統分配的空間大小,這對於使用靜態分區來說是一件很痛苦的事情。因此,提議的解決方案也應該提供這種靈活性。
編輯1:一些澄清。
我主要關心的是啟動時間。我希望看到用於每次啟動的所有文件都可以在該 SSD 上輕鬆訪問。而且我寧願不必擔心保持SSD同步,例如在軟體包升級之後(這在我的Gentoo測試中經常發生)。如果我在啟動過程中不使用的常用數據也出現在記憶體中,這是一個額外的好處。我目前的工作項目例如將是一個不錯的候選人。但我猜我每天使用的文件中有 90% 會在按下電源按鈕後的前 5 分鐘內使用。這一目標的一個結果是,在引導後擦除記憶體的方法,如 ZFS L2ARC 顯然是這樣做的,不是一個可行的解決方案。
goldilocks 的回答將焦點從記憶體插入轉移到記憶體驅逐。但這並沒有改變問題的根本性質。除非記憶體跟踪某個項目的使用頻率或頻率,否則內容可能仍會過早地從記憶體中刪除。特別是因為我希望我一直使用的那些文件從啟動到關閉都駐留在 RAM 記憶體中,因此每次啟動時它們只會從磁碟讀取一次。我為 bcache 和 dm-cache 找到的記憶體驅逐策略,即 LRU 和 FIFO,都將驅逐那些啟動時文件,而不是在同一工作日讀取的其他文件。因此我的擔心。
據我所知,dm-cache 可以滿足您的要求。我找不到確切的來源,但這裡作者解釋說他應該稱之為 dm-hotspot,因為它試圖找到“熱點”,即高活動區域並且只記憶體那些。
在您的輸出中
dmsetup status
會發現兩個變數,即read_promote_adjustment
和write_promote_adjustment
。該cache-policies
文件解釋說在內部,MQ 策略確定了提升門檻值。如果不在記憶體中的塊的命中計數超過此門檻值,它將被提升到記憶體中。
因此,通過調整
read_promote_adjustment
,write_promote_adjustment
您可以確定頻繁讀取/寫入數據的確切含義,並且一旦讀取/寫入次數超過此門檻值,該塊將被“提升”到,即儲存在記憶體中。請記住,此(預記憶體)元數據通常保存在記憶體中,並且僅在記憶體設備掛起時才寫入磁碟/SSD。