OpenMediaVault7 (OMV7) に Cache 機能 追加検討

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 をインストール
インストールすると ストレージに Bcache 項目が増えています。同時に bcache-tools もインストールされます。

バッキングデバイス準備

bcache0 の バッキングデバイスとして md0 を使います。RAID5を構成している共有、マウントをmd0 からはずします。OpenMediaVault7 【Part 1】で、作成した時の逆の手順ですね。

サービス → SMB/CIFS共有フォルダを選択 → RAID5-0 を選んで削除。

ストレージ → 共有フォルダ → RAID5-0 を選んで削除。

ストレージ → ファイルシステム → /dev/md0 を選んで アンマウント。

次に SSH 端末から

# umount -v /dev/md0
umount: /dev/md0: not mounted. となり、何もマウントされてない状態までコマンドを 2-3 度繰り返します。これで、Backing Devices 用 ブロックデバイス md0 が用意できました。

キャッシュデバイス準備

Cache Devices は 2.5インチタイプのSSDを使います。
最近では殆ど使わない DVD ドライブを置き換えるキャディを使って取付けます。
ストレージ → ディスクでドライブを確認すると /dev/sde が 用意した120Gbyte SSD KINGSTON SA400S37120G になっていました。

 

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
ここまでで、/dev/bcache0 が作成されているはずなので、確認して下さい。同時にプラグインのBcache の各項目も設定されていますので、確認しておきましょう。続けて、フォーマットします。
# mkfs.ext4 /dev/bcache0
後は、bcache0 を従来の md0 のごとく扱って、マウント、共有していきます。RAID5作成の時のmd0への操作を bcache0 に対応するだけなので、OpenMediaVault7 【Part 1】を参考に md0 を 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-ArchWikibcacheでHDDへの書き込みを見かけ上速くするあるいはbcacheのドキュメントなどとにかく、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

 

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