意図的にファイルを断片化する方法

意図的にファイルを断片化する方法

いくつかのツールのパフォーマンスを評価するために既存のファイルを分割する方法を探しています。 NTFSファイルシステムと呼ばれるソリューションを見つけました。私の断片化器この記事で説明されているようにワイヤー。しかし、ext2/3/4については何も見つかりません。独自のファイル断片化ツールを開発することができるようですが、時間の制約があるため、より速い解決策を見つけたいと思います。次のツールが見つかりました。HJ-スプリットファイルをより小さな部分に分割しますが、これはファイルの断片化をシミュレートする疑いがあります。

彼らは私の問題を解決できますか?

答え1

欲しいなら確実にする破片だがそうではない防ぐこれは(したがって何が起こるのかを部分的にのみ制御することができます)、断片の詳細には気にしません。

n複数のフラグメントを含むチャンクファイルを作成するには、次の手順を実行します。

  1. 同期書き込みでファイルを開き、m<n ブロックを書き込みます。
  2. 別のファイルを開きます。ディスク上で最大n - mブロックが利用可能になるまで追加します。薄くする間違いを犯さないでください!
  3. 残りのn - mブロックを最初のファイルに書き込みます。
  4. 2番目のファイルを閉じますunlink

より多くのファイルをインターリーブして、より多くのセグメントを分割できます。

これは、ファイルシステムがそのようなアドバイザーに使用できると仮定します。つまり、マルチユーザーや業務上重要な環境ではそうではありません。また、ファイルシステムに予約済みブロックがない、予約済みブロックがUID用に予約されている、またはユーザーがrootであると想定します。

いいえ直接断片化を保証する方法は、Unixシステムがファイルシステム抽象化を使用するため、元のファイルシステムと通信しないためです。

また、ファイルシステムレベルの断片化により、下位レベルで何が起こっているのかわからないことを確認してください。 LVM、ソフトウェアおよびハードウェアRAID、ハードウェアレベルセクタの再マッピング、およびその他の抽象化層は、期待値(および測定値)に大きな影響を与える可能性があります。

答え2

私は、連続ファイルの書き込みスループットを犠牲にするLinuxの汎用ファイルシステムをまだ見たことがありません。言い換えれば、特にスパースファイルの場合、ファイルが非順次順序で書き込まれると、すべてのファイルシステムが断片化されます。

簡単な方法:急流クライアントを介してファイルを実行することです。ファイルを事前に割り当てないことをお勧めします。 BitTornadoまたはrtorrentはこの要件に適しています。 (電子には設定可能な割り当てモードがあります)

難しい方法は、ソースファイルを数キロバイトのサイズの部分に分割してから混ぜることです。ターゲットファイルを開きます。記事ごとに正しい場所を見つけて書き留めてください。

これはこれを行うPerlスクリプトです。

#!/usr/bin/perl

use List::Util qw/shuffle/;
use IO::Handle;

use constant BLOCK_SIZE => 4096;

my ($src, $dst) = @ARGV;

my $size = (stat($src))[7];
my @blocks = shuffle(0 .. ($size / BLOCK_SIZE));

my ($srcfh, $dstfh);
open $srcfh, "<", $src or die "cannot open $src: $!";
open $dstfh, ">", $dst or die "cannot open $dst: $!";
truncate $dstfh, $size; # undefined behaviour

my $buf;
for my $blockno (@blocks) {
  seek $_, $blockno * BLOCK_SIZE, 0 for ($srcfh, $dstfh);
  read $srcfh, $buf, BLOCK_SIZE;
  print $dstfh $buf;
  $dstfh->flush;
}

close $dstfh;
close $srcfh;

filefrage2fsprogsパッケージに含まれているコマンドを使用して、断片化を確認できます。

トレントができることの例は次のとおりです。

# ls -sh amd64memstick-5.1.2.fs.gz
239M amd64memstick-5.1.2.fs.gz
# filefrag amd64memstick-5.1.2.fs.gz
amd64memstick-5.1.2.fs.gz: 585 extents found

これは私のスクリプト(ext3の)が得るものです:

$ ls -sh source.tar
42M source.tar
$ perl fragment.pl source.tar fragmented.tar
$ md5sum fragmented.tar source.tar
f77fdd7ab526ede434f416f9787fa9b3  fragmented.tar
f77fdd7ab526ede434f416f9787fa9b3  source.tar
# filefrag fragmented.tar
fragmented.tar: 395 extents found

編集する:心配しないでください。大きなファイル(確かに1.5GBのファイルの一部)を除いて、まったく機能しないようです。

VMシステムが小さすぎる書き込みをキャッシュして延期/再注文することがあります。これがTorrentクライアントが断片化される理由です(通常、10 MB / s以上の速度でダウンロードしないため)。しかし、私のスクリプトはそうではありません。 VMのしきい値を下げれば調整できると思います。バラより/proc/sys/vm/dirty_*

答え3

Linux ext4で断片化されたファイルを生成する必要がある状況を偶然発見しました。電話してしまいました。エラー位置、指定されたファイルに穴を開けるために使用できます。これにより、使用可能なディスク領域に穴があり、断片化が発生します。バラよりここフラグメントファイル(および添付のストーリー)を生成するためのスクリプト。これにより、数千のスライス(または範囲)を簡単に作成できます。

関連情報