dm-cacheで高速化を狙う

dm-cache

1. 階層化ストレージについて

SSDが普及し始めた頃から、Linux上で様々なSSDを用いたキャッシュのテクノロジーが現れては消えを繰り返してきました。
しかし熾烈な生存競争に生き残ったテクノロジーもあり、
今回はdm-cacheを利用したいと思います。
本稿の執筆にあたっては、@Kaz_Kさん執筆のdm-cacheの技術概要と構築手順を参考にさせていただきました。ありがとうございました。

2.構築のイメージ

ここでは、SSDを/dev/sda、HDDを/dev/sdbとしてお話を進めていくこととします。下の図を参考にしてください。
最上位のレイヤーであるファイルシステムからはキャッシュが透過的に扱われますので利用者側が普段意識する事はありません。
(もちろんcacheの状態を確認する事は可能です)

ストレージ階層構造について
物理ドライブ構成図

3. 各物理ドライブへの割り当てについて

当たり前といえばそうなのですが、SSDとHDDで、割り当てるべき容量が違ってきます。
SSDに対してはこう言う感じで容量を割り当てていきます。
私もあれこれ調べては見たのですが、MetaData領域にはキャッシュドライブの容量の1%を指定している情報ばかり(英語は・・・ごめんなさい)。
まぁとりあえず1%割り当てておくことにします。

SSDに割り当てる要領について

HDDについてはあえてここで述べるような事はありませんが、せっかく絵を作ったので貼らせてくださいw

HDDに割り当てる容量について

4.構築の実際

ここからは実際のコマンドをトレースしながら、どのようにキャッシュされたLVMが構築されていくのかを見ていきたいと思います。

4.1 下準備

LVMの”issue_discards” 設定を変更し、再起動しておきます。
この設定、SSDのTRIMがらみでも触ることがあるみたいですね。

# vi /etc/lvm/lvm.conf
issue_discards = 0 を
issue_discards = 1 に変更。

# dracut -f
# sync
# reboot

4.2 PVの作成

もうここからは淡々と作業するのみ!

# pvcreate /dev/sda1
  Physical volume "/dev/sda1" successfully created.

# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.

4.3 VGの作成

どんどん進めていきましょう。

# vgcreate hybrid_vg0 /dev/sda1 /dev/sdb1
  Devices have inconsistent logical block sizes (512 and 4096).
  See lvm.conf allow_mixed_block_sizes.

おっと・・・ロジカルブロックサイズが SSDとHDDで違っているようですね。
さてどうしましょうか。

確かにこれはちがいますねぇ・・・・

# blockdev --report /dev/sd{a,b}
RO    RA   SSZ   BSZ   開始セクタ          サイズ デバイス
rw  8192   512  4096          0    999997571072   /dev/sda
rw  8192  4096  4096          0   8999978139648   /dev/sdb

で、結局こうなりました。

# vgcreate --config devices/allow_mixed_block_sizes=1 hybrid_vg0 /dev/sda1 /dev/sdb1
  Physical volume "/dev/sda1" successfully created.
  Volume group "hybrid_vg0" successfully created

4.4 LVの作成

さくさく進むはずです。
キャッシュとメタデータの作成については前述の通りです
それにしてもSSDで1TBなんていい時代になったものですね。
キャッシュメタデータのサイズについては、はっきりこうと書いたものがみあたらなかったので、とりあえずキャッシュサイズの1%としておきます。
(容量を使い切っていない件については、後述ということで・・・・)

# lvcreate -L 8G -n cache_meta hybrid_vg0 /dev/sda1
  Logical volume "cache_meta" created.

# lvcreate -L 800G -n cache hybrid_vg0 /dev/sda1
  Logical volume "cache" created.

# lvcreate -l 100%FREE -n lv0 hybrid_vg0 /dev/sdb1
  Logical volume "lv0" created.

4.5 cache poolの作成

どんどん進めていきます。
せっかくなので、キャッシュモードはWriteBackに設定します。
cachemodeを指定しないとwritetrueとなります。
がしかし・・・

