OpenMediaVault7 (OMV7) に Cache 機能を追加する検討を行いました。”検討”としているのは今回の実現環境ではCache による性能Upが期待できないので、Cache 組み込みの “コスト=手間”を算出するために検討したとお考え下さい。10ギガLAN 導入時など Cache による性能Upが期待できる時にどれくらいの “コスト” で導入できるか推定できる様になりました。OMV7の Bcacheプラグインを試したくて”検討”したのですが、忘れない内に備忘録的に記事にしておきます。
全体の構成図
実験検討での構成図を示します。
キャッシュ機能を含んだ全体を ブロックデバイス bcache0 として扱います。Cache Devices は ブロックデバイス sde を構成している 120Gbyteの SSD を使用し、Backing Devices はメカニカルのHard Disk x 4 で構成された RAID5 = md0 を使用します。また入出力は 1Gbps のギガビットイーサネットを使用致します。
Bcache 組み込み
OpenMediaVault7 (OMV7) で作る PC1台 54TB RAID5 システム【Part 1】( 以後 OpenMediaVault7 【Part 1】) をベースに変更を加える事で”検討”しますので、まずは OpenMediaVault7 【Part 1】の内容をよく理解して下さい。
Bcache プラグイン インストール
システム → プラグイン → openmediavault-cache 7.x.x をインストール
バッキングデバイス準備
bcache0 の バッキングデバイスとして md0 を使います。RAID5を構成している共有、マウントをmd0 からはずします。OpenMediaVault7 【Part 1】で、作成した時の逆の手順ですね。
サービス → SMB/CIFS → 共有フォルダを選択 → RAID5-0 を選んで削除。
ストレージ → 共有フォルダ → RAID5-0 を選んで削除。
ストレージ → ファイルシステム → /dev/md0 を選んで アンマウント。
次に SSH 端末から
# umount -v /dev/md0
キャッシュデバイス準備

