跳至內容跳至頁面導覽:上一頁 [access key p]/下一頁 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文件 / 儲存管理指南 / 檔案系統與掛接 / 用於區塊裝置操作的多層快取
適用範圍 SUSE Linux Enterprise Server 12 SP5

4 用於區塊裝置操作的多層快取

多層快取是一種複製式/分散式快取,它至少包括兩層︰一層由速度較慢、較為廉價的旋轉區塊裝置 (硬碟) 代表,另一層成本較高,但執行資料操作時速度更快 (例如,SSD 隨身碟)。

SUSE Linux Enterprise Server 為快閃裝置與旋轉裝置之間的快取實作兩種不同的解決方案︰bcachelvmcache

4.1 一般術語

本節介紹在說明快取相關功能時經常用到的一些術語︰

移轉

將邏輯區塊的主要副本從一個裝置移至另一個裝置。

升職

從慢速裝置移轉至快速裝置。

降級

從快速裝置移轉至慢速裝置。

原始裝置

大型慢速區塊裝置。它總是包含邏輯區塊的副本,該副本可能已過時或者與快取裝置上的副本保持同步 (視規則而定)。

快取裝置

小型高速區塊裝置。

中繼資料裝置

小型裝置,用於記錄哪些區塊在快取中、哪些區塊有所改動,以及規則物件使用的其他提示。此資訊也可以放在快取裝置上,但分開放置可讓磁碟區管理員對它進行不同的設定,例如,設定為鏡像以進一步提高穩健性。中繼資料裝置只能由單一快取裝置使用。

改動的區塊

如果某個程序將資料寫入快取中的某個資料區塊,該快取的區塊便會標記為改動區塊,因為該區塊已在快取中覆寫,需要寫回原始裝置。

快取遺漏

對 I/O 操作的要求首先會指向已快取裝置的快取。如果找不到要求的值,則會在裝置本身內尋找,因此速度會變慢。這稱為快取遺漏

快取命中

如果在已快取裝置的快取中找到要求的值,便可以快速提供該值。這稱為快取命中

冷快取

未保留任何值 (空白) 並且會導致快取遺漏的快取。在快取的區塊裝置進行操作的過程中,冷快取中會填入資料,從而變為快取。

暖快取

已保留一些值並且可能會導致快取命中的快取。

4.2 快取模式

下面是多層快取使用的基本快取模式︰寫回直寫繞寫直通

寫回

寫入已快取區塊的資料只會移至快取,並且該區塊會標記為改動。這是預設的快取模式。

直寫

只有在同時命中原始裝置和快取裝置之後,向快取區塊的寫入才會完成。在直寫快取中,空白的區塊將保持空白狀態。

繞寫

類似於直寫快取的一種技術,不過,寫入 I/O 會直接寫入永久性儲存,並繞過快取。這可以防止在快取中發生大量後續不會重新讀取的寫入 I/O。不過,缺點是對最近寫入資料的讀取要求會造成「快取遺漏」,因而需要從慢速大量儲存中讀取這些資料,造成更大的延遲。

直通

若要啟用直通模式,快取須空白。讀取會從原始裝置進行,而繞過快取。寫入會轉遞到原始裝置,並使快取區塊「失效」。直通可以啟用快取裝置,而不必擔心資料的一致性。隨著寫入的不斷進行,快取將逐漸變為冷快取。如果您之後可以驗證快取的一致性,或者可以使用 invalidate_cblocks 訊息來建立這種一致性,則可以在快取裝置仍處於暖狀態時,將它切換到直寫寫回模式。否則,可以先丟棄快取內容,然後切換到所需的快取模式。

4.3 bcache

bcache 是一個 Linux 核心區塊層快取。它允許使用一或多個高速磁碟機 (例如 SSD) 做為一或多個慢速硬碟的快取。bcache 支援直寫和寫回,不受所使用的檔案系統的影響。依預設,它只快取隨機讀取和寫入,這也是 SSD 的強項。它還適合用於桌上型電腦、伺服器和高端儲存陣列。

