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.
sumber
cp -r /mnt/dir1 /mnt/dirdest
atau sesuatu seperticp /mnt/dir1/* /mnt/dirdest
?Jawaban:
Berasumsi bahwa
readdir
tidak diurutkan berdasarkan nomor inodeAnda dapat mencoba mempercepat penyalinan melalui penyalinan file dalam urutan inode.
Itu berarti menggunakan sesuatu seperti ini:
sumber
ls -U
tidak cukup karena tidak mengurutkan berdasarkan nomor inode ... dan mengapa saya harus mau-1
?-1
cukup cantumkan 'satu file per baris' - tidak membantu dengan baris baru dalam nama file. Untuk itu bisa Anda gunakanfind -print0/xargs -O
.mkdir tmp; cd tmp; touch foo"<RETURN>"bar; ls
mencetak 'foo? Bar'. Als -1
juga mencetak 'foo? Bar'. Als -1 | wc -l
mencetak '2'. Afind -ls
mencetak nama file sebagai './foo\nbar'. Sebuahcp -i
ls -1` x` gagal dengan 'cp: target 'x' bukan sebuah direktori'.-q
melakukan apa yang saya pikir-1
akan! Sekali lagi, permintaan maaf saya - belum lagi terima kasih.GNU
tar
- dalampax
tradisi - menangani hardlink sendiri.Dengan begitu Anda hanya memiliki dua
tar
proses dan Anda tidak perlu terus memohoncp
berulang kali.sumber
Pada nada yang mirip dengan jawaban @ maxschlepzig , Anda dapat menguraikan output
filefrag
untuk mengurutkan file dalam urutan fragmen pertama mereka muncul pada disk:MMV dengan
sed
skrip di atas , jadi pastikan untuk menguji secara menyeluruh.Jika tidak, apa pun yang Anda lakukan,
filefrag
(bagian darie2fsprogs
) akan jauh lebih cepat digunakan daripadahdparm
karena dapat mengambil banyak argumen file. Hanya overhead menjalankanhdparm
1.000.000 kali akan menambah banyak overhead.Juga mungkin tidak akan terlalu sulit untuk menulis
perl
skrip (atau program C),FIEMAP
ioctl
untuk setiap file, membuat array yang diurutkan dari blok yang harus disalin dan file milik dan kemudian untuk menyalin semuanya dalam urutan oleh membaca ukuran setiap blok dari file yang sesuai (hati-hati jangan sampai kehabisan file deskriptor).sumber
tar
untuk file-file mereka.qtar
sebagai sumber terbuka; sekarang di github.com/chlunde/qtar