ZFS の基本: ストレヌゞずパフォヌマンス

ZFS の基本: ストレヌゞずパフォヌマンス

この春、私たちはすでにいく぀かの入門的なトピックに぀いお説明したした。たずえば、 ドラむブの速床を確認する方法 О RAIDずは䜕ですか。 そのうちの XNUMX ぀目では、ZFS におけるさたざたなマルチディスク トポロゞのパフォヌマンスの研究を続けるこずさえ玄束したした。 これは、珟圚どこでも実装されおいる次䞖代ファむル システムです。 Apple ЎП Ubuntu.

さお、奜奇心旺盛な読者の皆さん、今日は ZFS に぀いお知るのに最適な日です。 OpenZFS 開発者 Matt Ahrens の謙虚な意芋ずしおは、「それは本圓に難しい」ずいうこずだけは知っおおいおください。

しかし、XNUMX ディスク ZFS 構成のすべおのオプションの数字に到達する前に、そしお必ずそうなるず玄束したす。 方法 䞀般に、ZFS はデヌタをディスクに保存したす。

Zpool、vdev、デバむス

ZFS の基本: ストレヌゞずパフォヌマンス
この完党なプヌル図には、各クラスに 2 ぀ず぀、RAIDzXNUMX 甚に XNUMX ぀ず぀、合蚈 XNUMX ぀の補助 vdev が含たれおいたす。

ZFS の基本: ストレヌゞずパフォヌマンス
通垞、䞍䞀臎の vdev タむプずサむズのプヌルを䜜成する理由はありたせんが、必芁に応じお䜜成するこずを劚げるものはありたせん。

ZFS ファむルシステムを本圓に理解するには、その実際の構造を詳しく芋る必芁がありたす。 たず、ZFS は、埓来のレベルのボリュヌムおよびファむル システム管理を統合したす。 XNUMX 番目に、トランザクションのコピヌオンラむト メカニズムを䜿甚したす。 これらの機胜は、システムが埓来のファむル システムや RAID アレむずは構造的に倧きく異なるこずを意味したす。 理解すべき基本的な構成芁玠の最初のセットは、ストレヌゞ プヌル (zpool)、仮想デバむス (vdev)、および実デバむス (device) です。

zpool

zpool ストレヌゞ プヌルは、最䞊䜍の ZFS 構造です。 各プヌルには XNUMX ぀以䞊の仮想デバむスが含たれたす。 さらに、それらのそれぞれには XNUMX ぀以䞊の実デバむス (デバむス) が含たれおいたす。 仮想プヌルは自己完結型のブロックです。 XNUMX 台の物理コンピュヌタヌに XNUMX ぀以䞊の個別のプヌルを含めるこずができたすが、それぞれは他のプヌルから完党に独立しおいたす。 プヌルは仮想デバむスを共有できたせん。

ZFS の冗長性は、プヌル レベルではなく、仮想デバむス レベルです。 プヌル レベルでは冗長性はたったくありたせん。ドラむブ vdev たたは特殊な vdev が倱われるず、それずずもにプヌル党䜓も倱われたす。

最新のストレヌゞ プヌルは、キャッシュや仮想デバむス ログが倱われおも生き残るこずができたすが、停電やシステム クラッシュ䞭に vdev ログが倱われた堎合には、少量のダヌティ デヌタが倱われる可胜性がありたす。

ZFS の「デヌタ ストラむプ」はプヌル党䜓に曞き蟌たれるずいう誀解がよくありたす。 本圓じゃない。 Zpool は党然面癜くない RAID0、むしろ面癜い JBOD 耇雑な倉数分配メカニズムを備えおいたす。

ほずんどの堎合、゚ントリは利甚可胜な空き領域に応じお利甚可胜な仮想デバむスに分散されるため、理論䞊はすべお同時に埋められたす。 ZFS の新しいバヌゞョンでは、珟圚の vdev の䜿甚状況 (䜿甚率) が考慮されたす。ある仮想デバむスが別の仮想デバむスよりも倧幅にビゞヌな堎合 (たずえば、読み取り負荷により)、空き容量が最も倚いにもかかわらず、䞀時的に曞き蟌みがスキップされたす。スペヌス比率。

最新の ZFS 曞き蟌み割り圓お方法に組み蟌たれた䜿甚率怜出メカニズムは、異垞に高負荷の期間䞭のレむテンシヌを削枛し、スルヌプットを向䞊させるこずができたすが、そうではありたせん。 真っ癜なカルテ XNUMX ぀のプヌル内で䜎速 HDD ず高速 SSD が意図せず混圚するこずに぀いお。 このような䞍均等なプヌルは、䟝然ずしお最も遅いデバむスの速床で動䜜したす。぀たり、プヌル党䜓がそのようなデバむスで構成されおいるかのように動䜜したす。

vdev

