ファイルシステム間で大容量ファイル(ファイルあたり1〜2 GB)をコピーすると、ターゲットファイルシステムがほぼいっぱいになるとファイルの断片化が発生する可能性があります。
私たちのC ++アプリケーションコードはfallocate()
データファイルの作成と書き込みにあらかじめ割り当てられたスペースを使用しますが、Linuxコピーコマンドがそれをどのように処理するかを知りたいと思います/bin/cp
。
cp
ループからバイトまたはデータの塊をコピーしますか(そしてファイルシステムにそれを処理させますか)?または、cp
最初に電話をかけるかfallocate()
、posix_fallocate()
ソースファイルのサイズを指定しますか?
インターネットで検索した結果、このトピックについては何も見つかりませんでした。
ファイルシステムはext3、ext4、またはxfsです。
Centos 8.1、カーネル 4.18.0-147.el8.x86_64 #1 SMP
私を編集する
背景として、実際のアプリケーションは一定のビットレートのネットワークストリームを読み取り、ファイルの内容のN秒を事前割り当てします。実際のビットレートが高いほど、ファイルは自然に大きくなります。ftruncate()
ファイルが閉じられたときに呼び出され、実際のビットレートが低いかどうかを処理します。cp
ファイルシステム間でこれらのファイルを移動する場合にのみ私の質問です。
その理由は分裂を避けるためです。ファイルシステムがなければ、fallocate
時間の経過とともにますます断片化します。 (fallocate()
もちろん、問題を完全に防止することはできませんが、確実に軽減できます)
~によると初期化されていないブロックと予期しないフラグ、fallocate()
連続ブロックが「効率的に」割り当てられます(ほとんどのファイルシステムで)。
Fallocate()システムコールは、アプリケーションがファイルの有効なブロック割り当てを要求する方法です。 fallocate()を使用すると、プロセスが必要なディスク容量を使用できることを確認できるため、ファイルシステムは単一の連続グループにすべてのスペースを割り当て、ブロックごとの割り当てのオーバーヘッドを防ぐのに役立ちます。
だから、大きくてひどく断片化されたファイルをコピーすると、ターゲットで連続して終了するのか、それとも断片化されるのか疑問に思います。スペースを事前に割り当てるcp
ために使用されていないので、答えは「おそらくはい」と思われます。fallocate()
答え1
cp
GNU coreutilsで提供されるバージョン使用してくださいfallocate
、コピー先のスペースを事前に割り当てるのではなく、ファイルに穴を開けるだけです。
これに対する支援の追加への言及が数回あったfallocate
ので、ある時点では、少なくともそうする計画が曖昧になっていたようです。