ZFSのキャッシュの効果をProxmoxで確認した話

こんにちは。
ALJの江口と申します。

ZFSは使っているでしょうか。
今まではRAID、ファイルシステムの管理が別々でしたが、ZFSならまとめて面倒みてくれるため、とても便利です。

ZFS on Linux は安定性に問題があったこともありましたが、ここ２～３年で非常に安定してきていると感じています。ZFSには興味があるので、個人的な環境ではZFSを積極的に利用するようにしています。

最近自宅にProxmoxVEをHDDの構成でマシンを作りました。ディスク構成は、HDDのZFSミラーを選択し、NVMe SSDをキャッシュとして追加したので、簡単ではありますがキャッシュの有無で差が出るかテストしてみました。
今回はProxmoxというより、ZFSのキャッシュを理解するという内容になっています。

# 自宅サーバーに求める私見
自宅に仮想サーバーを構築する場合、私は以下のようなことで悩みます。

| 項目 | 自宅の場合 | 会社の場合 |
|:-|:-|:-|
| Disk容量  |  スロット数の制限に悩む |  容量が大きいのでHDDのシーンが多い |
| CPU  |  速度より省電力、低発熱（でもATOMはイヤ） | 予算が許す限り高速なもの  |
|  メモリ | 多い方がいいがミニPCはスロットが少ない  |  予算が許す限り多め |
|  筐体 |  スペースの関係でミニPCを選択したい<BR>→3.5インチHDDが積めない |  置き場所に応じてそれなり<BR>大きいものでも許される |
| 価格 | 高いとムリ | 個人で出せる金額とは別次元 |
|騒音、発熱|クーラーの常時稼働は避けたい<BR>ラックマウントはうるさくて無理|サーバールームに置けば不問|

こんな感じで、仮想化のサーバーを自宅に置く場合、頑張ってデカいATXマシンを置くか、スペックを我慢してミニPCにするか、ジレンマがありました。Youtubeなどで見かけるラックマウントを自宅に置くというのは、我が家には無理。結局、ここ数年は割高でもミニPCを選択してました。

ところが、最近、以下のようなマシンを見つけたので、ポチって自宅マシンを仕上げました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/d097318d-8d74-90d1-38ce-314c884fff93.png)

3.5インチベイが2スロットあります。下にファンがあり上に排気しているので、冷却もバッチリ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/2eb5e43d-9a28-6dbe-a146-f67d6682717d.png)

マザーボードは中央にあり、CPUにはCPUクーラーも付いてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/068f5450-35d1-86d1-3730-60a4c4fbfbb2.png)

メモリスロットはDDR4が一つ、NVMeは2280の穴のみ。今回は、2242を強引に取り付けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/12435bb1-7b26-e2bb-7c71-8362c2fab144.png)

家にあったアルミの板を切り出して、2242を延長するアダプタを自作しました。真似する場合は全て自己責任でお願いします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/525bd1b3-b2ac-b0f5-415e-0463e5a11930.png)

なんとか2242のSSDを使うことができましたが、苦労したのはこの1点だけで、あとは部品をさすだけで作業は終了。素直に2280のSSDを使えばこの苦労も必要なし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/619a2306-db92-859d-fa8d-d43cb43c2e5b.png)


組み上げたスペックは以下の通り。
| 項目 | 仕様 |
|:-|:-|
|  機種名 | AOOSTAR R1 N100 (4C/4T, Up to 3.4GHz)  |
| CPU  |  Intel N100　(TDP 6W) |
|  Memory | PC4-25600 32GB  |
|  Disk | 3.5inch SATA 8TB x2  |
|  nvme | 128GB M.2 for ZFS cache |
| Network | 2.5G x2 |

CPUこそIntel N100ですが、メモリ 32GB と 8TBx2　という構成なのに、このサイズ！
これだけの性能があれば、満足度は高いと思います。
8cmファンが常時回転していますが、風量が少なく静かです。
さすがにHDDを積んでるので無音ではありません。
本体とメモリを購入して、約35000円ほど。他は家にあったものを流用しました。
全部新規で買っても7万円くらいだと思います。

ちなみに、同じ筐体で Ryzen 5700u (8C/16T, TDP15W)の機種もありますので、よりパワフルな環境をお求めの場合は Ryzen の方がいいと思います。値段も1万ちょっとしか違いません。
私は、N100で十分だと思ったので安い方を選択しました。