各ストレヌゞ プヌルは、1 ぀以䞊の仮想デバむス (仮想デバむス、vdev) で構成されたす。 さらに、各 vdev には 2 ぀以䞊の実デバむスが含たれたす。 ほずんどの仮想デバむスは単玔なデヌタ ストレヌゞに䜿甚されたすが、CACHE、LOG、SPECIAL などの vdev ヘルパヌ クラスがいく぀かありたす。 これらの vdev タむプのそれぞれは、単䞀デバむス (単䞀デバむス)、RAIDz3、RAIDzXNUMX、RAIDzXNUMX、たたはミラヌ (ミラヌ) の XNUMX ぀のトポロゞのいずれかを持぀こずができたす。

RAIDz1、RAIDz2、および RAIDz3 は、昔からダブル (察角) パリティ RAID ず呌ばれおいたものの特別な皮類です。 1、2、および 3 は、各デヌタ ストリップに割り圓おられるパリティ ブロックの数を瀺したす。 パリティ甚に個別のディスクを䜿甚する代わりに、RAIDz 仮想デバむスはこのパリティをディスク党䜓にほが均等に分散したす。 RAIDz アレむでは、パリティ ブロックず同数のディスクが倱われる可胜性がありたす。 もう XNUMX ぀を倱うずクラッシュし、ストレヌゞ プヌルも䞀緒に奪われたす。

ミラヌリングされた仮想デバむス (ミラヌ vdev) では、各ブロックは vdev 内の各デバむスに保存されたす。 XNUMX 幅のミラヌが最も䞀般的ですが、任意の数のデバむスをミラヌ内に含めるこずができたす。読み取りパフォヌマンスずフォヌルト トレランスを向䞊させるために、倧芏暡なむンストヌルではトリプルがよく䜿甚されたす。 vdev 内の少なくずも XNUMX ぀のデバむスが機胜し続ける限り、vdev ミラヌは障害が発生しおも存続できたす。

単䞀の vdev は本質的に危険です。 このような仮想デバむスは䞀床障害が発生するず存続できたせん。たた、ストレヌゞたたは特殊な vdev ずしお䜿甚されおいる堎合、その障害はプヌル党䜓の砎壊に぀ながりたす。 ここは非垞に泚意しおください。

CACHE、LOG、および SPECIAL VA は、䞊蚘のトポロゞのいずれかを䜿甚しお䜜成できたすが、SPECIAL VA の損倱はプヌルの損倱を意味するため、冗長トポロゞを匷くお勧めしたす。

デバむス

これはおそらく ZFS で最も理解しやすい甚語です。文字通り、ブロック ランダム アクセス デバむスです。 仮想デバむスは個々のデバむスで構成されおいるのに察し、プヌルは仮想デバむスで構成されおいるこずに泚意しおください。

磁気ディスクたたは゜リッド ステヌトのディスクは、vdev の構成芁玠ずしお䜿甚される最も䞀般的なブロック デバむスです。 ただし、/dev に蚘述子を持぀デバむスはどれでも䜿甚できるため、ハヌドりェア RAID アレむ党䜓を個別のデバむスずしお䜿甚できたす。

シンプルな RAW ファむルは、vdev を構築するための最も重芁な代替ブロック デバむスの XNUMX ぀です。 からのテストプヌル スパヌスファむル ã“れは、プヌル コマンドをチェックし、特定のトポロゞのプヌルたたは仮想デバむスで利甚可胜なスペヌスの量を確認するのに非垞に䟿利な方法です。

ZFS の基本: ストレヌゞずパフォヌマンス
わずか数秒でスパヌス ファむルからテスト プヌルを䜜成できたすが、その埌、プヌル党䜓ずそのコンポヌネントを削陀するこずを忘れないでください。

サヌバヌを 10 ぀のディスク䞊に配眮し、9300 TB ディスク (箄 2 GiB) を䜿甚する予定であるずしたす。しかし、どのトポロゞがニヌズに最適であるかわかりたせん。 䞊の䟋では、スパヌス ファむルからテスト プヌルを数秒で構築しおいたす。これで、10 台の 50 TB ディスクからなる RAIDzXNUMX vdev が XNUMX TiB の䜿甚可胜な容量を提䟛するこずがわかりたした。

もう XNUMX ぀の特別なクラスのデバむスは SPARE (スペア) です。 ホットスワップ デバむスは、通垞のデバむスずは異なり、単䞀の仮想デバむスではなく、プヌル党䜓に属したす。 プヌル内の vdev に障害が発生し、スペア デバむスがプヌルに接続されお䜿甚可胜な堎合、そのデバむスは圱響を受ける vdev に自動的に参加したす。

圱響を受ける vdev に接続した埌、スペア デバむスは、倱われたデバむス䞊にあるはずのデヌタのコピヌたたは再構築の受信を開始したす。 埓来の RAID ではこれを再構築ず呌びたすが、ZFS では再同期化ず呌びたす。

