Saya memiliki 1000000 4-20 kb file dalam direktori. Saya perlu menyalin dir itu. Tapi sepertinya saya harus melakukan pencarian untuk setiap file sehingga ini membutuhkan waktu yang cukup lama.
Apakah ada cara di mana saya dapat mempercepat ini?
Saat ini saya berpikir bahwa jika saya bisa mendapatkan blok disk yang ditempati file-file ini, saya bisa mengurutkannya, menggabungkan blok yang dekat (mengingat bahwa membaca berurutan sering lebih cepat daripada mencari) dan membaca blok ini, sehingga mereka berada dalam RAM cache (saya punya 32 GB RAM) sebelum melakukan copy.
Tetapi agar bisa berfungsi, saya perlu cara untuk mengidentifikasi blok mana file tersebut berada.
Saya menggunakan EXT4 pada perangkat magnetik (yaitu bukan SSD).
Edit:
Ini seharusnya bekerja tetapi tidak:
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'
Saat mengujinya pada file besar itu tidak men-cache file.
Sunting2:
Inilah beberapa tolok ukur. Cache memerah ( echo 3 >/proc/sys/vm/drop_caches
) di antara setiap proses. Pengukuran dilakukan dengan 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
Jadi apa yang bisa kita pelajari dari itu?
Sepertinya mengurutkan berdasarkan inode adalah ide yang bagus. Tetapi tampaknya memaralelkan banyak cp
meningkatkan kinerja lebih jauh. Perlu ditekankan bahwa sumbernya foo/
adalah cakram magnetik, jadi ini menyerang mitos bahwa memparalelkan I / O ke satu poros tidak akan mempercepat I / O: Memparalelkan dengan jelas dan konsisten mempercepat penyalinan di sini.
cp -r /mnt/dir1 /mnt/dirdest
atau sesuatu seperti cp /mnt/dir1/* /mnt/dirdest
?