差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
blog:2020:2020-12-08 [2020-12-28 11:54]
Decomo
blog:2020:2020-12-08 [2022-03-04 11:37] (現在)
Decomo
行 9: 行 9:
 で、肝心のSpecial Allocation Classは何かというと、I/O性能に直結するデータを専用のvdevに格納して性能改善を図るもののようだ。多少正確さを欠く表現だが、階層化ストレージのZFS版といえる。 で、肝心のSpecial Allocation Classは何かというと、I/O性能に直結するデータを専用のvdevに格納して性能改善を図るもののようだ。多少正確さを欠く表現だが、階層化ストレージのZFS版といえる。
  
-ZFS扱うデータの種類に応じてvdevをAllocation Classという概念で分類しており、OpenZFS 2.0時点では以下の5種類となっている。ちなみにAllocation Classは、元は[[blog:2020:2020-10-07|dRAID]]で導入されたもので、その後、開発コミュニティによって汎用化され現在の形となったそうだ。+ZFSはターゲットとするデータの種類によってvdevをAllocation Classという概念で分類し、OpenZFS 2.0時点では以下の5種類のクラスが定義されている。ちなみにAllocation Classの考え方は[[blog:2020:2020-10-07|dRAID]]で導入され、その後、開発コミュニティによ汎用化を経て現在の形となったそうだ。
  
 ^  クラス  ^  SAC  ^  用途  ^  専用vdevを割り当てた時の効果  ^ ^  クラス  ^  SAC  ^  用途  ^  専用vdevを割り当てた時の効果  ^
行 18: 行 18:
 | Small Blocks |  ○  | レコードサイズ以下のブロック | 小さなサイズの膨大なI/O性能の改善。詳細は後述 | | Small Blocks |  ○  | レコードサイズ以下のブロック | 小さなサイズの膨大なI/O性能の改善。詳細は後述 |
  