スペア デバむスは故障したデバむスを氞久に眮き換えるものではないこずに泚意するこずが重芁です。 これは、vdev の機胜が䜎䞋する時間を短瞮するための䞀時的な眮き換えにすぎたせん。 管理者が障害が発生した vdev を亀換するず、その氞続デバむスに冗長性が埩元され、SPARE が vdev から切断され、プヌル党䜓のスペアずしお動䜜するように戻りたす。

デヌタセット、ブロック、セクタヌ

ZFS の取り組みで理解すべき次の構成芁玠は、ハヌドりェアに぀いおではなく、デヌタ自䜓がどのように線成され、保存されるかに぀いおです。 党䜓的な構造の理解を維持しながら詳现が乱雑にならないように、ここではメタスラブなどのいく぀かのレベルをスキップしおいたす。

デヌタセット (デヌタセット)

ZFS の基本: ストレヌゞずパフォヌマンス
最初にデヌタセットを䜜成するず、利甚可胜なすべおのプヌル スペヌスが衚瀺されたす。 次に、クォヌタを蚭定し、マりント ポむントを倉曎したす。 魔法

ZFS の基本: ストレヌゞずパフォヌマンス
Zvol の倧郚分は、ファむルシステム局を取り陀いた単なるデヌタセットですが、ここでは完党に通垞の ext4 ファむルシステムに眮き換えおいたす。

ZFS デヌタセットは、暙準のマりントされたファむル システムずほが同じです。 通垞のファむルシステムず同様、䞀芋するず「ただのフォルダヌ」に芋えたす。 ただし、通垞のマりント可胜なファむルシステムず同様に、各 ZFS デヌタセットには独自の基本プロパティのセットがありたす。

たず第䞀に、デヌタセットには割り圓おを割り圓おるこずができたす。 蚭定されおいる堎合 zfs set quota=100G poolname/datasetnameそうするず、マりントされたフォルダヌに曞き蟌むこずができなくなりたす。 /poolname/datasetname 100 GiB を超える。

各行の先頭にスラッシュが存圚するか存圚しないこずに泚意しおください。 各デヌタセットは、ZFS 階局ずシステム マりント階局の䞡方に独自の堎所を持ちたす。 ZFS 階局には先頭にスラッシュがありたせん。最初にプヌル名を入力し、次にあるデヌタセットから次のデヌタセットぞのパスを入力したす。 䟋えば、 pool/parent/child ずいう名前のデヌタセットの堎合 child 芪デヌタセットの䞋にある parent クリ゚むティブ名の付いたプヌル内 pool.

デフォルトでは、デヌタセットのマりント ポむントは、先頭にスラッシュが付いた ZFS 階局内の名前ず同等になりたす (プヌルずいう名前)。 pool ずしおマりントされる /pool、デヌタセット parent に取り付けられおいる /pool/parent、および子デヌタセット child に取り付けられおいる /pool/parent/child。 ただし、デヌタセットのシステム マりント ポむントは倉曎できたす。

指定するず zfs set mountpoint=/lol pool/parent/child、次にデヌタセット pool/parent/child システムに次のようにマりントされたす /lol.

デヌタセットに加えお、ボリュヌム (zvol) に぀いおも蚀及する必芁がありたす。 ボリュヌムはデヌタセットずほが同じですが、実際にはファむル システムを持たず、単なるブロック デバむスである点が異なりたす。 たずえば、次のように䜜成できたす。 zvol 名前で mypool/myzvol次に、ext4 ファむル システムでフォヌマットし、そのファむル システムをマりントしたす。これで、ext4 ファむル システムが完成したしたが、ZFS のすべおのセキュリティ機胜が備えられおいたす。 これは単䞀マシンではばかげおいるように思えるかもしれたせんが、iSCSI デバむスを゚クスポヌトするずきのバック゚ンドずしおははるかに理にかなっおいたす。

ブロック

ZFS の基本: ストレヌゞずパフォヌマンス
ファむルは XNUMX ぀以䞊のブロックで衚されたす。 各ブロックは XNUMX ぀の仮想デバむスに保存されたす。 通垞、ブロック サむズはパラメヌタず同じです。 レコヌドサむズ、ただし、次のように枛らすこずができたす。 2^シフトメタデヌタたたは小さなファむルが含たれおいる堎合。

ZFS の基本: ストレヌゞずパフォヌマンス
私たちは本圓に 本圓に 小さすぎるシフトを蚭定するず、パフォヌマンスが倧幅に䜎䞋するずいうのは冗談ではありたせん。

ZFS プヌルでは、メタデヌタを含むすべおのデヌタがブロックに保存されたす。 各デヌタセットの最倧ブロックサむズはプロパティで定矩されたす。 recordsize (レコヌドサむズ)。 レコヌド サむズは倉曎できたすが、デヌタセットに既に曞き蟌たれおいるブロックのサむズや䜍眮は倉曎されたせん。新しいブロックが曞き蟌たれるずきにのみ圱響したす。

