私たちは、プロセスを分岐するときに、オペレーティングシステムが書き込み中にコピー最適化を実行するのを見ました。これは、ほとんどの場合、execがフォークの前に来るため、不要なページ割り当てや呼び出し元のアドレス空間でデータコピーコストが発生したくないためです。
もしそうなら、ext4またはxfs(ジャーナリング)ファイルシステムを使用してLinuxでCPを実行しても、これは起こりますか?もしそのようなことが起こらないとしたら、なぜできないのでしょうか?
答え1
答え2
検索するキーワードはですreflink
。最近、XFSで実装されました。
編集:XFS実装はもともと実験的なものとしてマークされました。上記の内容を書いてから数ヶ月後、この警告はカーネルバージョン4.16から削除されました:-)。
答え3
Linuxには、ユーザースペースプロセスがファイルを書き込むときにファイルのコピーを作成するようにカーネルに指示できるシステムコールがあります。 FICLONERANGEおよびFICLONEは、書き込み中にファイルとファイル内の範囲をコピーできるようにするioctlオプションとして使用されます。
cp --reflinkこれを使用してファイルシステムベースのコピーを作成します。
答え4
システムコールを導入しない限り(または少なくともブロックをコピーしない限り)、オペレーティングシステムは、プログラムが書き込んでいるデータが他のブロックから読み取ったばかりのデータと等しいかどうかをcp
判断するのは困難です。cp
さらに、「同じブロックを共有する複数のファイル」シナリオを管理するには、追加のオーバーヘッドが必要です。ほんの数ブロックだけで、大きくて類似したファイルはほとんど発生しません。したがって、全体的にこれらのチャンクをコピーして管理オーバーヘッドみんな文書。
BTRFSにファイルシステムの別のレプリカ/スナップショットを追加してファイル(多くのファイル)を「コピー」すると、状況が異なります。今「コピー」されています。みんなファイルシステムのファイルとそのファイルに対するすべての変更は、書き込み時にコピーされます。これは存在しますが、ext4にはありません。
「日記」は完全に独立した概念で、重要なのはファイルの管理構造です。