Case No.5

知りたいことを調べて形にしてみたブログ。

dm-cacheでHDDのキャッシングをしよう

表題のまんま。HDDだと遅いので、SSDキャッシュを載せて高速化を図ろうっていう。

 

 

ssdキャッシュを構築するためにdm-cacheを構築する。
参考サイトは

dm-cacheの技術概要と構築手順 #Linux - Qiita

 

テスト環境は大容量HDDとしてHDD(/dev/sdd1)、SSD(/dev/nvme0n1)の構成。
SSDは4TBのSN850を使用。

それぞれをフォーマット。

HDDのほう

parted /dev/sdd
p
mklabel gpt
mkpart mainhdd xfs 1 -1
p
q

mkfs.xfs /dev/sdd1

 

 

SSDのほう

parted /dev/nvme0n1

p
mklabel gpt
mkpart cachessd xfs 1 -1
p
q

mkfs.xfs /dev/nvme0n1p1

 

 

LVMのissue_discardsを1に変更

ソリッドステートドライブ - ArchWiki

を見たけど理解出来ない・・・どういうこと・・・。

vi /etc/lvm/lvm.conf

#issue_discards = 0
#がコメントアウトされているので、まあその付近でコメントアウトを外してかコピーして
issue_discards = 1

 

初期 RAM ファイルシステムイメージの再構築


dracut -f
sync

再起動

reboot

フィジカルボリューム(PV)の作成

pvcreate /dev/sdd1

WARNING: xfs signature detected on /dev/sdd1 at offset 0. wipe it?[y/n]という警告が出るがyで通す
同じように

pvcreate /dev/nvme0n0p1

これも警告が出るけどyで。

確認は

pvdisplay

再起動したりするとsdXが変わってしまうことがあるので、pvdisplayで確認した方が良い。

ボリュームグループ(VG)の作成

HDDとSSDを大きなボリュームとしてまとめる。

vgcreate hybrid_vg0 /dev/sdd1 /dev/nvme0n0p1

ロジカルボリューム(LV)の作成

HDDの方をlv0として全て割り当てる。

lvcreate -l 100%FREE -n lv0 hyvrid_vg0 /dev/sdd1

SSDの方は、全SSD(キャッシュ)容量の1%をメタデータとして割り当てる。
pvdisplayで<3.64tibとなっていたので、
3TBをキャッシュ、300GBをメタデータとすることにする。

lvcreate -L 300G -n cache_meta hybrid_vg0 /dev/nvme0n1p1

※これはエラーが出るので下で再作成

lvcreate -L 3T -n cache hybrid_vg0 /dev/nvme0n1p1

 

 

オプションは

【 lvcreate 】コマンド――論理ボリュームを作成する:Linux基本コマンドTips(337) - @IT

-lはエクステント(パーセンテージ)、-Lはサイズ(GやT)で容量を表す。
-nは名前。

キャッシュプールの作成

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

ここでエラー。
300GBのメタデータは仕様外(16GBまでだって)いうエラーが出たので、一旦LVを削除して作り直す。
あとチャンクサイズも3TBにしてはおかしいんじゃあと言われる。

【 lvremove 】コマンド――論理ボリュームを削除する:Linux基本コマンドTips(340) - @IT


lvremove -A n hybrid_vg0

何か全般的に消そうとするので、meta_cacheのみyであとはnにする。

再度作成

lvcreate -L 16G -n cache_meta hybrid_vg0 /dev/nvme0n1p1

再度チャンクサイズを抜いてキャッシュプールの作成

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

1000000チャンクしか無理よ、全部ぶっ壊れるぞと警告が出るが、そんなことを言われてもという話なので、
yを押下。
暫く後プロンプトが復帰して終了。

HDDとキャッシュプールを紐付ける

lvconvert --type cache --cachepool /dev/hybrid_vg0/cache /dev/hybrid_vg0/lv0

metadata消して以下言われるのでy
押下すると今からキャッシュするわと言われて終了。

確認

lvs -a hybrid_vg0

フォーマット
lvはパーティションを切ったりしなくても良いのでそのままフォーマット。

mkfs.xfs /dev/hybrid_vg0/lv0

blkidでUUIDを出してからfstabに記述すれば、マウントまで出来て終了。

キャッシュプールの取り外し
キャッシュプールが壊れたりするかもしれないので。

lvconvert --splitcache hybrid_vg0/lv0

あー、HDDの方を指定するのね。
こいつに対しては全部ナシ、みたいな。

再度有効にする場合は、前回同様同じように紐付ける。

lvconvert --type cache --cachepool /dev/hybrid_vg0/cache /dev/hybrid_vg0/lv0

なるほどね。

オチ

話にはオチがあって、なんとRAIDカードが優秀(Megaraid9460)らしく、ネットワーク越しに送信すると、ネットワーク帯域ギリギリ(10Gbps)でファイル転送出来てしまい、ファイルサーバにキャッシュを載せてSSD速度でボトルネックを解消しようプレイはお預けになったとさ。

広告はCrucialのT500。1TB1万2000円程度とかなりこなれてきたので、キャッシュ付きSSDとしてお勧めしたい。