特に指定がない限り、珟圚のデフォルトのレコヌド サむズは 128 KiB です。 パフォヌマンスが完璧ではない堎合、これは䞀皮のトリッキヌなトレヌドオフですが、ほずんどの堎合、それほどひどいこずではありたせん。 Recordsize 4K から 1M たでの任意の倀に蚭定できたす (詳现蚭定あり) recordsize さらに倚くむンストヌルするこずもできたすが、これが良い考えになるこずはほずんどありたせん)。

どのブロックも 2 ぀のファむルのデヌタのみを参照したす。4 ぀の異なるファむルを XNUMX ぀のブロックに詰め蟌むこずはできたせん。 各ファむルは、サむズに応じお XNUMX ぀以䞊のブロックで構成されたす。 ファむル サむズがレコヌド サむズより小さい堎合、ファむルはより小さいブロック サむズで保存されたす。たずえば、XNUMX KiB ファむルのブロックは、ディスク䞊の XNUMX KiB セクタヌを XNUMX ぀だけ占有したす。

ファむルが十分に倧きく、いく぀かのブロックが必芁な堎合、このファむルのすべおのレコヌドは次のサむズになりたす。 recordsize - 最埌の゚ントリを含み、その䞻芁郚分は次のずおりである可胜性がありたす。 未䜿甚スペヌス.

zvols にはプロパティがありたせん recordsize â€” 代わりに同等のプロパティを持ちたす volblocksize.

セクタヌ

最埌の最も基本的な構成芁玠はセクタヌです。 これは、基瀎ずなるデバむスに察しお曞き蟌みたたは読み取りができる最小の物理単䜍です。 数十幎間、ほずんどのディスクは 512 バむトのセクタヌを䜿甚しおいたした。 最近では、ほずんどのディスクが 4 KiB セクタヌに構成されおおり、䞀郚のディスク (特に SSD) には 8 KiB 以䞊のセクタヌがありたす。

ZFS システムには、セクタヌ サむズを手動で蚭定できるプロパティがありたす。 この物件 ashift。 少し玛らわしいですが、ashft は XNUMX の环乗です。 䟋えば、 ashift=9 セクタ サむズが 2^9、぀たり 512 バむトであるこずを意味したす。

ZFS は、各ブロックデバむスが新しい vdev に远加されるずきにオペレヌティングシステムにク゚リを実行しお、各ブロックデバむスに関する詳现情報を取埗し、理論的にはその情報に基づいお ashift を自動的に適切にむンストヌルしたす。 残念ながら、Windows XP ずの互換性を維持するために、倚くのドラむブはセクタ サむズを停っおいたす (Windows XP は他のセクタ サむズのドラむブを認識できたせんでした)。

これは、ZFS 管理者がデバむスの実際のセクタヌ サむズを把握し、手動で蚭定するこずを匷くお勧めするこずを意味したす。 ashift。 ashift の蚭定が䜎すぎるず、読み取り/曞き蟌み操䜜の数が倩文孊的に増加したす。 したがっお、512 バむトの「セクタ」を実際の 4 KiB セクタに曞き蟌むずいうこずは、最初の「セクタ」を曞き蟌み、次に 4 KiB セクタを読み取り、512 番目の 4 バむトの「セクタ」で倉曎し、新しいセクタに曞き戻す必芁があるこずを意味したす。゚ントリごずに XNUMX KiB セクタヌなど。

珟実の䞖界では、このようなペナルティは Samsung EVO SSD に課せられたす。 ashift=13ただし、これらの SSD はセクタヌ サむズに぀いお嘘を぀いおいるため、デフォルトは次のように蚭定されおいたす。 ashift=9。 経隓豊富なシステム管理者がこの蚭定を倉曎しない堎合、この SSD は機胜したす。 遅い 埓来の磁気HDD。

比范甚、サむズが倧きすぎる堎合 ashift 実質的に眰則はありたせん。 実際のパフォヌマンスの䜎䞋はなく、未䜿甚スペヌスの増加はごくわずかです (圧瞮が有効な堎合はれロ)。 したがっお、512 バむトのセクタヌを䜿甚するドラむブでも、 ashift=12 あるいは ashift=13自信を持っお未来に向かうために。

プロパティ ashift vdev 仮想デバむスごずに蚭定され、 プヌル甚ではありたせん、倚くの人が誀解しおいるように、むンストヌル埌も倉化したせん。 うっかりぶ぀けおしたったら ashift 新しい vdev をプヌルに远加するず、そのプヌルが䜎パフォヌマンスのデバむスで取り返しの぀かないほど汚染されおしたうため、通垞はプヌルを砎棄しお最初からやり盎す以倖に遞択肢はありたせん。 vdev を削陀しおも、壊れた構成からは救われたせん ashift!

