ZFS でコピーを作成する方法はありますか?

ZFS でコピーを作成する方法はありますか?

いくつかのファイル/ディレクトリのcow-copyを作成しようとしていますが、私が知っているいくつかの方法はすべて最適ではないようです。

たとえば、btrfs を使用すると、cp --reflink=autoファイルのコピーをすばやく生成できます。

私が試したこと:

  1. シンボリックリンク: ダメです。ファイル名が変更されましたが、リンクが壊れています。
  2. ハードリンク: 改善されましたが、まだ良くありません。1 つのファイルを変更すると、他のファイルも変更されますが、他のファイルを変更する必要はありません。
  3. データセットのスナップショットを作成し、そのスナップショットをクローンします。これは機能しますが、うまくいきません。多くの場合、データセット全体のコピーや、別のデータセットのように動作するコピーを求めているわけではありません。また、クローン/スナップショット/オリジナルの間には親/子関係があり、私の理解では、これを破ることは不可能ではないにしても困難です。
  4. を使用しzfs send/receive、重複排除を有効にして、データセットを新しいデータセットに複製します。これにより、クローンを使用する際の親/子関係は回避されますが、それでも不必要に別のデータセットが作成され、ファイルを 100% 読み取る必要があり、ブロックが書き込まれるのではなく再度参照されるため、速度が低下します。
  5. ファイルをコピーして重複排除を実行させる: これは機能しますが、ファイル (複数可) を 100% 読み取ってから、ブロックを書き込むのではなく再度参照する必要があるため、処理が遅くなります。

ほとんどのものが圧縮されて保存され、読み取り中に解凍され、重複ブロックを参照するために重複排除が作動する前に圧縮される必要があるため、zfs の送受信および物理的なコピーや rsync の遅さはさらに悪化します。

私が調べた限りでは、btrfs の --reflink のシンプルさに似たものを見つけることができませんでした。

では、ZFS でコピーを作成する方法はあるのでしょうか? それとも、「物理的に」コピーして重複排除を実行するのが唯一の現実的な選択肢なのでしょうか?

答え1

上で説明したオプション 3 がおそらく最善の策だと思います。あなたが望むことの最大の問題は、ZFS が実際にはこのコピーオンライトをデータセット/スナップショット レベルでのみ処理することです。

お使いの環境で適切に機能することを確認しない限り、dedup の使用は避けることを強くお勧めします。私の個人的な経験では、dedup は、ユーザーまたは VM ストアが 1 つ増えるまでは正常に機能していましたが、その後パフォーマンスが急激に低下し、多くの問題が発生しました。最初の 10 人のユーザーでは正常に機能しているように見えても、11 人目 (または 12 人目、13 人目など) を追加するとマシンがダウンする可能性があります。この方法を採用する場合は、実稼働環境を正確に模倣したテスト環境があること、およびその環境で dedup が適切に機能することを必ず確認してください。

オプション 3 に戻ると、この方法で管理する各ファイル システム ツリーを保持するための特定のデータ セットを設定する必要があります。設定して初期設定が完了したら、スナップショット (データセットごとに 1 つずつ、わずかに異なる) を作成し、クローンに昇格します。元のデータセットには二度と触れないでください。

はい、このソリューションには問題があります。問題がないとは言いませんが、ZFS の制限を考慮すると、おそらくこれが最善のソリューションです。クローンを効果的に使用している人に関する次の参考資料を見つけました。http://thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

私は btrfs にあまり詳しくありませんが、必要なオプションがサポートされている場合、これらのデータセットをサポートするためだけに別のサーバーを設定し、そのサーバーで Linux と btrfs を使用することを検討しましたか?

答え2

オプション5が最適です。

オプション 3 の親/子データセットに関しては、クローンを昇格させることができ、クローンされたデータセットの子ではなくなります。それでも余分なブロックは使用されません。 編集:これは親子関係を逆転させるだけで、破壊するわけではないことに注意してください。

圧縮/暗号化されているとコピーが遅くなるという話は、まったくの誤りです。プロセッサはブロック デバイスよりもはるかに高速です (SSD を使用している場合でも)。数値の例をいくつか挙げると、ブロックの読み取りには 10 秒かかりますが、解凍には 1 秒、復号化には 2 秒しかかからないとします。ブロック 1 は 10 秒で読み取られ、CPU に送られます。CPU は解凍と復号化を開始し、その間にディスクはブロック 2 の読み取りを開始します。CPU は 3 秒でタスクを終了し、その後 7 秒間ディスクを待機します。その間、ディスクはブロックが圧縮されているかどうかに関係なく、2 つのブロックの読み取りにまったく同じ時間 (20 秒) を費やしています。

同様に、書き込み中は最初のブロックのみが遅延します。CPU はブロック 1 を圧縮/暗号化してディスクに送信します。ディスクがブロック 1 を書き込んでいる間に、CPU は後続のブロックの圧縮/暗号化を開始します。CPU はディスクが書き込むよりもはるかに速くブロックを処理するため、問題にはなりません。(はい、実際はこれよりも複雑ですが、要点はこれです。)

ご質問の些細な点について長々と説明してしまい申し訳ありませんが、その誤解を解きたかったのです。

関連情報