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パッケージをインストールします。- >- sudozypper in bcache-tools
- バッキングデバイスを作成します(通常は機械式ドライブ)。デバイス全体、パーティション、またはその他の標準ブロックデバイスをバッキングデバイスにすることができます。 - >- sudomake-bcache -B /dev/sdb
- キャッシュデバイスを作成します(通常はSSDディスク)。 - >- sudomake-bcache -C /dev/sdc- この例では、デフォルトのブロックサイズとバケットサイズである512Bと128KBを使用しています。ブロックサイズはバッキングデバイスのセクタサイズ(通常は512または4k)と一致している必要があります。バケットサイズは、書き込みの増大を防ぐために、キャッシングデバイスの消去ブロックサイズと一している必要があります。たとえば、セクタが4kのハードディスクと消去ブロックサイズが2MBのSSDを使用する場合、このコマンドは次のようになります。 - sudo make-bcache --block 4k --bucket 2M -C /dev/sdc ヒント: 複数デバイスのサポート- make-bcacheは、複数のバッキングデバイスとキャッシュデバイスを同時に準備および登録できます。この場合、後から手動でキャッシュデバイスをバッキングデバイスに接続する必要はありません。- >- sudomake-bcache -B /dev/sda /dev/sdb -C /dev/sdc
- bcacheデバイスは次のように表示されます。- /dev/bcacheN - さらに、次のようにも表示されます。 - /dev/bcache/by-uuid/UUID /dev/bcache/by-label/LABEL - bcacheデバイスは通常の方法で正常にフォーマットおよびマウントできます。- >- sudomkfs.ext4 /dev/bcache0- >- sudomount /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にします。 - >- sudolvcreate -n ORIGIN_LV -L 100G vg /dev/SLOW_DEV
- キャッシュデータLVを作成します。このLVには、起点LVからのデータブロックが格納されます。このLVのサイズがキャッシュのサイズになり、キャッシュプールLVのサイズとして報告されます。 - >- sudolvcreate -n CACHE_DATA_LV -L 10G vg /dev/FAST
- キャッシュメタデータLVを作成します。このLVには、キャッシュプールメタデータが格納されます。このLVのサイズは、キャッシュデータLVの約1000分の1にする必要があります。最小サイズは8MBです。 - >- sudolvcreate -n CACHE_METADATA_LV -L 12M vg /dev/FAST- これまでに作成したボリュームの一覧を表示します。 - >- sudolvs -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という名前に変更され、非表示になります。 - >- sudolvconvert --type cache-pool \ --poolmetadata vg/cache_metadata_lv vg/cache_data_lv- >- sudolvs -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という名前に変更され、非表示になります。 - >- sudolvconvert --type cache --cachepool vg/cache_data_lv vg/origin_lv- >- sudolvs -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に書き戻されます。
>sudolvconvert --splitcache vg/origin_lv
4.4.2.2 起点LVを削除せずにキャッシュプールLVを削除 #
この方法では、必要に応じてキャッシュプールから起点LVにデータを書き戻してから、キャッシュプールLVを削除し、キャッシュされていない起点LVを残します。
>sudolvremove vg/cache_data_lv
次に示す別のコマンドでも、キャッシュLVからキャッシュプールを接続解除し、キャッシュプールを削除します。
>sudolvconvert --uncache vg/origin_lv
4.4.2.3 起点LVとキャッシュプールLVの両方を削除 #
キャッシュLVを削除すると、起点LVとリンクされたキャッシュプールLVの両方が削除されます。
>sudolvremove vg/origin_lv
4.4.2.4 詳細情報 #
     サポートされるキャッシュモード、冗長なサブ論理ボリューム、キャッシュポリシー、既存のLVからキャッシュタイプへの変換など、lvmcacheに関連するその他のトピックは、lvmcacheのマニュアルページ(man 7
     lvmcache)で参照できます。