4.3.1 主要功能

  • 可以使用單個快取裝置來快取任意數量的支援裝置。在執行時期,可以附加和分離已掛接及使用中的支援裝置。

  • 在非正常關機後復原 — 只有在快取與支援裝置保持一致後才會完成寫入。

  • 在 SSD 壅塞期對傳往 SSD 的流量進行節流。

  • 高效的寫回實作。已改動資料一律按排序順序寫出。

  • 穩定可靠 — 可用於線上用途。

4.3.2 設定 bcache 裝置

本節介紹設定及管理 bcache 裝置的步驟。

  1. 安裝 bcache-tools 套件︰

    sudo zypper in bcache-tools
  2. 建立支援裝置 (通常是機械磁碟機)。支援裝置可以是整個裝置、一個分割區或其他任何標準區塊裝置。

    sudo make-bcache -B /dev/sdb
  3. 建立快取裝置 (通常是 SSD 磁碟)。

    sudo make-bcache -C /dev/sdc

    本範例使用預設的區塊大小和貯體大小,分別為 512 B 和 128 KB。區塊大小應與支援裝置的磁區大小 (通常為 512 或 4k) 相符。貯體大小應與快取裝置的去除區塊大小相符,以盡可能減少寫入放大。例如,如果使用具有 4k 磁區的硬碟和具有 2 MB 去除區塊大小的 SSD,此指令如下所示︰

    sudo make-bcache --block 4k --bucket 2M -C /dev/sdc
    提示
    提示:多裝置支援

    make-bcache 可以同時準備和註冊多部支援裝置與一部快取裝置。如此,您便無需再將快取裝置手動附加到支援裝置︰

    sudo make-bcache -B /dev/sda /dev/sdb -C /dev/sdc
  4. bcache 裝置將顯示為

    /dev/bcacheN

    /dev/bcache/by-uuid/UUID
    /dev/bcache/by-label/LABEL

    您可以像往常一樣正常格式化和掛接 bcache 裝置︰

    mkfs.ext4 /dev/bcache0
    mount /dev/bcache0 /mnt

    您可以在 /sys/block/bcacheN/bcache 中透過 sysfs 控制 bcache 裝置。

  5. 註冊快取裝置和支援裝置後,需要將支援裝置附加到相關的快取集才能啟用快取︰

    echo CACHE_SET_UUID > /sys/block/bcache0/bcache/attach

    其中,CACHE_SET_UUID 可以在 /sys/fs/bcache 中找到。

  6. bcache 預設使用直通快取模式。您可以變更其模式,例如,若要變更為寫回,請執行

    echo writeback > /sys/block/bcache0/bcache/cache_mode

4.3.3 使用 sysfsbcache 組態

bcache 裝置使用 sysfs 介面來儲存其執行時期組態值。如此您可以變更 bcache 支援裝置和快取磁碟的行為,或查看其使用統計資料。

如需 bcache sysfs 參數的完整清單,請查看 /usr/src/linux/Documentation/bcache.txt 檔案的內容,主要是 SYSFS - BACKING DEVICESYSFS - BACKING DEVICE STATSSYSFS - CACHE DEVICE 區段的內容。

4.4 lvmcache

lvmcache 是由邏輯磁碟區 (LV) 組成的快取機制。它使用 dm-cache 核心驅動程式,並支援直寫 (預設) 和寫回快取模式。lvmcache 可將其某些資料動態移轉至更快、更小的 LV,以提高大型慢速 LV 的效能。如需 LVM 的詳細資訊,請參閱第 II 部分 「邏輯磁碟區 (LVM)」

LVM 將小型快速 LV 稱為快取池 LV。大型慢速 LV 稱為原始 LV。由於 dm-cache 的要求,LVM 進一步將快取池 LV 分割成兩個裝置︰快取資料 LV快取中繼資料 LV。來自原始 LV 的資料區塊副本保存在快取資料 LV 中,以提高速度。快取中繼資料 LV 保存統計資訊,這些資訊指定資料區塊的儲存位置。

4.4.1 設定 lvmcache

