Bir dizin 1000000 4-20 kb dosyaları var. O dizini kopyalamam gerek. Ama her dosya için bir arama yapmak zorunda gibi görünüyor bu yüzden bu biraz zaman alır.
Bunu hızlandırabileceğim bir yol var mı?
Şu anda bu dosyaların kapladığı disk bloklarını alabilirsem, bunları sıralayabilir, yakın olan blokları birleştirebilirim (sıralı okumanın genellikle aramaktan daha hızlı olduğu göz önüne alındığında) ve bu blokları okuyabilirim, böylece RAM'daydılar kopyalamadan önce önbellek (32 GB RAM'im var).
Ancak bunun çalışması için dosyaların hangi bloklarda olduğunu tanımlamanın bir yoluna ihtiyacım var.
Manyetik bir cihazda EXT4 kullanıyorum (yani SSD değil).
Düzenle:
Bu işe yaramalı ama işe yaramıyor:
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'
Büyük bir dosyada test ederken dosyayı önbelleğe almaz.
Edit2:
İşte bazı kriterler. echo 3 >/proc/sys/vm/drop_caches
Her çalışma arasında önbellek temizlendi ( ). Ölçümler ile yapılır 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
Peki bundan ne öğrenebiliriz?
Inode göre sıralama iyi bir fikir gibi görünüyor. Ancak, çoklu destek cp
performansını daha da paralel hale getirmek gibi görünüyor . Kaynağın foo/
manyetik bir disk olduğunu vurgulamakta fayda var.
cp -r /mnt/dir1 /mnt/dirdest
şey ya da benzeri bir şey cp /mnt/dir1/* /mnt/dirdest
?