NAS
3.5インチドライブが2つ搭載でき、2.5GbEが2ポートあるN100搭載ミニ(?)PCをNASとして使っています。
NASの簡易スペック
- ホストOSにProxmox、ゲストOSにTrueNAS Scale
- CPUはN100、PL1 10W、PL2 15W
- 2x 2.5GbEでSMB Multichannel、最大5Gbps
- 1x 8TB HDD (WD80EAAZ)
- ファイルシステムはZFS
- RAM32GB
- TrueNAS VMに24GBを割り当て
- zfs_dirty_data_maxは16GBに設定
- 1x 256GB SATA SSDをL2ARCに(128GBをオーバープロビジョニングに確保)
ストレージデバイスがHDD1本なので、書き込み速度はシーケンシャルでも最大200MB/s程度(ディスクが空の場合)、ランダム書き込みではもっと遅くなります。
ところがZFSの場合、書き込み時にRAM上のdirty pageに一時的にデータを貯めてからまとめてディスクに書き込むので、ランダム書き込みでもシーケンシャルに近い速度を出すことができ、dirty pageを拡張すればある程度のサイズまでは見かけ上ディスクの上限を超えた速度で書き込むことも可能です。
さらにZFSは透過圧縮の機能があるので、例えば圧縮率が1.5倍の場合、ディスクから200MB/sで読み出しつつリアルタイムで解凍、見かけ上300MB/sで読み出しなんてこともできます。
ちなみに天体写真のFITSは比較的圧縮のよく効くタイプのファイルです。
今回はPCからNASに天体写真のFITSを書き込む場合のパフォーマンスをいろいろ比較して、ZFSのチューニングをしました。
パフォーマンステスト
テストデータは69.4GB分のASI533MCおよびASI2600MC-PのFITSデータ。少しjpgが混じってる。
Windows11のPCからNASに書き込み。書き込みにはFastCopyを使用。
PC、NASともに2x 2.5GbEのSMB Multichannelで最大5Gbps (600MB/s程度)。
compression=?
ZFSの透過圧縮では、圧縮形式や圧縮率を選択できます。
今回は以下の4パターンでパフォーマンスを比較しました。
基本的にはCPU負荷は1<2<3<4、圧縮率は4>3>2>1。
- lz4: 最もCPU負荷が軽い。圧縮率は低い。
- zstd-fast: zstdの高速版。zstdより圧縮率は低い。
- zstd-1: zstd圧縮率1。
- zstd-3: ZFSで圧縮オプションをzstdに指定したときの標準圧縮率。
書き込み速度および書き込み時間
平均書き込み速度 (MB/s)
| lz4 | zstd-fast | zstd-1 | zstd-3 |
|---|---|---|---|
| 138.0 | 191.8 | 175.0 | 82.3 |
最速だったのはzstd-fast。次点がzstd-1。
lz4はCPU負荷は軽いが圧縮率が低いので、ディスク書き込みがボトルネック?。
zstd-3はCPU負荷がボトルネック?。
書き込み時間 (seconds)
| lz4 | zstd-fast | zstd-1 | zstd-3 |
|---|---|---|---|
| 540 | 388 | 425 | 905 |
書き込み速度と同じなので省略。
圧縮率およびディスク上のサイズ
圧縮率
| lz4 | zstd-fast | zstd-1 | zstd-3 |
|---|---|---|---|
| 1.19 | 1.32 | 1.48 | 1.51 |
もちろん最良はzstd-3で次点がzstd-1。
ただしzstd-1とzstd-3はほとんど差がない。
ディスク上のサイズ (GiB)
| lz4 | zstd-fast | zstd-1 | zstd-3 |
|---|---|---|---|
| 59.2 | 53.1 | 47.4 | 46.6 |
lz4とzstd-1では10GiB以上の差。
zstd-fastとzstd-1でも5.7GiBの差。
圧縮形式の決定
書き込み速度と圧縮率のバランスからcompression=zstd-1に決定。
CPUがもっと強ければzstd-3あるいはそれ以上の圧縮率を選択可能でしょうが、N100の場合zstd-1からzstd-3にすると圧縮率がそれほど変わらない割に書き込み速度が圧倒的に下がるのでダメそうです。
recordsize=?
ZFSでは、データセットごとにrecordsize (実際にディスクに書き込み時の最大ブロックサイズ)を指定でき、圧縮率や速度に影響します。
当方のNASでは動画などのメディアファイル用に基本的にrecordsize=1Mで運用していますが、FITS用のデータセットではいくつに設定するのがよいかを調べました。
書き込み速度および書き込み時間
平均書き込み速度 (MB/s)
| recordsize | lz4 | zstd-fast | zstd-1 | zstd-3 |
|---|---|---|---|---|
| 1M | 138.0 | 191.8 | 175.0 | 82.3 |
| 512K | 190.6 | |||
| 256K | 184.0 | |||
| 128K | 180.7 |
512Kにすると、zstd-1の書き込み速度が1Mで最速だったzstd-fastに匹敵するレベルに改善。
書き込み時間 (seconds)
| recordsize | lz4 | zstd-fast | zstd-1 | zstd-3 |
|---|---|---|---|---|
| 1M | 540 | 388 | 425 | 905 |
| 512K | 391 | |||
| 256K | 405 | |||
| 128K | 412 |
圧縮率およびディスク上のサイズ
圧縮率
| recordsize | lz4 | zstd-fast | zstd-1 | zstd-3 |
|---|---|---|---|---|
| 1M | 1.19 | 1.32 | 1.48 | 1.51 |
| 512K | 1.47 | |||
| 256K | 1.47 | |||
| 128K | 1.44 |
一般にrecordsizeを小さくすると圧縮率が落ちるとされているが、zstd-1の場合256Kまではさほど変わらない様子。
ディスク上のサイズ (GiB)
| recordsize | lz4 | zstd-fast | zstd-1 | zstd-3 |
|---|---|---|---|---|
| 1M | 59.2 | 53.1 | 47.4 | 46.6 |
| 512K | 47.5 | |||
| 256K | 47.5 | |||
| 128K | 48.1 |
256Kまでは誤差。128Kにするとやや大きくなる。
recordsizeの決定
速度が改善し圧縮率も落ちない、recordsize=512Kで決定。
もう少し小さいデータセットの場合
上記のテストでは書き込み量を約70GBというZFSのdirty page (16GBに設定)から大幅にあふれる量に設定しました。
しかし、実際には1回の撮影データ量はそこまで大きくないので、書き込み量がもっと小さい場合も検証してみます。
合計書き込み量別書き込み速度 (MB/s)
| 70GB | 30GB | 20GB | 15GB | 10GB | 5GB | |
|---|---|---|---|---|---|---|
| zstd-1/512K | 190.6 | 222.5 | 262.0 | 292.2 | 381.9 | 477.9 |
書き込み量が小さいと速度が上がります。15GB未満ならSMB Multichannelなしの2.5GbEでは飽和するほどの速度が出てます。 ただ、FITSの場合ネットワークがボトルネックになるほどの書き込み速度はでないみたいです。
大きな動画ファイルを書き込むような場合、合計14GB程度までは600MB/s(2x 2.5GbEのネットワークが飽和する速度)に張り付きます。
結論
というわけで、上記のテストからFITS保管用のZFSデータセットではcompression=zstd-1、recordsize=512Kがよさそうということがわかりましたので、このパラメータで運用しようと思います。

No comments yet.