GNU/Linux >> Linux の 問題 >  >> Linux

1000000個の小さなファイルのコピーを高速化しますか?

dirに1000000の4〜20 kbのファイルがあります(次のような同様のファイルを生成できます:seq 10000 | gzip > a; seq 1000000 | parallel --bar 'head -c{=$_=int(rand()*16)+4=}k a > {}'

。そのディレクトリをコピーする必要があります。しかし、ファイルごとにシークを実行する必要があるようです。これにはかなりの時間がかかります。

これをスピードアップする方法はありますか?

私は現在、これらのファイルが占めるディスクブロックを取得できれば、それらを並べ替え、近くにあったブロックをマージして(シーケンシャル読み取りの方がシークよりも高速であることが多い場合)、これらのブロックを読み取ってRAMに格納できると考えています。コピーを実行する前にキャッシュ(32 GBのRAMがあります)。

しかし、それが機能するためには、ファイルがオンになっているブロックを識別する方法が必要です。

磁気デバイス(SSDではない)でEXT4を使用しています。

編集:

これは機能するはずですが、機能しません:

ls |
parallel -IOO --pipe "sudo parallel -j100 hdparm --fibmap {}'|tail -n +5'" |
sort -nk 2 | 
perl -ane 'if($u+10000 < $F[1]) { print "$l ",($u-$l),"n"; $l=$F[1] } $u=$F[2]' |
sudo parallel --colsep ' ' dd if=/dev/sda1 skip={1} bs=512 count={2} '| cat >/dev/null'

大きなファイルでテストする場合、ファイルはキャッシュされません。

Edit2:

ここにいくつかのベンチマークがあります。キャッシュがフラッシュされました(echo 3 >/proc/sys/vm/drop_caches )各実行間。 iostats -dkx 5で行われた測定 。

rsync -Hav foo/ bar/: 1800 KB/s
cp -a foo/ bar/: 3600 KB/s
cat sort-by-inode | parallel -j1 -X cp foo/{} bar/: 5000 KB/s
cat sort-by-inode | shuf | parallel -j1 -X cp foo/{} bar/: 3000 KB/s
cat sort-by-inode | shuf | parallel -j10 -X cp foo/{} bar/: 7000 KB/s
cat sort-by-inode | parallel -j10 -X cp foo/{} bar/: 8000 KB/s
cat sort-by-inode | parallel -j100 -X cp foo/{} bar/: 9000 KB/s
cat sort-by-inode | parallel -j500 -X cp foo/{} bar/: 10000 KB/s

では、そこから何を学ぶことができますか?

iノードで並べ替えるのは良い考えのようです。しかし、複数のcpを並列化しているようです パフォーマンスがさらに向上します。ソースfoo/であることを強調する価値があります は磁気ディスクであるため、これはI/Oを単一のスピンドルに並列化してもI/Oを高速化しないという神話を攻撃します。並列化は明確かつ一貫してここでのコピーを高速化します。

承認された回答:

それを仮定して

  • readdirによって返されるエントリ iノード番号でソートされていません
  • iノード順にファイルを読み取ると、シーク操作の数が減ります
  • ほとんどのファイルのコンテンツは、最初の8k割り当て(ext4最適化)に含まれているため、シーク操作も少なくなります。
関連:Oracle DB Standard Editionでログメンバーと制御ファイルをやり直しますか?

iノード順にファイルをコピーすることで、コピーの高速化を試みることができます。

つまり、次のようなものを使用することを意味します:

$ cd /mnt/src
$ ls -U -i | sort -k1,1 -n | cut -d' ' -f2- > ~/clist
$ xargs cp -t /mnt2/dst < ~/clist

Linux
  1. Ssh –保護されたファイルをサーバー間で1行にコピーしますか?

  2. .o ファイルと .a ファイル

  3. wc gzipファイル?

  1. Linuxで特定のサイズのファイルをコピーから除外する方法

  2. Linux –ブロックデバイスにファイルをコピーした後のデータ回復?

  3. 隠しファイルを再帰的にコピーする - Linux

  1. コマンドラインからLinuxサーバーを移行するときにrsyncを高速化する

  2. Linux で変更日に基づいてファイルをコピーする

  3. scp を使用したファイルのコピー:接続がタイムアウトしました