コピヌオンラむトメカニズム

ZFS の基本: ストレヌゞずパフォヌマンス
通垞のファむル システムがデヌタを䞊曞きする必芁がある堎合、デヌタが存圚する各ブロックを倉曎したす。

ZFS の基本: ストレヌゞずパフォヌマンス
コピヌオンラむト ファむル システムは、新しいブロック バヌゞョンを曞き蟌み、叀いバヌゞョンのロックを解陀したす。

ZFS の基本: ストレヌゞずパフォヌマンス
芁玄するず、ブロックの実際の物理的な䜍眮を無芖するず、「デヌタ圗星」は、利甚可胜なスペヌスのマップ䞊を巊から右に移動する「デヌタ ワヌム」に単玔化されたす。

ZFS の基本: ストレヌゞずパフォヌマンス
これで、コピヌオンラむト スナップショットがどのように機胜するかに぀いおよく理解できるようになりたした。各ブロックは耇数のスナップショットに属するこずができ、関連付けられたすべおのスナップショットが砎棄されるたで保持されたす。

Copy on Write (CoW) メカニズムは、ZFS をこれほど玠晎らしいシステムにする基本的な基盀です。 基本的な抂念は単玔です。埓来のファむル システムにファむルの倉曎を芁求するず、芁求されたずおりに実行されたす。 コピヌオンラむト ファむル システムに同じこずを芁求するず、「OK」ずは蚀いたすが、嘘を぀きたす。

代わりに、コピヌオンラむト ファむル システムは、倉曎されたブロックの新しいバヌゞョンを曞き蟌み、ファむルのメタデヌタを曎新しお叀いブロックのリンクを解陀し、曞き蟌んだばかりの新しいブロックを関連付けたす。

叀いブロックの切り離しず新しいブロックのリンクは XNUMX 回の操䜜で行われるため、䞭断するこずはできたせん。これが起こった埌に電源を切るず、ファむルの新しいバヌゞョンが䜜成され、早めに電源を切るず、叀いバヌゞョンが保持されたす。 。 いずれの堎合も、ファむル システム内で競合は発生したせん。

ZFS のコピヌオンラむトは、ファむル システム レベルだけでなく、ディスク管理レベルでも発生したす。 これは、ZFS が空癜文字の圱響を受けないこずを意味したす (RAID の穎) - システムがクラッシュし、再起動埌にアレむが損傷する前に、ストリップが郚分的にしか蚘録できなかった珟象。 ここではストラむプはアトミックに曞き蟌たれ、vdev は垞にシヌケンシャルであり、 ボブはあなたの叔父です.

ZIL: ZFS むンテント ログ

ZFS の基本: ストレヌゞずパフォヌマンス
ZFS システムは同期曞き蟌みを特別な方法で扱いたす。同期曞き蟌みは䞀時的ではありたすがすぐに ZIL に保存され、埌で非同期曞き蟌みずずもに氞続的に曞き蟌たれたす。

ZFS の基本: ストレヌゞずパフォヌマンス
通垞、ZIL に曞き蟌たれたデヌタは再床読み取られるこずはありたせん。 ただし、システムクラッシュの埌は可胜性がありたす

ZFS の基本: ストレヌゞずパフォヌマンス
SLOG (セカンダリ LOG デバむス) は、ZIL をメむン ストレヌゞずは別に保存できる特殊な (できれば非垞に高速な) vdev です。

ZFS の基本: ストレヌゞずパフォヌマンス
クラッシュ埌、ZIL 内のすべおのダヌティ デヌタが再生されたす。この堎合、ZIL は SLOG 䞊にあるため、そこから再生されたす。

曞き蟌み操䜜には、同期 (sync) ず非同期 (async) の XNUMX ぀の䞻なカテゎリがありたす。 ほずんどのワヌクロヌドでは、曞き蟌みの倧郚分が非同期です。ファむル システムにより、曞き蟌みを集玄しおバッチで発行できるため、断片化が軜枛され、スルヌプットが倧幅に向䞊したす。

同期録音はたったく別の問題です。 アプリケヌションが同期曞き蟌みをリク゚ストするず、ファむル システムに次のように指瀺したす。「これを䞍揮発性メモリにコミットする必芁がありたす」 今すぐそれたでは、他にできるこずは䜕もありたせん。」 したがっお、同期曞き蟌みはすぐにディスクにコミットされる必芁がありたすが、それによっお断片化が増加したり、スルヌプットが䜎䞋したりする堎合は、それは問題ありたせん。

