4 用於區塊裝置操作的多層快取 #
多層快取是一種複製式/分散式快取,它至少包括兩層:一層由速度較慢、較為廉價的旋轉區塊裝置 (硬碟) 代表,另一層成本較高,但執行資料操作時速度更快 (例如,SSD 隨身碟)。
SUSE Linux Enterprise Server 為快閃裝置與旋轉裝置之間的快取實作兩種不同的解決方案:bcache
和 lvmcache
。
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
裝置的步驟。
安裝
bcache-tools
套件:tux >
sudo
zypper in bcache-tools建立支援裝置 (通常是機械磁碟機)。支援裝置可以是整個裝置、一個分割區或其他任何標準區塊裝置。
tux >
sudo
make-bcache -B /dev/sdb建立快取裝置 (通常是 SSD 磁碟)。
tux >
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
可以同時準備和註冊多部支援裝置與一部快取裝置。如此,您便無需再將快取裝置手動附加到支援裝置:tux >
sudo
make-bcache -B /dev/sda /dev/sdb -C /dev/sdcbcache
裝置將顯示為/dev/bcacheN
和
/dev/bcache/by-uuid/UUID /dev/bcache/by-label/LABEL
您可以像往常一樣正常格式化和掛接
bcache
裝置:tux >
sudo
mkfs.ext4 /dev/bcache0tux >
sudo
mount /dev/bcache0 /mnt您可以在
/sys/block/bcacheN/bcache
中透過sysfs
控制bcache
裝置。註冊快取裝置和支援裝置後,需要將支援裝置附加到相關的快取集才能啟用快取:
tux >
echo CACHE_SET_UUID > /sys/block/bcache0/bcache/attach其中,CACHE_SET_UUID 可以在
/sys/fs/bcache
中找到。bcache
預設使用直通快取模式。您可以變更其模式,例如,若要變更為寫回,請執行tux >
echo writeback > /sys/block/bcache0/bcache/cache_mode
4.3.3 使用 sysfs
的 bcache
組態 #
bcache
裝置使用 sysfs
介面來儲存其執行時期組態值。如此您可以變更 bcache
支援裝置和快取磁碟的行為,或查看其使用統計資料。
如需 bcache
sysfs
參數的完整清單,請查看 /usr/src/linux/Documentation/bcache.txt
檔案的內容,主要是 SYSFS - BACKING DEVICE
、SYSFS - BACKING DEVICE STATS
和 SYSFS - 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 式快取的步驟。
建立原始 LV。建立新 LV,或使用現有 LV 做為原始 LV:
tux >
sudo
lvcreate -n ORIGIN_LV -L 100G vg /dev/SLOW_DEV建立快取資料 LV。此 LV 將保存來自原始 LV 的資料區塊。此 LV 的大小即是快取的大小,將報告為快取池 LV 的大小。
tux >
sudo
lvcreate -n CACHE_DATA_LV -L 10G vg /dev/FAST建立快取中繼資料 LV。此 LV 將保存快取池中繼資料。此 LV 的大小應該比快取資料 LV 大約小 1000 倍,最小大小為 8MB。
tux >
sudo
lvcreate -n CACHE_METADATA_LV -L 12M vg /dev/FAST列出到目前為止建立的磁碟區:
tux >
sudo
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建立快取池 LV。將資料 LV 和中繼資料 LV 合併成一個快取池 LV。可以同時設定快取池 LV 的行為。
CACHE_POOL_LV 與 CACHE_DATA_LV 同名。
CACHE_DATA_LV 將重新命名為 CACHE_DATA_LV_cdata,並且會隱藏起來。
CACHE_META_LV 將重新命名為 CACHE_DATA_LV_cmeta,並且會隱藏起來。
tux >
sudo
lvconvert --type cache-pool \ --poolmetadata vg/cache_metadata_lv vg/cache_data_lvtux >
sudo
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建立快取 LV。透過將快取池 LV 連結到原始 LV,來建立快取 LV。
使用者可存取的快取 LV 與原始 LV 同名,原始 LV 將變成重新命名為 ORIGIN_LV_corig 的隱藏 LV。
CacheLV 與 ORIGIN_LV 同名。
ORIGIN_LV 將重新命名為 ORIGIN_LV_corig,並且會隱藏起來。
tux >
sudo
lvconvert --type cache --cachepool vg/cache_data_lv vg/origin_lvtux >
sudo
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。
tux >
sudo
lvconvert --splitcache vg/origin_lv
4.4.2.2 移除快取池 LV 但不移除其原始 LV #
如此,可以在必要時將資料從快取池寫回原始 LV,然後移除快取池 LV,留下未快取的原始 LV。
tux >
sudo
lvremove vg/cache_data_lv
也可以使用以下替代指令從快取 LV 中斷快取池連接,並刪除快取池:
tux >
sudo
lvconvert --uncache vg/origin_lv
4.4.2.3 移除原始 LV 和快取池 LV #
移除快取 LV 會同時移除原始 LV 和連結的快取池 LV。
tux >
sudo
lvremove vg/origin_lv
4.4.2.4 更多資訊 #
您可以在 lvmcache
man 頁面 (man 7 lvmcache
) 中找到 lvmcache
的更多相關主題,例如支援的快取模式、備援的子邏輯磁碟區、快取規則,或者將現有 LV 轉換為不同的快取類型。