-表でを付けたAllocation ClassがSpecial Allocation Classとされている。それぞれのSACの役割は名前のごとくで、専用vdev (Special vdev)を割り当てるとそれなりに効果がありそうだ。とりわけSmall Blocksは[[https://www.napp-it.org/doc/downloads/special-vdev.pdf|劇的な性能改善の可能性]](PDF)を秘めている。+表でを付けたクラスがSpecial Allocation Classとされている。それぞれのSACの役割は名前のごとくで、専用vdev (Special vdev)を割り当てるとそれなりに効果がありそうだ。とりわけSmall Blocksは[[https://www.napp-it.org/doc/downloads/special-vdev.pdf|劇的な性能改善の可能性]](PDF)を秘めている。
  
-ZFSのファイルI/Oは原則的に128KiB単位((データセット毎にrecordsizeプロパティで変更可能))で行われそれに満たないデータは、より小さなレコードが使われるこの小さなレコードがI/O性能にそれなりに影響するで、Small Blocksは指定サイズ以下のブロックの読み書きをSpecial vdevにオフロードするようなイメージとなる。つまり、Special vdevとしてSSDを割り当てると、その特性を活かして膨大な小規模I/Oを捌けるようにな、というわけだ。+ZFSのファイルI/Oは原則128KiB単位((データセット毎にrecordsizeプロパティで変更可能))で行われる。それに満たないデータは、より小さなレコードが用いられることとなり、これらの小レコードがI/O性能にそれなりに影響するだ。Small Blocksは指定サイズ以下のレコードの読み書きをSpecial vdevにオフロードするようなとなる。つまり、Special vdevとしてI/O性能が高いデバイス──要はSSDを割り当てると、その特性を活かして膨大な小規模I/Oを捌けるようにな全体としてスループット向上が見込めるというワケだ。
  
-ここで注意が必要なのは、Small Blocksの処理はファイルサイズベースではなく、あくまでブロックサイズベースで行われるということ。なので、小さなファイルの全体がSpecial vdevに格納される訳ではない((Small Blocksの閾値をレコードサイズと同値にして全データをSpecial vdevに送ることは可能))。そもそも、ZFSの書き込みは一旦メモリにキャッシュされ、トランザクショングループ(txg)にまとめられた上でレコード書き出されるため、必ずしも小さいファイル=小さなレコードとは限らない。逆に、大きなファイルでもレコードサイズ以下の端数は必ず存在するわけで、これらのtxgレコードサイズ未満となった分がSpecial vdev行きとなるようだ。このが一般的な階層化ストレージと大きく異なる部分である。+ここで注意が必要なのは、Small Blocksの処理はファイルサイズベースではなく、レコードサイズベースで行われるということ。つまり、小さなファイルの全体がSpecial vdevに格納される訳ではない((Small Blocksの閾値をレコードサイズと同値にして全データをSpecial vdevに送ることは可能だが、それなら最初からSSDでプールを組んだ方が良い))。ZFSの書き込みは一旦キャッシュされ、トランザクショングループ(txg)にまとめられた後にレコード単位で書き出されるため、必ずしも小さいファイル=小さなレコードとは限らない。逆に、大きなファイルでもレコードサイズ以下の端数は必ず存在するわけで、こうしたtxgを経てなおレコードサイズ未満となった分がSpecial vdev行きとなるようだ。このあたりが一般的な階層化ストレージと大きく異なる部分である。
  
-Small Blocks対象となるブロックサイズは、ドサイズ以下の2の冪を任意に指定。128KiB以上のレコードサズが使えるようlarge_blocksフィーチャー合わせて使う、よりパフォーマンスチューニングの幅広がるだろう。なおFreeBSDレコードサイズ128KiB超えデータセットから起動には対応してないので要注意。+階層化ストレー見られ最頻ファルをSSD層配置すいったこは(現時点では)できないが、ZFSでpL2ARC(とARC)その役割担っていると思われ。都度''special_small_blocks''値を調整しSpecial vdevへの書き込みを制御してやれば、狙ったファイルをSSDに置くこともできなくはないが……
  
-Special Allocation Classで性能向上が見込める一方で、その仕組み上、Special vdevが死ぬと一発でプール全体のデータが飛ぶ恐れがある、というかメタデータという極めて重要なデータが飛ぶんだから、ほぼ確実に死ぬと思われる。なので今まで以上に冗長性には留意する必要がある。信頼のおけるSSDで最低でもミラーリング、可能なら電源喪失保護付きSSDで3重ミラーにしたいところ。+Small Blocksの対象となるブロックサイズは、レコードサイズ以下の2の冪を任意に指定できる。128KiB超のレコードサイズを許可する''large_blocks''フィーチャーと組み合わせると、よりパフォーマンスチューニングの幅が広がるだろう。なお、FreeBSDはレコードサイズが128KiBを超えるデータセットからの起動には対応してないので要注意。 
 + 
 +Special Allocation Classで性能向上が見込める一方で、その仕組み上、Special vdevが死ぬと一発でプール全体のデータが飛ぶ恐れがある、というかメタデータという極めて重要なデータが飛ぶんだから、ほぼ確実に死ぬと思われる(→[[blog:2022:2022-02-24|実際に試して]]死ぬことを確認)。なので今まで以上に冗長性には留意する必要がある。信頼のおけるSSDで最低でもミラーリング、可能なら電源喪失保護付きSSDで3重ミラーにしたいところ。
  
 Special vdevの容量が一杯になった場合は、従来通り普通のvdevの方が使われるそうなので、その辺は特に気にしなくてもよい模様。 Special vdevの容量が一杯になった場合は、従来通り普通のvdevの方が使われるそうなので、その辺は特に気にしなくてもよい模様。
  • blog/2020/2020-12-08.1609124068.txt.gz
  • 最終更新: 2020-12-28 11:54
  • by Decomo