Bagaimana saya bisa memperlambat rsync?

35

Saya mencoba menyalin isi dari thumb drive USB yang gagal. Jika saya membaca data terlalu cepat, chip pengontrol drive terlalu panas dan drive hilang dari sistem. Ketika itu terjadi, saya perlu mencabut drive, tunggu sebentar atau lebih agar drive menjadi dingin, pasang kembali, dan mulai lagi menyalin.

Saya sudah punya cadangan lama dari isi drive, jadi cara yang jelas untuk mendapatkan sisa data adalah dengan menggunakan rsyncuntuk membuat cadangan up to date, tetapi ini berjalan ke keseluruhan "baca terlalu cepat, drive hilang" , dan saya harus memulai dari awal "masalah. Apakah ada cara untuk mengatakan rsynchanya membaca X megabita data per menit? Atau, apakah mungkin untuk mengatakannya untuk menunda pengoperasian ketika drive hilang, dan melanjutkan ketika dicolokkan kembali?

Menandai
sumber
24
Pernahkah Anda berpikir tentang mendinginkan drive?
AEonAX
3
Seberapa penuh drive? Jika drive lebih dari 50% penuh, mungkin lebih baik untuk hanya mirror drive yang gagal terlebih dahulu dan kemudian hanya mulai berurusan dengan hal-hal yang lebih rumit di cermin.
kasperd
1
@ AEonAX: Sementara ide keren (sic!), Saya tidak akan merekomendasikan ini: Anda meletakkan tekanan termal tambahan pada perangkat, dan mungkin gagal total.
Piskvor

Jawaban:

46

Tidak seperti pengalaman DopeGhoti, --bwlimitflag tidak membatasi transfer data, dengan rsync saya (v3.1.2).

uji:

$ dd if=/dev/urandom bs=1M count=10 of=data
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0871822 s, 120 MB/s

$ du -h data
10M     data

$ time rsync -q data fast
0.065 seconds

$ time rsync -q --bwlimit=1M data slow
10.004 seconds

(catatan: timeoutput saya terlihat berbeda dengan sebagian besar timepermintaan ( zshfitur), waktu itu tidak diedit oleh saya)

Lain, mungkin sesuatu di sepanjang baris dari ganda -execdi find. Saya percaya itu rsync -Rharus membuat & menyalin folder induk, tetapi jika tidak, maka cp --parentsseharusnya.

$ find /failing/usb -exec rsync -R {} /somewhere/safe/ \; -exec sleep 1 \;

Catatan : lihat juga ddrescue , mungkin benar apa yang Anda cari :)

anak aprikot
sumber
1
Ya. DG mungkin bingung dengan kata "bandwidth" - tetapi itu berlaku untuk saluran pembawa data apa pun, tidak hanya jaringan. Halaman manual secara khusus mengatakan --bwlimit=KBPS limit I/O bandwidth; KBytes per second:, tidak menyebutkan jaringan. Dengan santai menelusuri kode, ini membatasi kecepatan baca , terlepas dari tujuan. Plus, anekdot: Saya telah menggunakan opsi ini selama bertahun - tahun sekarang untuk membatasi kecepatan tulis lokal-ke-lokal. linux.die.net/man/1/rsync
Piskvor
1
Oke, pada tampilan kedua, itu sebenarnya menghitung jumlah byte yang ditulis dan tidur untuk waktu yang dihitung. io.c, baris 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);Bagaimanapun, ini mungkin akan berfungsi seperti yang dimaksudkan, membaca dalam ledakan singkat dan tidur di antara keduanya. Saya akan merekomendasikan memulai dengan nilai rendah dan hati-hati meningkat, atau biarkan transfer lambat berjalan semalam.
Piskvor
25

Sedikit solusi MacGyver di masa lalu tapi saya telah sukses dengan itu:
Pasang hub USB 1 lama antara stik dan komputer. Tidak mungkin sih itu akan menyalin cepat seperti itu :-)

Kemungkinan lain: Jika Anda memiliki stick lain yang tersedia, letakkan di port USB lain yang terhubung ke root-hub yang sama (sehingga berbagi bandwidth dengan stick masalah Anda).
Sekarang mulailah operasi tulis besar ke stick tambahan sehingga kedua stick bersaing untuk bandwidth. Untuk kontrol lebih lanjut, Anda dapat menggunakan ionice untuk menurunkan prioritas pada tongkat masalah lebih jauh.

