ファイルは順次ディスクに保存されますか?


22

私が理解したように、「スパースファイル」とは、ファイルに「ギャップ」があり、実際に使用されるデータが論理ファイルサイズよりも小さいことを意味します。

Linuxファイルシステムはディスク上のファイルをどのように保存しますか?私は主にext4に興味があります。しかし:

  1. ファイルをディスク上に順番に保存することはできませんか?つまり、ファイルの一部は物理アドレスXにあり、次の部分は物理アドレスYにありますが、これはX +オフセットに近くありません)。
  2. ファイルの連続性を何らかの方法で制御できますか?
    10GBのファイルを割り当てたいです。ディスク上で連続し、異なるオフセット間で分割されないようにします。
  3. 異なるタイプ間で異なる動作をしますか?


1
おそらく、私があなたの意図を正しく理解しているなら、あなたはファイルシステム層を経由せずにストレージデバイスを操作する低レベルAPIにもっと興味があるでしょう。エントリポイントは、dmsetupプログラム、デバイスマッパーへのインターフェイスになります。これは、データベースのようなストレージを計画している場合に適しています。
wvxvw

4
これは、ファイルシステムの実装の詳細です。ほとんどすべてのファイルシステムデフォルトでファイルを断片化します。のみでiso9660あり、それromfsを行うことができず、継続的なストレージを必要とします(これらのうちオフヘッドをリストできます)。
ミラビロス

2
ファイルがディスク上で連続しているかどうかに関係なく、ファイルの別の部分をシークしない限り、データの読み取り/書き込みは常に連続しています。なぜこれを気にしますか?断片化は、パフォーマンスに影響する深刻な問題でない限り
phuclvの

3
@hudac心に留めておくべきことの1つは、実際には連続がそれほど有用ではないことです。簡単なのは、断片化が大した問題ではないフラッシュですが、回転するプラッターでは、連続したデータの恩恵を受けない場合があります。回転する大皿では、アクセスパターンとデータの場所について考える必要があります。頭の下を通過したばかりのセクターが必要な場合は、再び完全に戻ってくるのを待つ必要があります。最良の結果を得るには、データをずらして、読み取る必要があるときに「近い」ようにします。キャッシュサイズの増加は簡単です;
Ukko

回答:


41

ファイルをディスク上に順番に保存することはできませんか?つまり、ファイルの一部は物理アドレスXの下にあり、他の部分は物理アドレスYの下にあり、X +オフセットに近くありません)。

はい; これはファイルの断片化と呼ばれ、特に大きなファイルの場合は珍しくありません。ほとんどのファイルシステムは、必要に応じてスペースを割り当てますが、将来的には推測できません。したがって、200MiBをファイルに書き込んでからさらに100MiBを追加すると、両方のデータセットがゼロ以外の可能性があります。ディスクのさまざまな領域に格納されます(基本的に、最初の書き込みの後、2番目の書き込みの前に発生する、ディスク上により多くのスペースを必要とする他の書き込みは、2つの間に入れられます)。ファイルシステムが満杯に近い場合、状況は通常悪化します。新しいファイルを保持するのに十分な大きさの連続した空き領域がない可能性があるため、断片化する必要があります。

ファイルのシーケンシャル性を何らかの形で制御できますか?10GBの大きなファイルを割り当てたい。ディスク内でシーケンシャルであり、異なるオフセットに分割されないようにします。

ファイルシステムの作成時に、ファイルシステムにファイルのターゲットサイズを伝えることができます。これは、ファイルシステムが最適に保存するのに役立ちます。最新のファイルシステムの多くは、遅延割り当てと呼ばれる手法を使用します。この手法では、計算の実行時に利用可能な情報を最大化するために、新しいファイルのディスク上のレイアウトが可能な限り遅く計算されます。posix_fallocate(3)関数を使用してファイルシステムに合計で割り当てるディスク容量を伝えることにより、このプロセスを支援できます。最新のファイルシステムは、この割り当てを順番に実行しようとします。

異なるタイプ間で異なる動作をしますか?

異なるファイルシステムは異なる動作をします、はい。NILFS2などのログベースのファイルシステムは、Ext4などのエクステントベースのファイルシステムと同じ方法でストレージを割り当てません。これはバリエーションの一例です。


1
使用fallocate(3)すると、ファイルの連続性が保証されますか?または単にファイルシステムをほのめかしますか?manページからは完全に理解できません。
hudac

6
順次割り当てを保証することはできません。これは単なるヒントです。ただし、10GiBファイルを作成する場合は必ず使用する必要があります。
スティーブンキット

6
基本的に、FATよりも洗練されたすべてのファイルシステム(元のBerkeley UFSにまでさかのぼる)は、意図的に大きなファイルを分割し、複数の「割り当てグループ」に分散します。これにより、ディスク全体の断片化を最小限に抑えることができます。これどのように機能するかを調整する方法があるかもしれませんが、それを行うためにゼロからファイルシステムを再作成しなければならないかなりの可能性があり、おそらくそれを完全にオフにする方法はありません。
zwol