ZFS は、同期曞き蟌みを通垞のファむル システムずは異なる方法で凊理したす。同期曞き蟌みを通垞のストレヌゞに即座にコミットするのではなく、ZFS むンテント ログ (ZIL) ず呌ばれる特別なストレヌゞ領域にコミットしたす。 重芁なのは、これらのレコヌドが たた メモリ内に残り、通垞の非同期曞き蟌みリク゚ストずずもに集玄され、埌で完党に通垞の TXG (トランザクション グルヌプ) ずしおストレヌゞにフラッシュされたす。

通垞の動䜜では、ZIL は曞き蟌たれ、再床読み取られるこずはありたせん。 しばらくしお、ZIL からのレコヌドが RAM から通垞の TXG 内のメむン ストレヌゞにコミットされるず、それらのレコヌドは ZIL から切り離されたす。 ZIL から䜕かが読み取られるのは、プヌルがむンポヌトされたずきのみです。

ZIL 内にデヌタがあるずきに ZFS に障害が発生した堎合 (オペレヌティング システムのクラッシュや停電など)、そのデヌタは次回のプヌルのむンポヌト䞭 (たずえば、緊急システムの再起動時) に読み取られたす。 ZIL 内のすべおのものが読み取られ、TXG にグルヌプ化され、メむン ストレヌゞにコミットされた埌、むンポヌト プロセス䞭に ZIL から切り離されたす。

vdev ヘルパヌ クラスの XNUMX ぀は、LOG たたは SLOG (LOG のセカンダリ デバむス) ず呌ばれたす。 これには XNUMX ぀の目的がありたす。それは、ZIL をメむンの vdev ストアに保存するのではなく、ZIL を保存するための別の、できれば高速で曞き蟌み耐性の高い vdev をプヌルに提䟛するこずです。 ZIL 自䜓は、栌玍堎所に関係なく同じように動䜜したすが、LOG vdev の曞き蟌みパフォヌマンスが非垞に高い堎合は、同期曞き蟌みが高速になりたす。

LOG を含む vdev をプヌルに远加しおも機胜しない できない 非同期曞き蟌みパフォヌマンスを向䞊させる - たずえすべおの曞き蟌みを ZIL に匷制したずしおも zfs set sync=always、ログがない堎合ず同じ方法および同じペヌスで TXG のメむン ストレヌゞにリンクされたす。 唯䞀の盎接的なパフォヌマンスの向䞊は、同期曞き蟌みのレむテンシヌです (ログが高速になるず操䜜が高速化されるため)。 sync).

ただし、すでに倧量の同期曞き蟌みが必芁な環境では、vdev LOG は非同期曞き蟌みず非キャッシュ読み取りを間接的に高速化できたす。 ZIL ゚ントリを別の vdev LOG にオフロヌドするず、プラむマリ ストレヌゞ䞊の IOPS の競合が枛り、すべおの読み取りず曞き蟌みのパフォヌマンスがある皋床向䞊したす。

スナップショット

コピヌオンラむト メカニズムは、ZFS アトミック スナップショットず増分非同期レプリケヌションに必芁な基盀でもありたす。 アクティブなファむル システムには、すべおのレコヌドに珟圚のデヌタをマヌクするポむンタ ツリヌがありたす。スナップショットを䜜成するずきは、このポむンタ ツリヌのコピヌを䜜成するだけです。

アクティブなファむルシステムでレコヌドが䞊曞きされるず、ZFS は最初に新しいブロックバヌゞョンを未䜿甚のスペヌスに曞き蟌みたす。 次に、叀いバヌゞョンのブロックを珟圚のファむル システムから切り離したす。 ただし、スナップショットが叀いブロックを参照しおいる堎合、そのブロックは倉曎されないたたになりたす。 叀いブロックは、このブロックを参照しおいるすべおのスナップショットが砎棄されるたで、実際には空き領域ずしお埩元されたせん。

耇補

ZFS の基本: ストレヌゞずパフォヌマンス
2015 幎の私の Steam ラむブラリは 158 GiB で、126 個のファむルが含たれおいたした。 これは rsync にずっお最適な状況にかなり近く、ネットワヌク䞊の ZFS レプリケヌションは「わずか」 927% 高速でした。

ZFS の基本: ストレヌゞずパフォヌマンス
同じネットワヌク䞊で、単䞀の 40 GB Windows 7 仮想マシン むメヌゞ ファむルをレプリケヌトする堎合は、たったく別の話になりたす。 ZFS レプリケヌションは rsync より 289 倍高速です。 --inplace で rsync を呌び出すこずができるほど粟通しおいる堎合は、「わずか」 161 倍高速です。

ZFS の基本: ストレヌゞずパフォヌマンス
VM むメヌゞがスケヌリングされるず、rsync はそれに合わせおスケヌリングを発行したす。 1,9 TiB は、最新の VM むメヌゞずしおはそれほど倧きくありたせんが、rsync の --inplace 匕数を䜿甚した堎合でも、ZFS レプリケヌションが rsync よりも 1148 倍高速になるには十分な倧きさです

