差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
memo:test [2020-12-07 18:00] Decomo |
memo:test [2020-12-09 09:21] Decomo 削除 |
||
---|---|---|---|
行 1: | 行 1: | ||
====== ZFSのヤバげな機能Special Allocation ClassがFreeBSD 12.2で対応されてた ====== | ====== ZFSのヤバげな機能Special Allocation ClassがFreeBSD 12.2で対応されてた ====== | ||
- | OpenZFS 2.0リリースの陰でひっそりと、FreeBSD 12.2-RELEASEのZFS実装にSpecial Allocation Classが追加されていた。 | + | OpenZFS 2.0リリースの陰でひっそりと、FreeBSD 12.2-RELEASEのZFS実装にSpecial Allocation Class(以下、SACと略すことがある)が追加されていた。 |
- | 時系列的にはOpenZFS 2.0が2020年12月1日、FreeBSD 12.2Rが10月27日リリースなので、まったく陰ってはないんですけどね、インパクトありそうな機能の割にはリリースノートに記載がなく、'' | + | 時系列的にはOpenZFS 2.0が2020年12月1日、FreeBSD 12.2Rが10月27日リリースなので、まったく陰ってはないんですけどね、インパクトありそうな機能の割にはリリースノートに記載がなく、'' |
- | 機能自体は[[https:// | + | Special Allocation Class自体は[[https:// |
- | で、肝心のSpecial Allocation Classは何かというと、I/ | + | で、肝心のSpecial Allocation Classは何かというと、I/ |
- | ZFSでは扱うデータの種類をAllocation Classという概念で分類しており、OpenZFS 2.0時点では以下の5種類となっている。そもそも、この概念自体がSpecial | + | ZFSでは扱うデータの種類に応じてvdevをAllocation Classという概念で分類しており、OpenZFS 2.0時点では以下の5種類となっている。ちなみにAllocation Classは、元は[[blog: |
- | ^ クラス | + | ^ クラス |
- | | Normal | 通常のデータ(ユーザーデータ) | + | | Normal |
- | | Log | ZILのレコード | | + | | Log | × |
- | | Dedup | 重複排除テーブル(DDT)のデータ | | + | | Dedup | ○ |
- | | Metadata | プールとファイルシステムのメタデータ | | + | | Metadata |
- | | Small Blocks | レコードサイズ以下のブロック | | + | | Small Blocks |
- | https://github.com/openzfs/zfs/pull/5182 | + | 表で〇を付けたAllocation ClassがSpecial Allocation Classとされている。それぞれのSACの役割は名前のごとくで、専用vdev (Special vdev)を割り当てるとそれなりに効果がありそうだ。とりわけSmall Blocksは[[https://www.napp-it.org/doc/downloads/special-vdev.pdf|劇的な性能改善の可能性]](PDF)を秘めている。 |
- | https://forums.servethehome.com/ | + | ZFSのファイルI/Oは原則的に128KiB単位((データセット毎にrecordsizeプロパティで変更可能))で行われ、それに満たないデータは、より小さなレコードが使われる。この小さなレコードがI/O性能にそれなりに影響するようで、Small Blocksは指定サイズ以下のブロックの読み書きをSpecial vdevにオフロードするようなイメージとなる。つまり、Special |
- | https:// | + | ここで注意が必要なのは、Small Blocksの処理はファイルサイズベースではなく、あくまでブロックサイズベースで行われるということ。なので、小さなファイルの全体がSpecial vdevに格納される訳ではない((Small Blocksの閾値をレコードサイズと同値にして全データをSpecial vdevに送ることは可能))。そもそも、ZFSの書き込みは一旦メモリにキャッシュされ、トランザクショングループ(txg)にまとめられた上でレコードに書き出されるため、必ずしも小さいファイル=小さなレコードとは限らない。逆に、大きなファイルでもレコードサイズ以下の端数は必ず存在するわけで、これらのtxgでレコードサイズ未満となった分がSpecial vdev行きとなるようだ。この辺が一般的な階層化ストレージと大きく異なる部分である。 |
- | https:// | + | Small Blocksの対象となるブロックサイズは、レコードサイズ以下の2の冪を任意に指定できる。128KiB以上のレコードサイズが使えるようになるlarge_blocksフィーチャーと合わせて使うと、よりパフォーマンスチューニングの幅が広がるだろう。なお、FreeBSDはレコードサイズが128KiBを超えるデータセットからの起動には対応してないので要注意。 |
- | https:// | + | Special Allocation Classで性能向上が見込める一方で、その仕組み上、Special vdevが死ぬと一発でプール全体のデータが飛ぶ恐れがある、というかメタデータという極めて重要なデータが飛ぶんだから、ほぼ確実に死ぬと思われる。なので今まで以上に冗長性には留意する必要がある。信頼のおけるSSDで最低でもミラーリング、可能なら電源喪失保護付きSSDで3重ミラーにしたいところ。 |
+ | |||
+ | Special vdevの容量が一杯になった場合は、従来通り普通のvdevの方が使われるそうだ。 | ||
+ | |||
+ | そのうち試してみたい。 | ||
+ | |||
+ | ===== 参考サイト ===== | ||
+ | |||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https://forums.servethehome.com/ | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
- | https:// |