[root@nas01 ~]# lvconvert --type cache-pool --cachemode writeback --poolmetadata /dev/hybrid_vg0/cache_meta --chunksize 256 /dev/hybrid_vg0/cache
  Chunk size 256.00 KiB is less than required minimal chunk size 896.00 KiB for a cache pool of <831.32 GiB size and limit 1000000 chunks.
  To allow use of more chunks, see setting allocation/cache_pool_max_chunks.

だみだこりゃ。
チャッンクサイズの上限を打ち破ってしまったようですね。
では、これでどうかなぁ?

# lvconvert --type cache-pool --cachemode writeback --poolmetadata /dev/hybrid_vg0/cache_meta --chunksize 1024 /dev/hybrid_vg0/cache

WARNING: Converting hybrid_vg0/cache and hybrid_vg0/cache_meta to cache pool's data and metadata volumes with metadata wiping.
THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.)
Do you really want to convert hybrid_vg0/cache and hybrid_vg0/cache_meta? [y/n]: y
Converted hybrid_vg0/cache and hybrid_vg0/cache_meta to cache pool.

4.6 cache poolの紐付け

ここまできたら、このコマンドでHDDに対してSSDをキャッシュとして紐づけて高速なLogical Volumeを作成します。

# lvconvert --type cache --cachepool /dev/hybrid_vg0/cache /dev/hybrid_vg0/lv0
  Do you want wipe existing metadata of cache pool hybrid_vg0/cache? [y/n]: y
  Logical volume hybrid_vg0/lv0 is now cached.

4.7 Filesystemの作成と動作確認

そして、最後にこれをお忘れなく。
今回FileSystemとしてbtrfsを選択しています。
まぁ今でも色々言われているようですが、私はbtrfsに助けられたのでほかを選択する余地はありません。
動作確認については適当なファイルをコピーするなどしましょう。

# mkfs.btrfs /dev/hybrid_vg0/lv0

5.ベンチマークなど

6.構築後の操作

6.1 cacheの取り外し

キャッシュを無効にしたいときは、次のコマンドでCache Poolを外すことができます。また、再度Cache Poolを接続することもできますが、一度取り外した後に再接続する場合、キャッシュは消去されます。(検証やベンチマークが目的で、キャッシュを一旦削除したい場合にも有効です。)

# lvconvert --splitcache hybrid_vg0/lv0
  Flushing 0 blocks for cache hybrid_vg0/lv0.
  Logical volume hybrid_vg0/lv0 is not cached and cache pool hybrid_vg0/cache is unused.

取り外した結果。Cache Pool自体は残ってます。

# lvs -a hybrid_vg0
  LV              VG         Attr       LSize   Pool    Origin      Data%  Meta%  Move Log Cpy%Sync Convert
  [cache]         hybrid_vg0 Cwi---C--- 800.00g                     0.08   0.09            0.00            
  [cache_cdata]   hybrid_vg0 Cwi-ao---- 800.00g                                                            
  [cache_cmeta]   hybrid_vg0 ewi-ao----   8.00g                                                            
  lv0             hybrid_vg0 Cwi-a-C---  <8.19t [cache] [lv0_corig] 0.08   0.09            0.00            
  [lv0_corig]     hybrid_vg0 owi-aoC---  <8.19t                                                            
  [lvol0_pmspare] hybrid_vg0 ewi-------   8.00g 

再度キャッシュを有効にしたいときは、構築時と同じコマンドで、LVを結合します。

# lvconvert --type cache --cachepool /dev/hybrid_vg0/cache /dev/hybrid_vg0/lv0
Do you want wipe existing metadata of cache pool hybrid_vg0/cache? [y/n]: y
  Logical volume hybrid_vg0/lv0 is now cached.

# lvs -a hybrid_vg0
  LV              VG         Attr       LSize   Pool    Origin      Data%  Meta%  Move Log Cpy%Sync Convert
  

参考資料

Qiitadm-cacheの技術概要と構築手順
Qiita [CentOS] dm-cacheを使用してSSDをHDDのキャッシュにする
RedHatDM_Cache
RedHat BlogImproving read performance with dm-cache
bootloader blogSSD Caching Using dm-cache Tutorial
FibrevillageHow to remove cache of a cache Logivcal Volume

コメント

タイトルとURLをコピーしました