Windows Serverミラー高速パリティを試す

お世話になります。

主にオンプレミス環境や、クラウドの大規模基盤構築のときのファイルシステムとして検討に挙がるのが、ZFSやRefsでの冗長化かと思います。

マイクロソフトによって開発された「ミラーリングによって高速化されたパリティ」は、ReFSや記憶域スペースといった技術と合わせることで、ZFS RAID-Zのメモリ大量消費問題や、RAID5の書き込みホール問題（サイレントクラッシュ）を克服しています。

数年前までDataCenterエディションでしか使えない認識でしたが、最新の公式ドキュメントを見るとStandardエディションでの制約が書かれていなかったため試してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d90776c3-093b-1aa5-e30f-1fc3663bfaf0.png)

このような2階層構成となり、SSD階層では1TBのキャッシュとして働き、頻度の多いファイルは高速にリードライト、HDD階層では頻度の少ないファイルのアーカイブとなることを想定しています。

今回、ベアメタルマシンにWindows Serverを入れるのではなく、Proxmoxからパススルーしたディスクを使って、ミラー高速パリティのベンチマークを取ってみたいと思います。

まず物理ディスクをWindows Server2019のVMにアタッチします。

```
ls /dev/disk/by-id
qm set <vmid> -virtio /dev/disk/by-id/<HDD_Serial>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/b903c934-6dbb-c79f-ce62-068694c77c24.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/f5bedb18-be65-d9d1-d296-c6987fb71b51.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/358d9c3d-daa3-094a-98d9-0b7978eaf607.png)

OSからはこのように見えてきます。実際はVirtioSCSIの準仮想化ドライバを入れることで認識されますが、今回は説明を省略しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/2ae36e63-ebad-34f0-5bdd-11e10a13a6be.png)

以下のサイトを参考にさせて頂き、記憶域プールを作成します。
https://syobon.jp/blog/2018/05/14/build-cheap-and-very-first-storage/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/3e3b5118-a3d8-664c-6b8e-597ccf48d87d.png)

コマンドで状況を確認します。

```
 Get-StoragePool tank | Get-PhysicalDisk | ft FriendlyName,SerialNumber,CanPool,BusType,DeviceID,EnclosureNumber,MediaType,Size -Autosize
```

ところが今回はProxmoxのハイパーバイザからパススルーしたので、各ディスクのシリアル番号が消えてしまっています。その関係でSSDとHDDの区分も「未定義」となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/ade501b2-a4b0-a9be-634f-e7d85bcc6552.png)

このままでは記憶域プールが作れませんので、Proxmox側のconfファイルを変更します。
各ディスクの記述の末尾に"serial=シリアル番号"を追記します。
保存したらコールドリブートを行います。

```
nano /etc/pve/qemu-server/<vmid>.conf
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/02927a00-6656-6dab-ef9f-c569e3247207.png)

また、OS上で各ディスクのSSD/HDD種別を手動で割り当てます。

```
Set-PhysicalDisk -UniqueId <シリアル番号> -MediaType <HDD or SSD>
```
これで記憶域プールを作る準備ができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/f5d24554-24bd-4604-8868-8fd6ee38a47a.png)

GUIから記憶域プールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/a2571a57-9fdd-a9b5-75db-244a74d4312d.png)

次に仮想ディスクを作ります。チェックボックスをONにして階層化します。（上のconf書き換え手順を踏まないとここのチェックがグレーアウトしており先に進めません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/43a41848-04e5-fe21-ef89-d88fbd3073dd.png)

タイプとして「ミラー」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/3eda13b2-7e0f-941a-7b40-e2edf22f4abf.png)

階層ごとのサイズを指定します。こちらのサイトによると計算領域として1割引きにする必要があるようです。
https://www.vwnet.jp/Windows/WS16TP4/201511201/StrageTier.htm
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/44667a8e-6ad2-1e73-5cf4-eb3290f98790.png)

作成すると自動的にボリューム作成ウィザードが立ち上がりますので、ドライブレターとファイルシステムを指定します。ミラー高速パリティは本来ReFSが必須というはずでしたが、NTFSでも作れ、かつ高速だという情報があったのでNTFSで作ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/11a2bf33-3e4a-e799-848d-52a3676716e1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/c703e12c-7d7d-2937-0245-ca47fb9190fd.png)

OSにマウントされました。CrystalDiskMarkでベンチマークを取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/62d20d24-ecfc-1f0d-cd94-e50617f28e30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/9c2ef925-cdcd-d354-8401-5342ab604236.png)

スピードが出ません。何か根本的に間違えているか、もしくはパススルーに起因するものだと思いやり方を変えてみます。

こちらのサイトを参考にさせて頂き、再作成してみました。設定はReFS、キャッシュ16GBで整合性ストリームはオンです。
https://roy-n-roy.github.io/Windows/%E8%A8%98%E6%86%B6%E5%9F%9F%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/573a4036-af61-3c22-55ef-02d03db048af.png)
すると、SATA SSD単体程度の速度は出るようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/d423dbac-e8e5-519f-2dea-bbe6cedc37d7.png)

NTFSで試すと、速度が低下しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/60a80c58-6b79-d5bd-f1d1-1dbfb0a5157a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/2905eddc-d5e2-7d49-df36-773e4daf6c80.png)

しばらく考察し、ここの部分が"Mirror"となっている点に着目しました。"Simple"つまりストライピングに変更してみます。また、ファイルシステムはReFSに戻します。
こちらのサイトを参考にさせて頂きました。
https://ameblo.jp/ameba-take2/entry-12455376416.html

```
 $SSDTier = New-StorageTier -StoragePoolFriendlyName 'tank' -FriendlyName 'SSDTier' -MediaType SSD -ResiliencySettingName Simple -ProvisioningType Fixed
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/4aa88e2d-247f-e81a-81f9-cdd3d247c18b.png)

ようやく期待した結果となりました。STA 6GB/sをストライピングしたフルスピードが出ています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/23bc7569-f0e7-520f-94f5-8998a03a6786.png)

次に、16GBのライトキャッシュを超えるサイズ（32GB）でベンチマークしてみます。
他のサイトでの技術情報のとおり、10%ほどオーバーヘッドがありますが大幅な速度低下にはなりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/f4b2dfe1-1e92-96ce-59fd-b582dc015ab6.png)

今回のポイントをまとめると以下のようになります。

・Proxmoxからのディスクパススルー後、vmid.confにシリアル番号を付与する
・パススルーディスクは、Mediatypeが未定義のためSSD/HDDに手動で割り当てる
・ファイルシステムはReFSかつ整合性ストリームONとする
・SSD階層の設定は-ResiliencySettingName Simpleとする

SSD階層が冗長化されていないため、もし障害時にはSSD階層のみに保存されている直近のデータが失われる可能性があります。

このあたりはタスクスケジューラで指定した時間（標準では夜中）に自動的にHDD階層に保存・整理してくれるという情報もありましたので、別の機会に検証してみたいと思います。
https://charbelnemnom.com/modify-storage-tiers-optimization-with-powershell/

QNAPやSynologyのNASでもSSDキャッシュが使われていますが、ほぼZFS/L2ARC/ZILの技術組み合わせによるものです。
「ReFS + ミラー高速パリティ」はマイクロソフト製品のためWindowsServerライセンス費用がかかることは加味しても、同等かそれ以上の機能であることを確認できました。