スナップショットの仕組みを理解すれば、レプリケヌションの本質を簡単に理解できるはずです。 スナップショットはレコヌドぞのポむンタのツリヌにすぎないため、次のようにするず次のようになりたす。 zfs send スナップショットを䜜成した埌、このツリヌずそれに関連付けられたすべおのレコヌドの䞡方を送信したす。 これを送信するずき zfs send в zfs receive タヌゲット䞊では、ブロックの実際の内容ず、ブロックを参照するポむンタヌのツリヌの䞡方がタヌゲット デヌタセットに曞き蟌たれたす。

XNUMX番目ではさらに面癜くなりたす zfs send。 珟圚、XNUMX ぀のシステムがあり、それぞれに以䞋が含たれおいたす。 poolname/datasetname@1そしお、新しいスナップショットを撮りたす poolname/datasetname@2。 したがっお、元のプヌルには datasetname@1 О datasetname@2、タヌゲット プヌルにはこれたでのずころ最初のスナップショットのみが含たれおいたす datasetname@1.

゜ヌスずタヌゲットの間に共通のスナップショットがあるため、 datasetname@1、私たちにはできたす 増分 zfs send その䞊。 システムに察しおこう蚀うず、 zfs send -i poolname/datasetname@1 poolname/datasetname@2、XNUMX ぀のポむンタヌ ツリヌを比范したす。 にのみ存圚するポむンタ @2、明らかに新しいブロックを参照しおいるため、これらのブロックの内容が必芁です。

リモヌト システムで増分を凊理する send 同様にシンプルです。 たず、ストリヌムに含たれるすべおの新しい゚ントリを曞き蟌みたす send、そしおそれらのブロックぞのポむンタヌを远加したす。 ほら、できたしたよ @2 新システムで

ZFS の非同期増分レプリケヌションは、rsync などの以前の非スナップショットベヌスの方法に比べお倧幅に改善されおいたす。 どちらの堎合も、倉曎されたデヌタのみが転送されたすが、最初に rsync を実行する必芁がありたす。 読む ディスクから䞡面のすべおのデヌタを取り出しお合蚈を確認し、比范したす。 察照的に、ZFS レプリケヌションはポむンタヌ ツリヌず共有スナップショットに存圚しないブロックのみを読み取りたす。

内蔵圧瞮機胜

コピヌオンラむト メカニズムにより、むンラむン圧瞮システムも簡玠化されたす。 埓来のファむル システムでは、圧瞮に問題がありたす。倉曎されたデヌタの叀いバヌゞョンず新しいバヌゞョンの䞡方が同じスペヌスに存圚したす。

ファむルの途䞭にあるデヌタが 0x00000000 などから始たるメガバむトのれロであるず考えるず、それをディスク䞊の 256 セクタヌに圧瞮するのは非垞に簡単です。 しかし、そのメガバむトのれロを、JPEG や疑䌌ランダム ノむズなどの非圧瞮デヌタのメガバむトに眮き換えるずどうなるでしょうか? 予想倖なこずに、このメガバむトのデヌタには 4 ぀ではなく XNUMX 個の XNUMX KiB セクタヌが必芁ですが、ディスク䞊のこの堎所には XNUMX ぀のセクタヌだけが予玄されおいたす。

ZFS では、倉曎されたレコヌドは垞に未䜿甚のスペヌスに曞き蟌たれるため、この問題は発生したせん。元のブロックは 4 KiB セクタヌを 256 ぀だけ占有し、新しいレコヌドは XNUMX セクタヌを占有したすが、これは問題ではありたせん。「」から最近倉曎されたフラグメントです。ファむルの「middle」は、サむズが倉曎されたかどうかに関係なく、未䜿甚の領域に曞き蟌たれるため、ZFS ではこれは非垞に䞀般的な状況です。

ネむティブ ZFS 圧瞮はデフォルトで無効になっおおり、システムはプラグ可胜なアルゎリズム (珟圚は LZ4、gzip (1-9)、LZJB、および ZLE) を提䟛しおいたす。

  • LZ4 は、非垞に高速な圧瞮ず解凍を提䟛し、ほずんどのナヌスケヌス (かなり遅い CPU 䞊でも) でパフォヌマンス䞊の利点を提䟛するストリヌミング アルゎリズムです。
  • GZIP は、すべおの Unix ナヌザヌが知っおおり、愛甚しおいる由緒あるアルゎリズムです。 圧瞮レベル 1  9 で実装でき、レベル 9 に近づくに぀れお圧瞮率ず CPU 䜿甚率が増加したす。このアルゎリズムはすべおのテキスト (たたはその他の高圧瞮性) の䜿甚䟋に適しおいたすが、それ以倖の堎合は CPU の問題が頻繁に発生したす。このアルゎリズムを䜿甚しおください。特に高いレベルでは泚意しおください。
  • LZJB ZFS の独自のアルゎリズムです。 これは時代遅れであり、もう䜿甚すべきではありたせん。LZ4 はあらゆる点でそれを䞊回っおいたす。
  • ひどく - れロレベル゚ンコヌディング、れロレベル゚ンコヌディング。 通垞のデヌタにはたったく圱響したせんが、倧きなれロのシヌケンスが圧瞮されたす。 非圧瞮デヌタは無芖されたすが、結果のレコヌド内の未䜿甚スペヌスが圧瞮されるため、完党に非圧瞮のデヌタセット (JPEG、MP4、たたはその他の既に圧瞮された圢匏など) に圹立ちたす。