本節介紹建立及設定 LVM 式快取的步驟。

  1. 建立原始 LV。建立新 LV,或使用現有 LV 做為原始 LV︰

    lvcreate -n ORIGIN_LV -L 100G vg /dev/SLOW_DEV
  2. 建立快取資料 LV。此 LV 將保存來自原始 LV 的資料區塊。此 LV 的大小即是快取的大小,將報告為快取池 LV 的大小。

    lvcreate -n CACHE_DATA_LV -L 10G vg /dev/FAST
  3. 建立快取中繼資料 LV。此 LV 將保存快取池中繼資料。此 LV 的大小應該比快取資料 LV 大約小 1000 倍,最小大小為 8MB。

    lvcreate -n CACHE_METADATA_LV -L 12M vg /dev/FAST

    列出到目前為止建立的磁碟區︰

    lvs -a vg
    LV                VG   Attr        LSize   Pool Origin
    cache_data_lv     vg   -wi-a-----  10.00g
    cache_metadata_lv vg   -wi-a-----  12.00m
    origin_lv         vg   -wi-a----- 100.00g
  4. 建立快取池 LV。將資料 LV 和中繼資料 LV 合併成一個快取池 LV。可以同時設定快取池 LV 的行為。

    CACHE_POOL_LVCACHE_DATA_LV 同名。

    CACHE_DATA_LV 將重新命名為 CACHE_DATA_LV_cdata,並且會隱藏起來。

    CACHE_META_LV 將重新命名為 CACHE_DATA_LV_cmeta,並且會隱藏起來。

    lvconvert --type cache-pool \
     --poolmetadata vg/cache_metadata_lv vg/cache_data_lv
    lvs -a vg
    LV                     VG   Attr       LSize   Pool Origin
    cache_data_lv          vg   Cwi---C---  10.00g
    [cache_data_lv_cdata]  vg   Cwi-------  10.00g
    [cache_data_lv_cmeta]  vg   ewi-------  12.00m
    origin_lv              vg   -wi-a----- 100.00g
  5. 建立快取 LV。透過將快取池 LV 連結到原始 LV,來建立快取 LV。

    使用者可存取的快取 LV 與原始 LV 同名,原始 LV 將變成重新命名為 ORIGIN_LV_corig 的隱藏 LV。

    CacheLV 與 ORIGIN_LV 同名。

    ORIGIN_LV 將重新命名為 ORIGIN_LV_corig,並且會隱藏起來。

    lvconvert --type cache --cachepool vg/cache_data_lv vg/origin_lv
    lvs -a vg
    LV              VG   Attr       LSize   Pool   Origin
    cache_data_lv          vg   Cwi---C---  10.00g
    [cache_data_lv_cdata]  vg   Cwi-ao----  10.00g
    [cache_data_lv_cmeta]  vg   ewi-ao----  12.00m
    origin_lv              vg   Cwi-a-C--- 100.00g cache_data_lv [origin_lv_corig]
    [origin_lv_corig]      vg   -wi-ao---- 100.00g

4.4.2 移除快取池

關閉 LV 快取的方法有數種。

4.4.2.1 從快取 LV 分離快取池 LV

您可以從快取 LV 中斷快取池 LV 的連接,留下一個未使用的快取池 LV 和一個未快取的原始 LV。資料將視需要從快取池寫回到原始 LV。

lvconvert --splitcache vg/origin_lv

4.4.2.2 移除快取池 LV 但不移除其原始 LV

如此,可以在必要時將資料從快取池寫回原始 LV,然後移除快取池 LV,留下未快取的原始 LV。

lvremove vg/cache_data_lv

也可以使用以下替代指令從快取 LV 中斷快取池連接,並刪除快取池︰

lvconvert --uncache vg/origin_lv

4.4.2.3 移除原始 LV 和快取池 LV

移除快取 LV 會同時移除原始 LV 和連結的快取池 LV。

lvremove vg/origin_lv

4.4.2.4 更多資訊

您可以在 lvmcache man 頁面 (man 7 lvmcache) 中找到 lvmcache 的更多相關主題,例如支援的快取模式、備援的子邏輯磁碟區、快取規則,或者將現有 LV 轉換為不同的快取類型。