プロセスをフォークするときに、OSがコピーオンライトの最適化を実行するのを見てきました。ほとんどの場合、フォークはexecによって処理されるため、ページ割り当てのコストが発生したり、呼び出し元のアドレススペースからデータを不必要にコピーしたりする必要はありません。
これは、ext4またはxfs(ジャーナリング)ファイルシステムを使用するLinuxでCPを実行するときにも発生します。発生しない場合、なぜ発生しないのですか?
プロセスをフォークするときに、OSがコピーオンライトの最適化を実行するのを見てきました。ほとんどの場合、フォークはexecによって処理されるため、ページ割り当てのコストが発生したり、呼び出し元のアドレススペースからデータを不必要にコピーしたりする必要はありません。
これは、ext4またはxfs(ジャーナリング)ファイルシステムを使用するLinuxでCPを実行するときにも発生します。発生しない場合、なぜ発生しないのですか?
回答:
cp
manページから:
--reflink [= always]が指定されている場合、軽量コピーを実行します。データブロックは変更された場合にのみコピーされます。これが不可能な場合、コピーが失敗するか、または--reflink = autoが指定されている場合、標準のコピーにフォールバックします。
これは、現時点では主にBTRFSであるコピーオンライト(reflink)をサポートするファイルシステムで機能します。XFS reflinkの実装は開発中です[1] [2]。
cp
(少なくともブロックをコピーするために)syscallを導入しない限り、OSは、cp
プログラムが書き込むデータが別のブロックから読み取ったデータと同じであると判断するのに苦労します。その上、「いくつかのファイルが同じブロックを共有する」シナリオを管理するための追加のオーバーヘッドがあります。少数のブロックでのみ異なる大きな類似ファイルはめったに発生しません。したがって、これらのブロックをコピーするだけで全体のコストが安くなり、すべてのファイルにこの管理オーバーヘッドが追加されます。
たとえば、BTRFSにファイルシステムの別のクローン/スナップショットを追加してファイル(ファイルの多く)を「コピー」すると、状況は異なります。ファイルシステム内のすべてのファイルを「コピー」し、それらはコピーオンライトになります。これは存在しますが、ext4にはありません。
「ジャーナリング」はそれとは完全に独立した概念であり、重要なファイルの管理構造です。