Memindahkan 2TB (10 mil file + dir), apa hambatan saya?

21

Latar Belakang

Aku berlari keluar dari ruang pada /home/datadan kebutuhan untuk mentransfer /home/data/repoke /home/data2.

/home/data/repoberisi 1M dir, yang masing-masing berisi 11 dir dan 10 file. Totalnya 2TB.

/home/dataaktif pada ext3 dengan dir_index diaktifkan. /home/data2ada di ext4. Menjalankan CentOS 6.4.

Saya menganggap pendekatan ini lambat karena fakta bahwa repo/1 juta dir langsung di bawahnya.


Percobaan 1: mvcepat tetapi terganggu

Saya bisa melakukannya jika ini selesai:

/home/data> mv repo ../data2

Tapi itu terputus setelah 1.5TB ditransfer. Itu menulis sekitar 1GB / menit.

Percobaan 2: rsyncmerangkak setelah 8 jam membuat daftar file

/home/data> rsync --ignore-existing -rv repo ../data2

Butuh beberapa jam untuk membangun 'daftar file tambahan' dan kemudian transfer pada 100MB / menit.

Saya membatalkannya untuk mencoba pendekatan yang lebih cepat.

Percobaan 3a: mvmengeluh

Mengujinya pada subdirektori:

/home/data/repo> mv -f foobar ../../data2/repo/
mv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory

Saya tidak yakin apa ini kesalahan tentang, tapi mungkin cpbisa menyelamatkan saya ..

Percobaan 3b: cptidak berhasil setelah 8 jam

/home/data> cp -nr repo ../data2

Bunyinya disk selama 8 jam dan saya memutuskan untuk membatalkannya dan kembali ke rsync.

Percobaan 4: rsyncmerangkak setelah 8 jam membuat daftar file

/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2

Saya dulu --remove-source-filesberpikir mungkin akan lebih cepat jika saya mulai membersihkan sekarang.

Dibutuhkan setidaknya 6 jam untuk membangun daftar file kemudian transfer pada 100-200MB / menit.

Tetapi server terbebani semalaman dan koneksi saya ditutup.

Percobaan 5: HANYA ADA 300GB KIRI UNTUK PINDAHKAN MENGAPA INI SANGAT BERLAKU

/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2

Terganggu lagi. The -Whampir tampaknya membuat "mengirimkan daftar file tambahan" lebih cepat, yang pemahaman saya tidak harus masuk akal. Bagaimanapun juga, transfernya sangat lambat dan saya menyerah untuk yang ini.

Percobaan 6: tar

/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)

Pada dasarnya berusaha untuk menyalin ulang semuanya tetapi mengabaikan file yang ada. Itu harus mengarungi 1,7TB file yang ada tetapi setidaknya itu membaca di 1.2GB / menit.

Sejauh ini, ini adalah satu-satunya perintah yang memberikan kepuasan instan.

Pembaruan: terputus lagi, entah bagaimana, bahkan dengan nohup ..

Percobaan 7: harakiri

Masih memperdebatkan yang ini

Percobaan 8: dituliskan 'bergabung' dengan mv

Dir tujuan memiliki sekitar 120rb kosong, jadi saya berlari

/home/data2/repo> find . -type d -empty -exec rmdir {} \;

Skrip Ruby:

SRC  = "/home/data/repo"
DEST = "/home/data2/repo"

`ls #{SRC}  --color=never > lst1.tmp`
`ls #{DEST} --color=never > lst2.tmp`
`diff lst1.tmp lst2.tmp | grep '<' > /home/data/missing.tmp`

t = `cat /home/data/missing.tmp | wc -l`.to_i
puts "Todo: #{t}"

# Manually `mv` each missing directory
File.open('missing.tmp').each do |line|
  dir = line.strip.gsub('< ', '')
  puts `mv #{SRC}/#{dir} #{DEST}/`
end

DIBUAT

