ソースの表示以前のリビジョンバックリンク全て展開する/折り畳む文書の先頭へ Share via Share via... Twitter LinkedIn Facebook Pinterest Telegram WhatsApp Yammer Reddit Teams最近の変更Send via e-Mail印刷パーマリンク × 文書の過去の版を表示しています。 ZFSのヤバげな機能Special Allocation ClassがFreeBSD 12.2で対応されてた OpenZFS 2.0リリースの陰でひっそりと、FreeBSD 12.2-RELEASEのZFS実装にSpecial Allocation Class(以下、SACと略すことがある)が追加されていた。 時系列的にはOpenZFS 2.0が2020年12月1日、FreeBSD 12.2Rが10月27日リリースなので、まったく陰ってはないんですけどね、インパクトありそうな機能の割にはリリースノートに記載がなく、zpool statusしたら「プールのアップグレードができるぜ!」と出たので調べてみたら追加されていたという。関連するコミットはこの辺→Rev.354382 Rev.354385 354941 Special Allocation Class自体はZoL 0.8.0で2019年5月24日にリリースされ、その後、illumosへのバックポートを経て、めでたくFreeBSDに取り込まれた模様。ZFS実装が新生OpenZFSベースに切り替わろうとしている中で、Legacy ZFSをきっちりメンテする姿勢には頭が下がります。 で、肝心のSpecial Allocation Classは何かというと、I/O性能に直結するデータを専用のvdevに格納して性能改善を図るもののようだ。多少正確さを欠くが、階層化ストレージのZFS版といえる。 ZFSでは扱うデータの種類に応じてvdevをAllocation Classという概念で分類しており、OpenZFS 2.0時点では以下の5種類となっている。ちなみにAllocation Classは、元はdRAIDで導入されたもので、その後、開発コミュニティによって汎用化され現在の形となったそうだ。 クラス SAC 用途 専用vdevを割り当てた時の効果 Normal × 通常のデータを扱うvdev。ミラーとかRAIDZとか。 Log × ZILのレコード。いわゆるSLOG。 同期書き込みの高速化 Dedup ○ 重複排除テーブル(DDT)のデータ 重複排除パフォーマンスの向上とDDTのメモリ使用量の削減 Metadata ○ プールとファイルシステムのメタデータ メタデータ操作(ファイル一覧の取得など)パフォーマンスの向上 Small Blocks ○ レコードサイズ以下のブロック 小さなサイズの膨大なI/O性能の改善。詳細は後述 Allocation Classのうち、Dedup, Metadata, Small BlocksがSpecial Allocation Classとされている。それぞれのClassの役割は名前のごとくで、専用vdev (Special vdev)を割り当てるとそれなりに効果がありそうだ。とりわけSmall Blocksは劇的な性能改善の可能性を秘めている。 ZFSのファイルI/Oは原則的に128KiB単位(データセット毎のrecordsizeプロパティで変更可能)で行われ、それに満たないデータはレコードが分割されて記録される。この分割されたレコードがI/O性能にそれなりに影響するようで、Small Blocksは指定サイズ以下のブロックの読み書きをSpecial vdevにオフロードするようなイメージとなる。つまり、Special vdevとしてSSDを割り当ててやると、膨大な小規模I/Oを捌けるようになる、というわけだ。 ここで注意が必要なのは、Small Blocksの処理はファイルサイズベースではなく、あくまでブロックサイズベースで行われるということ。なので、全ての小さなファイルの全体がSpecial vdevに格納される訳ではない1)。そもそも、ZFSの書き込みは一旦メモリにキャッシュされ、トランザクショングループ(txg)にまとめられた上でレコードに書き出されるため、必ずしも小さいファイルのレコードが小さいとは限らない。逆に、大きなファイルでもレコードサイズ以下の端数は必ず存在するわけで、これらのtxgでレコードサイズ未満となった分がSpecial vdev行きとなるようだ。この辺が一般的な階層化ストレージと大きく異なる部分である。 Small Blocksの対象となるブロックサイズは、レコードサイズ以下の2の冪数を任意に指定できる。128KiB以上のレコードサイズが使えるようになるlarge_blocksフィーチャーと合わせて使うと、よりパフォーマンスチューニングの幅が広がるだろう。なお、FreeBSDはレコードサイズが128KiBを超えるデータセットからの起動には対応してないので要注意。 Special Allocation Classで性能向上が期待できる一方で、その仕組み上、Special vdevが死ぬと一発でプール全体のデータが飛ぶ恐れがある、というかメタデータという極めて重要なデータが飛ぶんだから、ほぼ確実に死ぬと思われる。なので今まで以上に冗長性には留意する必要がある。信頼のおけるSSDで最低でもミラーリング、可能なら電源喪失保護付きSSDで3重ミラーにしたいところ。 Special vdevの容量が一杯になった場合は、普通のvdevの方が使われるだけなので https://github.com/openzfs/zfs/pull/5182 https://forums.servethehome.com/index.php?threads/zfs-allocation-classes-special-vdev.28862/ https://forum.level1techs.com/t/zfs-metadata-special-device-z/159954 https://zfs.datto.com/2017_slides/brady.pdf https://docs.google.com/presentation/d/17nYRgs-TAIOPODOMaq-VwuJ0LqJHEXBfM9sUDxJUJ54/edit#slide=id.g40f6b2f7d9_2_149 https://www.napp-it.org/doc/downloads/special-vdev.pdf 1) Small Blocksの閾値をレコードサイズと同値にして全データをSpecial vdevに送ることは可能 memo/test.1607417345.txt.gz 最終更新: 2020-12-08 17:49by Decomo