ほがすべおのナヌスケヌスに LZ4 圧瞮をお勧めしたす。 非圧瞮デヌタに遭遇した堎合のパフォヌマンスの䜎䞋は非垞に小さいです。 むンクリメント 䞀般的なデヌタのパフォヌマンスは重芁です。 Windows オペレヌティング システムの新芏むンストヌル甚の仮想マシン むメヌゞ (新しくむンストヌルされた OS、ただ内郚にデヌタがない) をコピヌする compression=lz4 よりも 27% 早く合栌 compression=noneで 2015幎のこのテスト.

ARC - 適応型眮換キャッシュ

ZFS は、最近読み取られたブロックのコピヌを RAM に保存するためにオペレヌティング システムのペヌゞ キャッシュに䟝存するのではなく、独自の読み取りキャッシュ メカニズムを䜿甚する、私たちが知る限り唯䞀の最新のファむル システムです。

ネむティブ キャッシュにも問題がないわけではありたせんが、ZFS はカヌネルほど早く新しいメモリ割り圓お芁求に応答できないため、新たな課題が発生したす。 malloc() ARC が珟圚占有しおいる RAM が必芁な堎合、メモリ割り圓おが倱敗する可胜性がありたす。 しかし、少なくずも珟時点では、独自のキャッシュを䜿甚する十分な理由がありたす。

MacOS、Windows、Linux、BSD などの既知の最新のオペレヌティング システムはすべお、LRU (Least Recent Used) アルゎリズムを䜿甚しおペヌゞ キャッシュを実装しおいたす。 これは、読み取りのたびにキャッシュされたブロックを「キュヌの䞊」にプッシュし、新しいキャッシュ ミス (キャッシュからではなくディスクから読み取られるべきブロック) を远加するために必芁に応じおブロックを「キュヌの䞋」にプッシュする原始的なアルゎリズムです。䞊。

通垞、このアルゎリズムは正垞に動䜜したすが、倧芏暡な䜜業デヌタセットを含むシステムでは、LRU によっおスラッシングが発生しやすくなりたす。぀たり、キャッシュから二床ず読み取られないブロック甚のスペヌスを確保するために、頻繁に必芁なブロックが排陀されたす。

ARC ã“れは、「重み付けされた」キャッシュず考えるこずができる、はるかに単玔なアルゎリズムではありたせん。 キャッシュされたブロックが読み取られるたびに、ブロックは少し「重くなり」、削陀が難しくなりたす。ブロックを削陀した埌でも、 远跡された 䞀定期間内。 远い出されたが、その埌キャッシュに読み戻す必芁があるブロックも「重くなり」たす。

これらすべおの最終結果は、キャッシュ ヒット (キャッシュから実行される読み取り) ずキャッシュ ミス (ディスクからの読み取り) の比率であるヒット率がはるかに高いキャッシュになりたす。 これは非垞に重芁な統蚈です。キャッシュ ヒット自䜓が桁違いに速く凊理されるだけでなく、キャッシュ ヒットが増えるほど同時ディスク リク゚ストが枛り、残りのミスの埅ち時間が短くなるため、キャッシュ ミスもより速く凊理されたす。ディスクず䞀緒に提䟛する必芁がありたす。

たずめ

ZFS の基本的なセマンティクス (コピヌオンラむトの仕組み、ストレヌゞ プヌル、仮想デバむス、ブロック、セクタヌ、ファむル間の関係) を孊習したら、実際のパフォヌマンスに぀いお実数を䜿っお議論する準備が敎いたす。

次のパヌトでは、ミラヌリングされた vdev ず RAIDz を備えたプヌルの実際のパフォヌマンスを盞互に比范し、たた、これたで調査しおきた埓来の Linux カヌネル RAID トポロゞず比范しお芋おいきたす。 前.

圓初は、ZFS トポロゞ自䜓の基本だけを説明したいず考えおいたしたが、 そのような L2ARC、SLOG、特別な割り圓おなどの補助 vdev タむプの䜿甚を含む、ZFS のより高床なセットアップずチュヌニングに぀いお説明する準備をしたしょう。

出所 habr.com

コメントを远加したす