Linux

lvmcache/dm-cache 寫回記憶體全性能

  • December 30, 2021

我在 HDD 前面有一個 SSD 回寫記憶體,通過 lvmcache 設置(所以是 dm-cache)。當記憶體 LV 未滿時( < 100.00%Data%中的列lvs),寫入會轉到記憶體設備(通過 監控dstat)。但是,當記憶體 LV 已滿時 (Data%= 100.00%),寫入直接進入 HDD,本質上成為直寫記憶體。即使經過一段時間,塊也不會從 SSD 記憶體中被逐出,並且性能下降。當我嘗試從記憶體的 LV 中讀取最近讀取的數據時,讀取來自 SSD,因此我假設整個 SSD 現在已成為讀取記憶體。這是 dm-cache 的寫記憶體的預期行為,即使在寫回模式下?沒有預留空間寫嗎?這似乎是一個非常糟糕的設計,因為在記憶體成為直寫記憶體之前,使用者只能寫入一個記憶體 LV 的數據。

我的理解是 dm-cache 使用mq eviction algorithm,但這僅適用於讀取記憶體,因此與我觀察到的寫入記憶體問題無關。

有沒有辦法為寫記憶體保留空間,或者同時使用 dm-writecache (我理解它不會做任何讀記憶體)和 dm-cache ?

dm-cache是一個“緩慢移動”的記憶體:提升一個塊需要許多讀/寫未命中,特別是當提升一個新塊意味著降級一個已經記憶體的塊時。

的固定基於塊的性質dm-cache,加上沒有保留的只寫區域,意味著需要對相同的非記憶體塊進行多次寫入才能觸發塊提升/替換。然而,這也意味著核心頁面記憶體沒有“吸收”這些多次失去的寫入,而是將它們合併到對底層塊設備的一次寫入中。

換句話說,您可能會看到核心頁面記憶體(它吸收和合併寫入)不願意dm-cache提升第一個失去的塊的綜合效果。

如果您想保留一些設備/空間僅用於寫入記憶體,您可以dm-writecache使用(和通常的lvmcache

附加資訊:

dm-cache確實阻止升級/降級跟踪訪問命中/未命中。首先,您有一個空記憶體,所有 I/O 都定向到原始(慢速)設備。因此,當您發出 4K 讀取時,它將訪問底層慢速設備,並dm-cache跟踪未命中。在對同一記憶體塊(預設 32K)進行一些其他未命中後,整個記憶體塊將被複製到快速設備。如果您現在寫入記憶體塊,您的寫入將被記憶體。但是,如果您的寫入是針對未記憶體的塊,它會直接進入原始(慢速)設備。在其他一些未記憶體的寫入之後,dm-cache最終將分配整個記憶體塊(記住,預設為 32K)將原始數據複製到記憶體設備。此時,可以從記憶體中提供新的讀/寫。降級很簡單:當必須提升一個新塊時,最舊的塊被丟棄/刷新。

換句話說,要記憶體寫入,必須分配相應的記憶體段,並且必須將備份數據複製到記憶體設備上(寫時分配)。為了限制源設備和記憶體設備之間的頻寬使用,這個副本僅在多次未命中後完成(即:單個未命中不會提升塊)。請注意,多次讀取相同的未記憶體塊將不起作用,因為核心頁面記憶體將簡單地自行提供記憶體塊。

dm-writecache工作方式不同,更類似於傳統的 RAID 控制器寫回記憶體。它記憶體所有寫入,忽略讀取。它幾乎可以被認為是“只寫 L2 頁面記憶體”,臟頁被“交換”,等待慢速設備趕上。要使用它,您需要在dm-cache(此時必須作為writethrough記憶體執行)和之間對快速設備進行分區dm-writecache,或者為它們分配不同的設備。我從未嘗試過通過 LVM 這樣做,我懷疑該工具會阻止您嵌套/堆疊兩個不同的記憶體模組。但是,您可以通過直接dmsetup命令進行嘗試。

引用自:https://serverfault.com/questions/1088512