Bagaimana saya bisa mengurangi penggunaan sumber daya saat menyalin file besar?

8

Saya perlu memindahkan file besar (tabel MySQL rusak ~ 40GB) ke server terpisah untuk memperbaikinya. (Ketika mencoba memperbaiki pada server produksi saya, ia dengan cepat membunuh server).

Untuk melakukan ini, saya ingin rsync file .frm, .MYI dan .MYD dari server produksi saya ke server cloud.

Saya menyalin file dari / var / lib / mysql / {database} / ke / home / {myuser} sehingga saya tidak perlu mengaktifkan akses root untuk perintah rsync dan 100% yakin file database tidak sedang digunakan (seharusnya tidak ditulis atau dibaca, tetapi jelas saya tidak ingin mematikan basis data produksi saya untuk memastikan).

File pertama yang saya coba salin sekitar 10GB. Saya mentransfer dari satu bagian dari server produksi saya ke yang lain, yaitu ke array disk yang sama.

Sayangnya perintah salin "cp filename newfilename" mengambil begitu banyak sumber daya sehingga server terhenti.

Bagaimana saya bisa menggunakan lebih sedikit sumber daya saat menyalin file ke direktori lain? (Tidak masalah berapa lama).

Dengan asumsi saya berhasil melakukan ini, penggunaan sumber daya apa yang bisa saya harapkan ketika rsyncing file ke cloud?

Adakah yang bisa menyarankan cara yang lebih baik untuk melakukan ini? Saya cepat kehabisan ruang disk sehingga perlu memperbaiki tabel ini dan diarsipkan SECEPATNYA.

Jon M
sumber

Jawaban:

5

Sudahkah Anda mencoba nice -n10awalan pada perintah?

10adalah nilai default. Kisaran beralih dari -20(prioritas tertinggi) ke 19(terendah).

Jonathan Ross
sumber
@ Jonathan Pemahaman saya adalah bahwa ini akan membatasi penggunaan CPU saja, bukan Disk I / O DAN RAM: linux.com/archive/feed/58638
Jon M
Ya tapi ini awal, dalam hal mengurangi salah satu hambatan - mungkin cukup untuk menghentikan mesin hang.
Jonathan Ross
Terima kasih @Jonathan Ross, sesuai dengan ini: linux.die.net/man/1/ionice "Program mewarisi pengaturan CPU yang bagus untuk prioritas io.", Jadi mungkin saja berhasil, tetapi saya sedang meneliti kombinasi "bagus" dan "ionice"
Jon M
Pemikiran yang bagus. Saya selalu memulai dengan nicekebiasaan kebanyakan. iotopjuga temanmu.
Jonathan Ross
3
Perintah terakhir yang saya jalankan adalah nice -n 20 ionice -c 3 cp /var/lib/mysql/{database}/{table}.MYI /home/{USER}/Ini memang menambah beban pada server saya sedikit melambat, tetapi situs web tersedia selama durasi transfer
Jon M
10

Dua pilihan selain pembatasan bandwidth rsync:

  • ionice -c 3 cp foo bar
  • buffer -u 150 -m 16m -s 100m -p 75 -i foo -o bar

ioniceakan berinteraksi dengan penjadwal I / O. bufferadalah buffer bundar yang dimaksudkan untuk membantu perangkat karakter agar lebih efisien, tetapi -u 150kehentian sementara 150 mikrodetik antara penulisan yang, menurut manual, mungkin cukup untuk memberikan ruang disk untuk bernafas.

Keduanya ionicedan buffertersedia dalam persediaan Ubuntu. iotopberguna jika Anda memiliki CONFIG_TASK_DELAY_ACCT dikonfigurasi di kernel Anda, tetapi kotak Ubuntu saya tidak yang sangat membatasi kegunaan perintah. Saya sudah tahu perintah mana yang menenggelamkan hard drive saya, saya hanya ingin memberinya ruang bernapas.

Selain itu, ketika salinan sedang berlangsung, lihat output iostat -x 1(biasanya dalam paket sysstat) dan lihat bahwa% sibuk bidang untuk perangkat Anda adalah 90% atau kurang selama salin. Jika 99-100%, maka Anda kelaparan proses lain untuk I / O.

zerolagtime
sumber
Terima kasih atas tanggapan Anda @zerolagtime, saya akhirnya menggunakan perintah ionice yang serupa tetapi telah menandai jawaban sebelumnya sebagai benar
Jon M
ionice -c 3 -p $pidUnisonbekerja serempak pada HDD eksternal, thx !!
Aquarius Power
6

gunakan rsync dengan --bwlimit = KBPS switch (batas I / O bandwidth; KBytes per detik). bermain-main dengan file yang lebih kecil dan mencoba untuk menemukan campuran yang optimal antara kecepatan transfer dan penggunaan sistem. Monitor di shell kedua dengan "vmstat 1"

shalalandy
sumber
Saya pasti akan mencoba ini untuk membatasi sumber daya dari perintah RSYNC, tetapi saat ini saya hanya mencoba untuk menyalin file ke lokasi lain di server saya melalui perintah "cp".
Jon M
Anda juga dapat menggunakan rsync untuk menyalin file lokal dan membatasi bandwidth dengan saklar --bwlimit.
shakalandy
rsyncakan menyalin file secara lokal. Pikirkan rsync --bwlimit=28000 foo.frm /bar/foo.frmdan tontonlah iostat. Saya tidak yakin mengapa vmstatakan memberi tahu Anda jika Anda menjenuhkan drive. Cari% sibuk di iostat.
zerolagtime
baik, vmstat menunjukkan IO Anda pada perangkat blok. Selain itu, Anda dapat melihat hal lain yang penting untuk penggunaan mesin (cpu, proses pengguna, cpu tunggu, swap, ...)
shakalandy
0

Salah satu alternatifnya adalah:

scp -l ${KBPS} ${src} ${dest}

Tapi saya rasa itu tidak akan berhasil jika $ {src} adalah file yang sedang tumbuh ... dapatkah Anda menyarankan cara untuk menyalin dan menunggu sumber ditutup ...

rzr
sumber