Tim
sumber
Anda benar, ia harus menemukan dan menghitung setiap direktori dan 1 juta dir akan menyakitkan.
cybernard
2
Lihatlah sisi baiknya ... jika itu adalah Windows, Anda bahkan tidak dapat memiliki jutaan subdirektori dan masih memiliki OS yang berfungsi. :)
Jack
1
@Tim, kenapa kamu tidak mvkembali saja ? Secara teori, mvhanya akan menghapus file sumber jika file tujuan telah sepenuhnya disalin sehingga harus bekerja dengan baik. Juga, apakah Anda memiliki akses fisik ke mesin atau apakah ini dilakukan melalui sshkoneksi?
terdon
5
Tidak, tidak bisa. mvtidak memaafkan, jika Anda terus terputus Anda bisa kehilangan data dan bahkan tidak mengetahuinya. Seperti yang Anda katakan Anda lakukan ini ssh, saya sangat merekomendasikan menggunakan screendan melepaskan. Aktifkan pencatatan dan lacak seperti itu. Jika Anda menggunakan verbose, itu hanya akan memakan waktu lebih lama. Coba jugaiotop
justbrowsing
2
@justbrowsing - Panggilan baik aktif screen. Saya bertanya-tanya tentang verbose tapi saya kira sudah terlambat untuk memulai kembali tarsekarang. Dan iotoptelah menjadi utilitas favorit saya selama beberapa hari terakhir :)
Tim

Jawaban:

6

Pernah mendengar membagi tugas besar menjadi tugas yang lebih kecil?

/ home / data / repo berisi 1M dirs, yang masing-masing berisi 11 dirs dan 10 file. Totalnya 2TB.

rsync -a /source/1/ /destination/1/
rsync -a /source/2/ /destination/2/
rsync -a /source/3/ /destination/3/
rsync -a /source/4/ /destination/4/
rsync -a /source/5/ /destination/5/
rsync -a /source/6/ /destination/6/
rsync -a /source/7/ /destination/7/
rsync -a /source/8/ /destination/8/
rsync -a /source/9/ /destination/9/
rsync -a /source/10/ /destination/10/
rsync -a /source/11/ /destination/11/

(...)

Waktu istirahat kopi.

Ярослав Рахматуллин
sumber
1
Keuntungan yang saya tekankan secara samar adalah bahwa Anda melacak kemajuan dalam bagian-bagian kecil secara manual sehingga melanjutkan tugas akan memakan waktu lebih sedikit jika beberapa bagian dibatalkan (karena Anda tahu langkah-langkah mana yang berhasil diselesaikan).
Ярослав Рахматуллин
Ini pada dasarnya adalah apa yang akhirnya saya lakukan pada akhirnya, kecuali dengan mv. Sayangnya tidak ada alat pertemuan mvdan rsyncsetengah jalan.
Tim
4

Inilah yang terjadi:

  • Awalnya rsync akan membangun daftar file.
  • Membangun daftar ini sangat lambat, karena penyortiran awal daftar file.
  • Ini dapat dihindari dengan menggunakan ls -f -1 dan menggabungkannya dengan xargs untuk membangun set file yang akan digunakan rsync, atau mengarahkan output ke file dengan daftar file.
  • Melewati daftar ini ke rsync alih-alih folder, akan membuat rsync mulai bekerja segera.
  • Trik ls -f -1 di atas folder dengan jutaan file ini dijelaskan dengan sempurna dalam artikel ini: http://unixetc.co.uk/2012/05/20/large-directory-causes-ls-to-hang/
maki
sumber
1
Bisakah Anda memberikan contoh cara menggunakan ls dengan rsync? Saya memiliki situasi yang serupa tetapi tidak identik. Pada mesin AI ada rsyncd berjalan dan pohon direktori besar saya ingin mentransfer ke mesin B (sebenarnya, 90% dari direktori sudah di B). Masalahnya adalah saya harus melakukan ini menggunakan koneksi seluler yang tidak stabil yang sering turun. Menghabiskan satu jam untuk membangun daftar file setiap kali saya memulai kembali cukup tidak efisien. Juga, B berada di belakang NAT yang tidak saya kendalikan sehingga sulit untuk menghubungkan A -> B, sementara B -> A mudah.
db
Setuju dengan @db. Jika sebuah contoh dapat diberikan, itu akan membuat jawaban ini jauh lebih bermanfaat.
redfox05
1

Bahkan jika rsync lambat (mengapa lambat? Mungkin -z akan membantu) sepertinya Anda sudah banyak memindahkannya, jadi Anda bisa terus mencoba:

Jika Anda menggunakan --remove-source-files, Anda dapat menindaklanjutinya dengan menghapus direktori kosong. --remove-source-file akan menghapus semua file, tetapi akan meninggalkan direktori di sana.

Pastikan Anda JANGAN menggunakan --remove-source-file dengan --delete untuk melakukan banyak pass.

Juga untuk peningkatan kecepatan, Anda dapat menggunakan --inplace

Jika Anda dikeluarkan karena Anda mencoba melakukan ini dari jarak jauh di server, silakan jalankan ini di dalam sesi 'layar'. Setidaknya dengan cara itu Anda bisa menjalankannya.

Angelo
sumber