Tôi vẫn chưa gặp một hệ thống tệp có mục đích chung trên Linux sẽ hy sinh thông lượng ghi khi có các tệp liền kề. Đó là, mọi đoạn hệ thống tệp nếu các phần được viết theo thứ tự không tuần tự, đặc biệt là với các tệp thưa thớt.
Cách dễ dàng: Chạy tệp qua máy khách torrent - tốt nhất là thứ gì đó không phân bổ trước tệp. BitTornado hoặc rtorrent phù hợp với hóa đơn này. (Cái trước có chế độ phân bổ cấu hình)
Cách khó: Chia tệp nguồn thành các phần có kích thước KB, xáo trộn chúng. Mở tệp đích. Đối với mỗi phần, tìm kiếm đến vị trí chính xác của nó và viết nó.
Đây là một kịch bản Perl thực hiện nó:
#!/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;
Bạn có thể kiểm tra phân mảnh bằng filefrag
lệnh, có trong gói e2fspross.
Đây là một ví dụ về những gì một torrent làm:
# 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
Đây là những gì tôi nhận được với tập lệnh của mình (trên 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
EDIT: Đừng bận tâm, rốt cuộc nó dường như không hoạt động tốt, ngoại trừ các tệp lớn (chắc chắn là một đoạn tệp 1,5 GB.)
Hệ thống VM có thể là bộ nhớ đệm và postpones / sắp xếp lại ghi quá nhỏ. Đây là lý do tại sao các máy khách torrent quản lý thành từng đoạn (vì chúng thường không tải xuống với tốc độ> 10MB / giây) nhưng tập lệnh của tôi thì không. Tôi nghĩ rằng nó có thể được điều chỉnh bằng cách hạ thấp ngưỡng vm. Xem/proc/sys/vm/dirty_*