# 気になるHDDの遅さをキャッシュでカバーできるか
NVMeも安くなってきており、4TBでも3万前後で買えるようになってきました。4TBあればかなり余裕があるのですが、NASなどを中に作りたかったのでもうちょっと容量が欲しくなります。これ以上の容量だと、3.5インチのHDDを検討するのがまだ現実的だと思います。NVMeを複数搭載できる機種は高く、種類も少ないのが現実ですし、HDDなら8TBで2万円を切るものがあります。

HDDを採用する場合、どうしても故障が気になります。今回は２台のSATAが搭載できるので、**ZFS ミラー**で構築しました。

HDDはSSDに比べ桁違いに遅いという不満があります。それを補える技術がZFSにはあり、SSDをキャッシュにすることができます。家を探すと、そろそろ使い道がなくなってきた128GBのNVMeのSSDがあり、M.2スロットも1つあるので、ZFSのキャッシュとして追加しました。

128GBもあれば、これをOS用として、HDDをデータ用にするという設計もあると思いますが、この後の内容を読めば、キャッシュとして利用することにメリットがありそうだと感じて頂けると思います。

# ZFSのキャッシュの話
ZFSは2005年にリリースされた比較的新しいファイルシステムで、従来のRAIDの欠点のいくつかが改善されています。
そのうちの一つが、複雑な設計が必要だったキャッシュやジャーナルに、SSD をファイルシステムのキャッシュとして扱う 「Hybrid Storage Pool」という考えが導入され、キャッシュ用のデバイスを指定するだけで利用しくれるという機能があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/9f923578-f9b8-9e72-7aca-0546d146082a.png)
(出典：https://atmarkit.itmedia.co.jp/ait/articles/0905/28/news108.html)

上記の絵以上に良い説明が出来なかったので、@IT様 から図を転載させて頂きました。
ZFSには**ZIL**と**L2ARC**という2種類のキャッシュがあり、特徴が異なります。

| 　 | 概要 |
|:-:|:-|
|  ZIL | ZFSは書き込みにコピーオンライトの方式を採用しています。データを直接上書きせず、別の領域に書き込むことで、書き込み中に不具合が生じてもデータが保護される仕組みになっています。<BR>このトランザクションデータは、デフォルトではデータと同じディスクに保存されますが、logキャッシュを追加することで、アクセスが高速なSSDにすることができます。<BR> ログデバイスは安全のためミラーリングにすることが推奨されています。 <BR>ログデバイスの最小サイズは、プール内の各デバイスの最小サイズと同じで、64M バイトです。<BR>ログデバイスの最大サイズは物理メモリーのサイズの約 1/2 が目安です。今回の構成では、32GBメモリなので、16Gが上限になります。 |
|  L2ARC | ZFSではキャッシュをメモリ上に、ARCアルゴリズムにより保持しています。このARCを拡張するのが、2次的キャッシュとしてのL2ARCです。L2を持つことで、ARCが溢れても読み込みパフォーマンスの向上が期待できます。<BR>L2ARC上のデータは喪失しても問題ないため，ストライピングにすることも可能です。<BR>逆に、キャッシュデバイスはミラー化や、RAID-Z 構成に含める構成はサポートされていません。  |

ARCとZILを理解することで、ZFSのキャッシュの設計に役立つと思います。

# ZFSにキャッシュを追加する
用意したSSDは128GBが1枚なので、2つにパーテションを分けます。ログキャッシュ(ZIL)は16GBが上限なので、16GBを切り、それ以外をL2ARC用にします。
```shell-session
root:~# lsblk /dev/nvme0n1
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
nvme0n1     259:0    0 119.2G  0 disk 
├─nvme0n1p1 259:1    0    16G  0 part 
└─nvme0n1p2 259:2    0 103.2G  0 part 
```
追加するには、以下のコマンドを実行します。
```shell-session
root:~# zpool add rpool log /dev/nvme0n1p1 
root:~# zpool add rpool cache /dev/nvme0n1p2 
```
追加した結果は、以下のコマンドで確認できます。
```shell-session
root@:~# zpool status
  pool: rpool
 state: ONLINE
config:

        NAME                                            STATE     READ WRITE CKSUM
        rpool                                           ONLINE       0     0     0
          mirror-0                                      ONLINE       0     0     0
            ata-TOSHIBA_MN08ADA800_91B0A01AFQWH-part3   ONLINE       0     0     0
            ata-WDC_WD80EAAZ-00BXBB0_WD-RD073KZE-part3  ONLINE       0     0     0
        logs
          nvme0n1p1                                     ONLINE       0     0     0
        cache
          nvme0n1p2                                     ONLINE       0     0     0

errors: No known data errors
```
キャッシュの利用状況は以下のコマンドで確認できます。
```shell-session
root@:~# zpool iostat -v rpool
                                                  capacity     operations     bandwidth 
pool                                            alloc   free   read  write   read  write
----------------------------------------------  -----  -----  -----  -----  -----  -----
rpool                                           1.02T  6.25T     20     39  3.61M  5.97M
  mirror-0                                      1.02T  6.25T     20     39  3.61M  5.97M
    ata-TOSHIBA_MN08ADA800_91B0A01AFQWH-part3       -      -      8     20  1.93M  2.99M
    ata-WDC_WD80EAAZ-00BXBB0_WD-RD073KZE-part3      -      -     11     18  1.68M  2.99M
logs                                                -      -      -      -      -      -
  nvme0n1p1                                      144K  15.5G      0      0  5.77K  37.7K
cache                                               -      -      -      -      -      -
  nvme0n1p2                                      648M   103G      0     83  6.51K  8.87M
----------------------------------------------  -----  -----  -----  -----  -----  -----
```

# キャッシュの効果を確認してみる
キャッシュの効果を確認するいい方法が思い浮かばなかったので、仮想マシン上にubuntu23.10をlxcで構築し、**apt upgrade**を実施して処理時間を比較してみました

upgradeは途中で、(y/n）を求められるので、1秒程度の誤差が出ちゃいますが、そこはご愛敬ということでご容赦ください。
また、upgradeは、その時々で内容が異なるので、今回はこの数値だった、という目安としてとらえてください。今後、いい方法を考えたいと思います。

### テストに使用したインスタンス
* lxc
* 2core
* 2048memory
* 32GBdisk
* ubuntu23.10 lxc template

### テストで利用したコマンド（直前にapt update実施済み）
```shell-session
root:~# time apt upgrade
```

比較は、以下のパターンで実施しました。
1. ZIL、L2ARCあり
1. L2ARCのみ削除
1. ZIL、L2ARC両方削除
1. All flushのマシンと比較（Core i3-8100T)

### テスト結果
テスト結果は以下のようになりました。
| | キャッシュ有り |	L2ARC削除 | ZIL、L2ARC削除 | All flush |
|:-:|:-:|:-:|:-:|:-:|
| real	| 0:42:20	| 0:37:45	|2:43:03	|0:34:05|
| user |	0:09:41|	0:09:16	|0:09:55	|0:11:37|
| sys 	| 0:04:19	|0:04:37	|0:05:25	|0:04:35|

グラフにするとこんな感じで、ZILの効果が実感できました。HDDで構成したマシンなのに、All Flush構成に近い結果が得られています。
一方、今回の実施内容ではL2ARCの効果は確認できませんでした。L2ARCが仕事するには、メインメモリ上のキャッシュが溢れる量のテストが必要だと思います。今回のような小容量のテストでは効果の確認は難しそうです。
![chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/8aa224a6-087b-ba3b-7671-9cd26153c6a8.png)

書き込み時はコピーオンライトでディスクが利用されるため、HDD構成の場合は少量でもいいのでZILのSSDキャッシュを搭載することを検討するのが良さそうです。速度より安全を重視し、揮発メモリを書き込みのキャッシュとしない設計は好感が持てます。

ZFSの資料を読むと、HDDに搭載されたDRAMキャッシュとも協調するようで、余すところなく最適化を意識しているらしいですが、これをテストするのは難しそうなので、読み物として理解するに止めたいと思います。

Intel N100は第12世代の「Eコア」(Alder Lake-N)ですが、今回の検証では、第8世代のCore i3-8100Tに対し、user、sysの値については5~10%程度上回っています。N100の処理能力は第8世代のCoreシリーズ相当と言っても過言じゃないと思います。

一方、 real の数値は All Flush 構成の方が15%ほど早く出ています。Intel N100は、M.2がx4だったり、つけたSSDが小容量で、小容量のSSDは遅い傾向があるなど、これらが影響したためと思われます。

容量は欲しいけど、HDDは遅いし、NVMeで組むにはまだ時代が追い付いてないと感じていたところ、ZFSキャッシュを用いると、HDD構成なのに実用上NVMeの構成と同等の速度が得られたと感じています。

SSDがどんどん安くなってきており、HDDを使う場面が少なくなってたので、今回の記事の賞味期限は短いかもしれませんが、何かの参考になると幸いです。