bcache0 作成
# if=/dev/zero of=/dev/sde bs=512 count=8 # wipefs -a /dev/sde # if=/dev/zero of=/dev/md0 bs=512 count=8 # wipefs -a /dev/md0 # make-bcache -B /dev/md0 --block 4k --bucket 512k -C /dev/sde
# mkfs.ext4 /dev/bcache0
ストレージ → ファイルシステム → ▶既存のファイルシステムをマウント → /dev/bcache0 を設定
ストレージ → 共有フォルダ作成 → 名前 RAID5-0, 作成 /dev/bcache0 で実行
サービス → SMB/CIFS → 共有フォルダを選択 → RAID5-0, ゴミ箱を有効化 を選んで実行
ここまでで、Windows から読み書きできる様になっています。
ここで、追加で /array-0 をマウントして動作チェックしてもよいのですが、どうせなら再起動時に必要な設定もして再起動しましょう。
再起動後に必要な修正
StartUptime.sh 修正
立ち上がり時に実行される StartUptime.sh を修正します。修正後のStatrUptime.sh をまるまる載せますが、多分青字の行の修正で良いはずです。なお、赤字部分は各自違うはずですので、調べて各自に合わせて下さい。
#!/bin/bash # StartUptime.sh ( StartUptime.sh StartUptime execute program ) PATH=/usr/sbin:/usr/bin:/sbin:/bin LOG=/var/log/installer/StartUptime_log date > $LOG MOUNT01=/srv/dev-disk-by-uuid-8c34cdc3-5907-4be6-bebe-bf4136f13b65 echo "" >> $LOG echo "# mount -v /dev/bcache0 $MOUNT01" >> $LOG mount -v /dev/bcache0 $MOUNT01 >> $LOG 2>&1 echo "" >> $LOG echo "# mount -v /dev/bcache0 /array-0" >> $LOG mount -v /dev/bcache0 /array-0 >> $LOG 2>&1 echo "" >> $LOG echo "# smartctl -l scterc,70,70 $DISK0" >> $LOG smartctl -l scterc,70,70 $DISK0 >> $LOG 2>&1 echo "" >> $LOG echo "# smartctl -l scterc,70,70 $DISK1" >> $LOG smartctl -l scterc,70,70 $DISK1 >> $LOG 2>&1 echo "" >> $LOG echo "# smartctl -l scterc,70,70 $DISK2" >> $LOG smartctl -l scterc,70,70 $DISK2 >> $LOG 2>&1 echo "" >> $LOG echo "# smartctl -l scterc,70,70 $DISK3" >> $LOG smartctl -l scterc,70,70 $DISK3 >> $LOG 2>&1
/etc/fstab 修正 ( 一部削除 )
/etc/fstab を開いて、最後の一行、つまり /srv/dev-disk-by-uuid-8c34cdc3-5907-4be6-bebe-bf4136f13b65 を含む行を削除します。この行に相当する動作は StartUptime.sh 中のマウントで行っています。
/etc/mdadm/mdadm.conf 修正, initramfsのupdate
/etc/mdadm/mdadm.conf を開いて最後の行 ARRAY …. を削除してから
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
を実行して、 /etc/mdadm/mdadm.conf に新しい ARRAY … を貼り付けます。
# update-initramfs -u
を実行、情報を update します。
これで、再起動できます。再起動後は、一通り、動作チェックしましょう。
詳細設定・詳細データ
詳細設定・詳細データ に アクセスするには ・・
Bcache の設定は、大まかには Bcache プラグインを設定してもできますが、細かい設定はコマンドで行う事になりそうです。
# cd /sys/block/bcache0/bcache # ls -la
で、コマンド・設定項目の一覧をだせます。
最初のownerのパーミッションコマンドを確認します。owner は root ですので、例えば cache_mode は -rw-r–r– ですので、root の人が cat コマンドで 内容を読み出したり、echo コマンドで書き込んだりできます。他の人は cat コマンドで読み出しのみですね。
# cd /sys/block/bcache0/bcache # cat cache_mode または # cat /sys/block/bcache0/bcache/cash_mode
と打つと、現在の cash_modeが
[writethrough] writeback writearound none
と読み出せます。コマンドで内容変更して読み出すには echo コマンド、cat コマンドを使って
# echo writeback > /sys/block/bcache0/bcache/cache_mode # cat /sys/block/bcache0/bcache/cash_mode writethrough [writeback] writearound none
てな感じで実行できます。例えば、–w—— の attach は rootの人のみが attach できる事になります。命令の読み書きには echo, cat を使うのですが、echo のパラメータは 1, 0, や 10等の数字、あるいは writeback 等の文字列と色々あります。一方 cat のパラメータは基本的に有りませんので、-rw-r–r– の時には読み出しコマンドを先に実行すると パラメータの推定がつきます。
いずれにしても詳細設定や詳細データは多量ですので、Bcache-ArchWikiやbcacheで
私も今のところなんとなく理解している程度ですので….。
入出力測定
入出力を測定するまでもなく、Cache の効果は殆ど見込めないと思います。一般的にCacheの効果は入出力のデータラインが Baching Devieces に比べて非常に速い場合に、両者の速度差を Cache Devices で効果的に埋める事で期待できます。今回の検討では入出力が ギガビットイーサ (1Gbps=110~120Mbytes/s ) です。一方 通常のメカニカルハードディスクの入出力は 150~250M 程度、ましてや RAID構成の場合は、構成にもよりますが、x2~x7 位の速度になります。今回は x3 程度になりますので、 450Mbytes/s 以上になります。SATAの速度で頭打ちになりますが、1Gbps 以上は確実に出ますので、速度改善は望めません。では、どの様な場合にCache の効果が望めるかと言うと、入出力が非常に速い場合、例えば最近の流行りの 10GLAN等になった場合です。さらに、Cache デバイスも所謂2.5インチタイプのSSD等ではなく、もっと高速の NVMe(NVM Express)タイプを使う必要があります。2.5インチタイプのSSDは入出力が 500M 前後ですので、メカニカルハードディスク 1台より早いものの、RAID構成にした場合は速度差がなかったりします。それらを踏まえて検討したシステムのCache 有り/無し で簡単な入出力測定を行います。
特定は CristlDiskMark , default で行いました。左が Writeback (入出力ともにCacheを入れた場合) 右が none (Cache なし) です。なお、Bcacheの設定はdefault (最初にインストールした状態)です。細かい調整はできていません。ギガビットイーサの速度で頭打ちになっているので、殆ど差がありません。予想どおり、Cache の効果は期待できなさそうです。
まとめ
OMV7 にCacheを追加するのは思いの他、簡単にできます。但し、追加する時には全体としてフォーマットする必要がありますので、過去のデータをそのままで追加はできません、一旦どこかにバックアップしてから移し直しになります。多分これが一番大きな”コスト”です。Cacheを追加したから全ての場合で性能UPになる訳ではなく、入出力のLAN速度が速い場合に(=10GLAN) に速度の速い Cache (=NVMe(NVM Express))を使用して初めて、性能UPを実感できます。10GLAN, 1GLAN等の速度はなんとなく実感できますが、通常のメカニカルハードディスク や NVMeディスクの速度も実感したいものです。私の PC は Cディスク( 一部 Nディスク) に NVMe, Dディスクにメカニカルハードディスクを使用していますので、CristalDiskMark で計ってみました。
左は NVMe (=Nディスク)の速度を計ったものです。かなり古い世代のNVMeですが、それでも2000MB/s 位はでます。最新の世代だとこの倍以上です。10GLANだと 1000~1200MB/s くらいですので、10GLANのCacheには最低これくらい欲しいものです。
左はメカニカルハードディスクを測定したものです。このディスクはハードディスクとしてはそこそこ早いものですが、200MB/s くらいしかでません。またランダムアクセスが極端に遅くなるのもメカニカルハードディスクの特徴です。RAIDにすると、この 2~7倍速度がでるので、Cacheデバイスに 2.5インチタイプのSSDでは心元ない事になります。
少し話がそれますが、以前よりRAIDの記事は良く見かけるのに、Cacheの記事が殆どなく、また、Cacheを実装した装置が少ない事が不思議でした。
今回検討してみてなんとなく実感できました。要は LAN速度が速くないとCacheの効果が少ないという事です。今後 10GLAN等が普及すると、Cacheを見かける機会も増えるのではないでしょうか。
PC2台連携 システム に Cacheを追加する場合 ( 2025年5月31日 )
ついでに OpenMediaVault7 (OMV7) で作る PC2台連携 108TB RAID6 システムにもCache機能追加の実験をしました。 md0 をバッキングデバイスにするので、殆ど同じイメージで作成できます。但しPC2台連携システムでは結構重要な ShutDowntime.sh に変更が必要です。ここでは備忘録としてShutDowntime.sh の 変更/ 変更前 のみ載せて置きます。
ShutDowntime.sh ( 変更前 / 変更後 )
ShutDowntime.sh です。黒字部分は Cache 無し/有り で共通 , 青字部分は Cache無し (=オリジナル) 赤字部分は Cache 有り (変更後) です。
#!/bin/bash # ShutDowntime.sh ( ShutDowntime.sh ShutDowntime program for Master) PATH=/usr/sbin:/usr/bin:/sbin:/bin LOG=/var/log/installer/ShutDowntime_log STP=/var/log/installer/Stop_FLAG LOOP=4 # LOOP 1,2,3,4 while [ $LOOP != 0 ] do date > $LOG sleep 1 _Beep.sh 4 # smba stop request echo "" >> $LOG echo "# smbcontrol all shutdown" >> $LOG smbcontrol all shutdown >> $LOG 2>&1 ; sleep 5 # nfs stop request echo "" >> $LOG echo "# umount -lat nfs4" >> $LOG umount -lat nfs4 >> $LOG 2>&1 ; sleep 5 echo "" >> $LOG echo "# umount -f -v /array-1" >> $LOG umount -f -v /array-1 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -f -v /array-2" >> $LOG umount -f -v /array-2 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -v /dev/md0" >> $LOG umount -v /dev/md0 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -v /dev/md0" >> $LOG umount -v /dev/md0 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -v /dev/md0" >> $LOG umount -v /dev/md0 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -f -v /dev/bcache0" >> $LOG umount -f -v /dev/bcache0 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -f -v /dev/bcache0" >> $LOG umount -f -v /dev/bcache0 >> $LOG 2>&1 echo "" >> $LOG echo "# umount -f -v /dev/bcache0" >> $LOG umount -f -v /dev/bcache0 >> $LOG 2>&1 if [ -d "/sys/block/bcache0" ]; then echo "" >> $LOG echo "# echo 1 > /sys/block/bcache0/bcache/stop" >> $LOG echo 1 > /sys/block/bcache0/bcache/stop fi echo "" >> $LOG echo "# df" >> $LOG df >> $LOG 2>&1 echo "" >> $LOG echo "# mdadm --stop /dev/md0" >> $LOG mdadm --stop /dev/md0 >> $LOG 2>&1 ; sleep 5 echo "" >> $LOG echo "# cat /proc/mdstat" >> $LOG cat /proc/mdstat >> $LOG 2>&1 echo "" >> $LOG echo "# mdadm --stop /dev/md0" >> $LOG mdadm --stop /dev/md0 >> $LOG 2>&1 ; sleep 5 echo "" >> $LOG echo "# cat /proc/mdstat" >> $LOG cat /proc/mdstat >> $LOG 2>&1 cat /proc/mdstat | grep active > $STP if [ -s $STP ]; then echo "mdadm : active" else echo "mdadm : inactive" LOOP=0 fi if [ $LOOP = 1 ]; then LOOP=0 ; fi if [ $LOOP = 2 ]; then LOOP=1 ; fi if [ $LOOP = 3 ]; then LOOP=2 ; fi if [ $LOOP = 4 ]; then LOOP=3 ; fi continue break done cat $LOG cat /proc/mdstat | grep active > $STP if [ -s $STP ]; then _Beep.sh 2 sleep 1 else _Beep.sh 1 sleep 1 fi