2
@hudacすべての場合で連続性を保証することは不可能であり(満杯に近いドライブの場合を参照)、SSDの増加について正直に言うと、以前ほど重要ではありません(少なくとも余裕がある人にとっては) )。
ミューザー

1
また、RAIDシステムのように、可能であれば連続ファイルを使用すると効率が低下する場合があることに注意してください。それは本当にディスク/ストレージサブシステムコントローラーの目的だと思います。ファイルを保存するすべての作業を合理的に予想される限り最適にオフロードすることです。
jamesqf

17

このコマンド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(1)のmanページはかなり明確です:

fallocate ブロックをファイルに事前に割り当てるために使用されます。fallocateシステムコールをサポートするファイルシステムの場合、これはブロックを割り当て、それらを初期化されていないものとしてマークすることにより迅速に行われ、データブロックへのIOを必要としません。これは、ファイルをゼロで埋めて作成するよりもはるかに高速です。

Linux Kernel v2.6.31の時点で、fallocateシステムコールはbtrfs、ext4、ocfs2、およびxfsファイルシステムでサポートされています。

シーケンシャルですか?システムは最初にブロックを順番に割り当てようとします。できない場合、警告は表示されません。


タイプ「ef53」とは何ですか。私のファイルでも見ました。しかし、私のFSタイプはext4です。
hudac

2
EF53は、ext2、ext3、ext4の「SUPER_MAGIC」番号です。すべてのファイルシステムのすべてのマジックナンバーについては、カーネルソースの「include / uapi / linux / magic.h」を参照してください。
Vouze

Debianでは、filefragに隠されてい/usr/sbinます。しかし、それは普通のユーザー(少なくともext4で)には機能するようです。strace警告の欠如が障害となる場合、断片化をどのように測定するかを確認することは、その操作にとって有益な場合があります。
トビーSpeight

6

スパースファイルについて言及しましたが、他の回答では言及していません。

ほとんどのファイルはスパースではありません。ファイルを作成する最も一般的な方法は、最初から最後まですべてを一度に書き込むことです。穴はありません。

ただし、「位置1,000,000,000,000に移動してそこにバイトを書き込む」と言うことは許可されています。これにより、1バイトの大きなサイズのファイルが作成されますが、実際には(おそらく)ディスク上の4kのみを使用します。これはスパースファイルです。

同じファイルに対してこれを何度も行うことができ、少量のデータを広大な空虚に散らばらせます。

これは便利ですが、2つの欠点があります。

1つ目は、ファイルが断片化されることです。これが心配です。

2番目は、すべてのプログラムがこれらのファイルを適切に処理するわけではないということです。たとえば、一部のバックアップソフトウェアは、空をバックアップしようとするため、必要以上に大きく、バックアップメディアには大きすぎるバックアップを作成しようとします。


ただし、非スパースファイルであっても、ディスク上で連続していないことがよくあります。
バーマー

2

ファイルの連続性を何らかの方法で制御できますか?10GBのファイルを割り当てたいです。私はそれをディスク上でシーケンシャルにし、異なるオフセット間で分割しないようにします。

これを実現するには、少なくともいくつかの方法があります。

  1. 多数のスペアスペースを持つファイルシステムを使用し、スペースを事前に割り当てます(たとえば、アプリケーション固有のデータ終了マーカーを使用し、ファイルサイズが10GBに達するまでランダムデータを追加します)。これは、断片化されていないデータになるという保証はありません。

  2. ext4などの代わりにraw(未調理)ファイルシステムを使用します。DBMSはパフォーマンス上の理由からこれを行うことがあります。トレードオフは、必要に応じて独自のキャッシュ/ジャーナリング/リカバリなどを行う必要があることです。

これを行うことで多くの利益が得られるインスタンスは比較的まれです。まず、パフォーマンスを最適化するために他の場所を調べます。


こちらもご覧ください

通常、データベース管理システムはファイルシステムをバイパスしますか?


-1

これが1回限りであり、ファイルが元々どのように保存されているかが重要ではない場合、結果だけが重要です。ファイルを通常どおり保存し、オペレーティングシステムのデフラグツールを実行できます。次に、ファイルが1つのピースになっているかどうかをこの回答で確認し、そうでない場合は繰り返します。これは、コマンドや外部プログラムを使用せずに行う最も簡単な方法ですが、ディスク全体を最適化するため、最速の方法ではありません。


1
「デフラグツールを実行しますか?」そのようなプログラムはありますか?で検索したときに見つかった唯一のものaptitude search ~ddefragddrescueviewnidsTCPセグメント再アセンブリライブラリでした。プログラムが何と呼ばれているのか、どの引数を渡す必要があるのか​​を言わなければ、あなたの答えはあまり役に立ちません。
トビースパイト

1
@TobySpeight-はい、デフラグツールがあります。e4defrag。
レイブリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.