私が理解しているように、「スパースファイル」とは、ファイルに「間隔」がある可能性があるため、使用される実際のデータが論理ファイルサイズより小さい可能性があることを意味します。
Linuxファイルシステムはどのようにディスクにファイルを保存しますか?私は主にext4に興味があります。しかし:
- ファイルを保存できますか?いいえディスクに順番に?つまり、ファイルの一部は物理アドレスXにあり、次の部分は物理アドレスY(X +オフセットに近い)にあります。
- どういうわけかファイルの順序を制御できますか?
10GBファイルを割り当てたいです。異なるオフセットに分割するのではなく、ディスク上で連続して表示したいと思います。 - 種類によって効果が違うの?
答え1
ファイルを保存できますか?いいえディスクに順番に?つまり、ファイルの一部は物理アドレス X の下にあり、他の部分は X+ オフセットに近い物理アドレス Y の下にあります。
はい、これはファイル断片化と呼ばれ、特に大容量ファイルの場合によく発生します。ほとんどのファイルシステムは必要に応じてスペースを多少順次割り当てますが、将来の動作を推測することはできません。したがって、ファイルに200MiBを書き込んでから100MiBを追加すると、両方のデータセットが表示される可能性があります。 0以外の値は次のとおりです。ディスクの別の領域に保存されます(デフォルトでは、最初の書き込み後と2番目の書き込みの前に発生するより多くのディスク領域を必要とする他の書き込みがその間に発生する可能性があります)。ファイルシステムがほぼいっぱいになると、状況はさらに悪化することがよくあります。新しいファイルを収容するのに十分な連続した空き領域がない可能性があるため、断片化する必要があります。
どういうわけかファイルの順序を制御できますか? 10GBの大容量ファイルを割り当てたいです。異なるオフセットに分割するのではなく、ディスクで連続して使用したいと思います。
ファイルを作成すると、ファイルシステムにファイルの宛先サイズを知らせることができます。これは、ファイルシステムがファイルを最適に保存するのに役立ちます。多くの最新のファイルシステムは、遅延割り当てと呼ばれる技術を使用しています。この手法では、新しいファイルのディスクレイアウトをできるだけ遅く計算して、計算を実行するときに利用可能な情報を最大化します。以下を使用してこのプロセスを支援できます。posix_fallocate(3)
この関数は、割り当てる必要のあるディスク容量の合計量をファイルシステムに通知します。最新のファイルシステムは、この割り当てを順番に実行しようとします。
種類によって効果が違うの?
他のファイルシステムは異なる動作をします。はい。ジャーナルベースのファイルシステム(例えば、NILFS2)は、拡張ベースのファイルシステム(例:Ext4)と同じ方法でストレージを割り当てません。これは変更の一例にすぎません。
答え2
このコマンドは、ファイルがどのようにデバイスfilefrag
に物理的に保存されるかを知らせます。
# filefrag -v /var/log/messages.1
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 2130567 1
1 1 15907576 2130568 1
2 2 15910400 15907577 1
3 3 15902720 15910401 7
4 10 2838546 15902727 1 eof
/var/log/messages.1: 5 extents found
一度にファイルを作成すると、ファイルが断片化されないようです。
(1)のマニュアルページはfallocate
非常に明確です。
fallocate
ファイルにブロックを事前割り当てするために使用されます。システムコールをサポートするファイルシステムでは、fallocate
データブロックへのIOを必要とせずにブロックを割り当て、初期化されていないとマークすることでこれをすばやく実行できます。これは、ファイルをゼロで埋めることによって生成するよりもはるかに高速です。Linux Kernel v2.6.31以降、
fallocate
btrfs、ext4、ocfs2、およびxfsファイルシステムへのシステムコールがサポートされています。
順次ですか?システムは最初にブロックを順次割り当てようとします。それ以外の場合は警告しません。
答え3
まれなファイルに言及しましたが、他の答えでは言及しませんでした。
ほとんどのファイルはリーンではありません。ファイルを作成する最も一般的な方法は、最初から最後まで一度に書き込むことです。そこに穴はありません。
しかし、「1,000,000,000,000の位置に移動し、そこにバイトを書き込みます」と言うことができます。これにより、エタバイトのサイズに見えるファイルが作成されますが、実際にはディスク上で(おそらく)4kしか使用しません。これはスパースファイルです。
同じファイルでこれを複数回実行することで、大量のスペースに少量のデータを分散できます。
これは便利ですが、2つの欠点があります。
1つ目は、ファイルが断片化されることです。これがまさにあなたが心配することです。
2つ目は、すべてのプログラムがこれらのファイルをうまく処理するわけではないということです。たとえば、一部のバックアップソフトウェアは空白のバックアップを試み、必要以上のバックアップを作成します。またバックアップメディアに適しています。
答え4
これがワンタイムで、ファイルが元々どのように保存されたかは重要ではなく、結果のみが重要な場合は、ファイルを正常に保存してからオペレーティングシステムの最適化を実行できます。これで確認できますこの回答ファイルが完成したら、そうでない場合は繰り返します。これはコマンドや外部プログラムを使用しない最も簡単な方法ですが、ディスク全体を最適化するため、最速の方法ではありません。