4 ブロックデバイス操作の多層キャッシング #
多層キャッシュは、2つ以上の層で構成される複製/分散キャッシュです。1つは低速であるものの安価な回転方式のブロックデバイス(ハードディスク)に代表され、もう1つは高価であるもののデータ操作を高速に実行します(SSDフラッシュディスクなど)。
SUSE Linux Enterprise Serverは、フラッシュデバイスと回転方式のデバイスとの間のキャッシング用に、それぞれbcache
およびlvmcache
という2つの異なるソリューションを実装しています。
4.1 一般的な用語 #
本項では、キャッシュ関連機能の説明でよく使用されるいくつかの用語について説明します。
- マイグレーション
論理ブロックの主コピーをデバイス間で移動すること。
- 昇格
低速なデバイスから高速なデバイスへのマイグレーション。
- 降格
高速なデバイスから低速なデバイスへのマイグレーション。
- 起点デバイス
大容量で低速なブロックデバイス。古いか、キャッシュデバイス上のコピーとの同期が保たれている(ポリシーによります)、論理ブロックのコピーが常に含まれます。
- キャッシュデバイス
小容量で高速なブロックデバイス。
- メタデータデバイス
キャッシュに入っているブロック、ダーティブロック、およびポリシーオブジェクトが使用する追加のヒントを記録する小容量のデバイス。この情報はキャッシュデバイスに配置することもできますが、別個に保持することにより、ボリュームマネージャで異なった設定にすることができます。たとえば、堅牢性を強化するためのミラーとして設定できます。メタデータデバイスを使用できるキャッシュデバイスは1つだけです。
- ダーティブロック
何らかのプロセスがキャッシュに配置されたデータブロックに書き込みを行う場合、そのキャッシュされているブロックは、キャッシュ内で上書きされていて、元のデバイスにもう一度書き込む必要があるため、「ダーティ」とマークされます。
- キャッシュミス
I/O操作の要求は、まず、キャッシュされたデバイスのキャッシュを参照します。要求された値が見つからなかった場合、デバイス自体を検索しますが、これは低速です。これを「キャッシュミス」と呼びます。
- キャッシュヒット
要求された値がキャッシュされたデバイスのキャッシュ内で見つかった場合、その値は高速に提供されます。これを「キャッシュヒット」と呼びます。
- コールドキャッシュ
値が格納されていない(空の)キャッシュのことで、「キャッシュミス」を引き起こします。キャッシュされたブロックデバイスの操作が進むにつれて、キャッシュはデータで満たされていき、「ウォーム」になります。
- ウォームキャッシュ
すでに何らかの値が格納されていて、「キャッシュヒット」になる確立が高いキャッシュ。
4.2 キャッシングモード #
多層キャッシュで使用される基本的なキャッシングモードは、「ライトバック」、「ライトスルー」、「ライトアラウンド」、および「パススルー」です。
- ライトバック
キャッシュされているブロックに書き込まれたデータは、キャッシュにのみ書き込まれ、そのブロックはダーティとマークされます。これはデフォルトのキャッシングモードです。
- ライトスルー
キャッシュされているブロックへの書き込みは、起点デバイスとキャッシュデバイスの両方にヒットするまで完了しません。「ライトスルー」キャッシュでは、クリーンブロックはクリーンな状態のままです。
- ライトアラウンド
ライトスルーキャッシュと同様の手法ですが、書き込みI/Oは、キャッシュをバイパスして永続ストレージに直接書き込まれます。この手法では、直後に再読み込みされない書き込みI/Oによってキャッシュがいっぱいになるのを防ぐことができますが、最近書き込まれたデータの読み込み要求で「キャッシュミス」が発生し、低速なバルクストレージからの読み込みが必要になり、レイテンシが増加するという欠点があります。
- パススルー
「パススルー」モードを有効にするには、キャッシュがクリーンである必要があります。読み込みは、キャッシュをバイパスして起点デバイスから実行されます。書き込みは起点デバイスに転送され、キャッシュブロックは「無効化」されます。「パススルー」では、データ整合性が維持されるため、データ整合性を気にすることなくキャッシュデバイスをアクティブ化できます。書き込みが実行されるにつれて、キャッシュは徐々にコールドになります。後でキャッシュの整合性を検証できる場合、または
invalidate_cblocks
メッセージを使用して整合性を保証できる場合は、キャッシュデバイスがまだウォームである間に、デバイスを「ライトスルー」または「ライトバック」モードに切り替えることができます。それ以外の場合は、目的のキャッシングモードに切り替える前に、キャッシュの内容を破棄できます。
4.3 bcache
#
bcache
はLinuxカーネルブロック層のキャッシュです。1台以上の高速なディスクドライブ(SSDなど)を1台以上の低速なハードディスクのキャッシュとして動作させることができます。bcache
は、ライトスルーとライトバックをサポートし、使用するファイルシステムから独立しています。デフォルトでは、SSDの強みである、ランダム読み込みとランダム書き込みのみのキャッシュを実行します。デスクトップやサーバのほか、ハイエンドのストレージアレイにも適しています。
4.3.1 主な特徴 #
1つのキャッシュデバイスを使用して、任意の数のバッキングデバイスをキャッシュできます。バッキングデバイスは、マウント中および使用中のランタイムに接続および切断できます。
不正なシャットダウンから回復します。キャッシュがバッキングデバイスと整合性があるようになるまで、書き込みは完了しません。
輻輳する場合、SSDへのトラフィックを制限します。
非常に効率的なライトバック実装。ダーティデータは常にソートされた順序で書き込まれます。
運用環境での使用における安定性と信頼性。
4.3.2 bcache
デバイスのセットアプ #
この項では、bcache
デバイスのセットアップと管理の手順を説明します。
bcache-tools
パッケージをインストールします。sudo zypper in bcache-tools
バッキングデバイスを作成します(通常は機械式ドライブ)。デバイス全体、パーティション、またはその他の標準ブロックデバイスをバッキングデバイスにすることができます。
sudo make-bcache -B /dev/sdb
キャッシュデバイスを作成します(通常はSSDディスク)。
sudo make-bcache -C /dev/sdc
この例では、デフォルトのブロックサイズとバケットサイズである512Bと128KBを使用しています。ブロックサイズはバッキングデバイスのセクタサイズ(通常は512または4k)と一致している必要があります。バケットサイズは、書き込みの増大を防ぐために、キャッシングデバイスの消去ブロックサイズと一している必要があります。たとえば、セクタが4kのハードディスクと消去ブロックサイズが2MBのSSDを使用する場合、このコマンドは次のようになります。
sudo make-bcache --block 4k --bucket 2M -C /dev/sdc
ヒント: 複数デバイスのサポートmake-bcache
は、複数のバッキングデバイスとキャッシュデバイスを同時に準備および登録できます。この場合、後から手動でキャッシュデバイスをバッキングデバイスに接続する必要はありません。sudo make-bcache -B /dev/sda /dev/sdb -C /dev/sdc
bcache
デバイスは次のように表示されます。/dev/bcacheN
さらに、次のようにも表示されます。
/dev/bcache/by-uuid/UUID /dev/bcache/by-label/LABEL
bcache
デバイスは通常の方法で正常にフォーマットおよびマウントできます。mkfs.ext4 /dev/bcache0 mount /dev/bcache0 /mnt
bcache
デバイスは、/sys/block/bcacheN/bcache
にあるsysfs
によって制御できます。キャッシュデバイスとバッキングデバイスの両方を登録した後、バッキングデバイスを関連キャッシュセットに接続して、キャッシュを有効にする必要があります。
echo CACHE_SET_UUID > /sys/block/bcache0/bcache/attach
CACHE_SET_UUIDは
/sys/fs/bcache
で確認できます。デフォルトでは、
bcache
はパススルーキャッシングモードを使用します。たとえば、これをライトバックに変更するには、次のコマンドを実行します。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」という2つのデバイスに分割します。キャッシュデータLVは、速度の向上を目的として、起点LVからのデータブロックのコピーが保持される場所です。キャッシュメタデータLVには、データブロックが保存されている場所を指定するアカウンティング情報が格納されます。
4.4.1 lvmcache
の設定 #
この項では、LVMベースのキャッシングの作成と設定の手順を説明します。
起点LVを作成します。新しいLVを作成するか既存のLVを使用して、起点LVにします。
lvcreate -n ORIGIN_LV -L 100G vg /dev/SLOW_DEV
キャッシュデータLVを作成します。このLVには、起点LVからのデータブロックが格納されます。このLVのサイズがキャッシュのサイズになり、キャッシュプールLVのサイズとして報告されます。
lvcreate -n CACHE_DATA_LV -L 10G vg /dev/FAST
キャッシュメタデータLVを作成します。このLVには、キャッシュプールメタデータが格納されます。このLVのサイズは、キャッシュデータLVの約1000分の1にする必要があります。最小サイズは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
キャッシュプール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という名前に変更されて、非表示になります。
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
キャッシュLVを作成します。キャッシュプールLVを起点LVにリンクして、キャッシュLVを作成します。
ユーザがアクセス可能なキャッシュLVは起点LVの名前を引き継ぎ、起点LVは非表示LVになってORIGIN_LV_corigという名前に変更されます。
キャッシュLVは、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 その他の情報 #
サポートされるキャッシュモード、冗長なサブ論理ボリューム、キャッシュポリシー、既存のLVからキャッシュタイプへの変換など、lvmcache
に関連するその他のトピックは、lvmcache
のマニュアルページ(man 7 lvmcache
)で参照できます。