Tonny
sumber
1
Saya yakin harus ada cara untuk membuat port berfungsi sebagai USB 1.1 melalui solusi perangkat lunak, mungkin dengan memberikan opsi ke modul kernel USB.
André Borie
@ AndréBorie: Ada - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , tetapi karena ada throttle yang efektif di SW, ini adalah solusi brute-force.
Piskvor
@Piskvor itu menegosiasikan kecepatan transfer yang lebih rendah dengan perangkat, sama seperti menggunakan hub USB 1. Saya tidak melihat "kekuatan kasar" tentang hal itu.
André Borie
Oke, pilihan kata yang buruk, saya akui. Tetapi perangkat konfigurasi ulang IMHO akan memerlukan hak istimewa khusus (root atau setidaknya% adm), sedangkan mengendalikan kecepatan baca per proses akan lebih mudah. (Plus, ada perangkat yang gagal bekerja di luar USB 2.0 sama sekali - melanggar spesifikasi)
Piskvor
13

Anda dapat menggunakan rsync --bwlimit=RATEuntuk membatasi kecepatan transfer file yang, berdasarkan komentar di bawah ini, sebenarnya secara khusus tampaknya berfungsi dengan membatasi kecepatan baca data, yang persis seperti yang Anda cari.

DopeGhoti
sumber
6
ionice? linux.die.net/man/1/ionice
steve
3
ionice hanya memberikan prioritas, jika dua hal membaca maka, secara default mereka mendapat 50/50. ionice dapat menyesuaikan itu, tetapi jika hanya ada satu hal yang dibaca, maka itu akan mendapatkan 100%.
coteyr
@coteyr Anda benar dan itulah mengapa Anda harus menggabungkannya dengan proses memakan bandwidth 2 pada hub-root USB yang sama. Lihat jawaban saya.
Tonny
2
Untungnya, jawaban Anda salah: --bwlimitmenetapkan batas I / O, belum tentu batas jaringan . Diuji berkali-kali dalam berbagai skenario: opsi ini membuat rsync membatasi sendiri saat dibaca , terlepas dari tujuannya. (Menemukan ini dalam skenario yang sama, di mana cepat menulis ke perangkat lokal yang lambat membuat mereka gagal)
Piskvor
1
@piskvor - terima kasih untuk itu! Itulah yang saya sukai dari tempat ini; Saya terus belajar hal-hal baru (:
DopeGhoti
8

Lebih banyak solusi, selain untuk rsync --bwlimit=100, untuk 100KiB / s.

  1. Gunakan ddrescuedengan --max-read-rateopsi untuk salinan disk lengkap. Ini juga akan memungkinkan Anda untuk memulai kembali salinan disk lengkap yang tersisa setelah kesalahan.

    ddrescue --max-read-rate=100K /failing/usb output.img output.logfile
    

ddrescuejuga memiliki banyak opsi lain yang relevan dengan pemulihan data, lihat manual di sini .

  1. Gunakan pv("penampil pipa") dengan --rate-limitopsi, atau throttlealat untuk menilai pipa batas. pvjuga bisa menunjukkan kemajuan. Anda dapat membuat ini berfungsi untuk alat apa pun yang menggunakan pipa atau dapat menggunakan pipa:

    tar -cf - /failing/usb | throttle -K 100 | tar -C /your/outputfolder/ -xvf -
    

    atau

    tar -cf - /failing/usb | pv --rate-limit 100k | tar -C /your/outputfolder/  -xvf -
    

    Lihatlah halaman manual untuk lebih banyak pengaturan dan contoh. Untuk throttle, Anda mungkin ingin juga mencoba -wopsi, yang menentukan bagaimana kecepatan dihitung, lihat halaman throttle .

jmiserez
sumber
Nah, itu alat yang berguna, tidak tahu itu, terima kasih! pvhalaman manual bahkan memiliki lebih banyak contoh dari berbagai penggunaan.
Piskvor
Saya telah meraih pvberkali-kali sejak menemukan kembali di hari-hari saya yang bercanda. Kembali ketika tar menulis ke drive tape. :)
Dan Garthwaite