Mencegah tar menggunakan terlalu banyak CPU dan disk (laptop lama rusak jika 100%)

15

Saya ingin mencadangkan 1 terabyte data ke disk eksternal.

Saya menggunakan perintah ini: tar cf /media/MYDISK/backup.tar mydata

MASALAH: Laptop saya yang buruk macet dan macet setiap kali saya menggunakan 100% CPU atau 100% disk (jika Anda ingin bereaksi tentang hal ini, silakan tulis di sini ) . Jadi saya ingin tetap di sekitar 50% CPU dan 50% disk maks.

Pertanyaan saya: Bagaimana cara menekan CPU dan disk dengan tarperintah?

Rsync memiliki opsi --bwlimit, tapi saya ingin arsip karena 1) ada banyak file kecil 2) Saya lebih suka mengelola satu file daripada pohon. Itu sebabnya saya gunakan tar.

Nicolas Raoul
sumber
1
Apa ide yang cerdik untuk membuat tarball besar: DDD Bagaimana dengan perintah 'bagus'?
jirib
1
@JiriXichtkniha: nicetidak akan mencegah penggunaan CPU 100%
Nicolas Raoul

Jawaban:

22

Anda dapat menggunakan pvuntuk membatasi bandwidth pipa. Karena case use Anda sangat terikat IO, overhead CPU tambahan yang melalui pipa tidak akan terlihat, dan Anda tidak perlu melakukan pelambatan CPU.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Bahkan lebih baik dari yang kuharapkan! Saya membatasi IO hingga 5mb / detik dan CPU tetap pada 13% (tampaknya masuk akal dengan enkripsi terjadi).
Nicolas Raoul
1
Sangat bagus!. Mungkin juga merekomendasikan flag -q untuk menghilangkan progress bar.
szabgab
perintah yang luar biasa !!! Jika Anda tidak memilikinya di Debian / Ubuntu Anda, jalankan saja apt-get install pv. Saya sarankan menambahkan `-b` setelah -L 1m: dengan cara ini penghitung byte tambahan akan dicetak, diperbarui setiap detik. Dengan cara ini Anda tahu berapa banyak byte yang telah ditulis sampai sekarang
lucaferrario
Juga, harap dicatat bahwa jika Anda mengompresi output (menggunakan tar czfbukannya tar cf) batas mengacu pada output terkompresi (jadi dengan -L 1mdisk Anda tulis tidak akan melebihi 1 MB / s .... tetapi pembacaan disk Anda mungkin antara 1 MB / s dan 5 MB / s, tergantung pada jenis konten Anda)
lucaferrario
Trik hebat! Saat mengompresi dengan xz, saya pipa melalui pv terlebih dahulu kemudian melalui xz.
Jean-Bernard Jansen
8

Anda dapat mencoba alat cpulimit yang membatasi persentase CPU. Ini bukan alat standar, jadi Anda harus menginstalnya. Berikut ini kutipan singkat README:

"Cpulimit adalah alat yang mencoba membatasi penggunaan CPU dari suatu proses (dinyatakan dalam persentase, bukan dalam waktu CPU). [...] Kontrol jumlah cpu yang digunakan dilakukan dengan mengirim sinyal SIGSTOP dan SIGCONT POSIX ke proses. Semua proses anak-anak dan untaian proses yang ditentukan akan berbagi persentase CPU yang sama. "

Maka saya akan merekomendasikan ionice untuk membatasi penggunaan IO, meskipun itu adalah akses konkuren yang akan dibatasi, bukan throughput maksimum ... Tidak pernah-kurang di sini adalah bagaimana menggunakannya:

ionice -c 3 <your_command>
Huygens
sumber
Bagus! Sepertinya cpulimit adalah apa yang saya cari.
Nicolas Raoul
2

Anda tidak dapat benar-benar mendapatkan proses untuk menjalankan lebih sedikit . Anda dapat menggunakannya niceuntuk memberikan prioritas yang lebih rendah, tetapi itu terkait dengan proses lain. Cara untuk menjalankan pendingin CPU saat proses berjalan adalah menggunakan usleep(3)untuk memaksa proses keluar dari kondisi run sejumlah waktu tertentu, tetapi itu akan melibatkan menambal taratau menggunakan LD_PRELOADmekanisme untuk menyediakan fungsi tambalan yang tarmenggunakan banyak (misalnya fopen(3)).

Saya menduga solusi terbaik Anda adalah perangkat keras yang Anda sebutkan di SuperUser: menjaga laptop tetap dingin dan / atau menurunkan jam CPU.

Pemecahan masalah yang menjengkelkan tetapi mungkin dapat dilakukan (kludge, benar-benar) bekerja pada level 'makroskopik'. Daripada tarmenjalankan 100ms setiap 200ms, Anda bisa membuatnya berlari satu detik dari setiap dua. Catatan: ini adalah kludge yang mengerikan dan mengerikan. Tapi hei, itu mungkin berhasil!

tar cjf some-file.tar.bz2 /some-directory &
while true; do
    sleep 1  # Let it run for a second
    kill -STOP $! 2>/dev/null || break
    sleep 1  # Pause it for a second
    kill -CONT $! 2>/dev/null || break
done

Yang pertama sleepmenyesuaikan waktu tidur, yang kedua menyesuaikan waktu kerja. Seperti yang ada sekarang, ia memiliki siklus tugas 50%. Untuk menjaga suhu turun, Anda kemungkinan besar perlu mengurangi siklus tugas menjadi mungkin 25% atau lebih rendah (1 detik berjalan, 3 detik tidur = 1 dari setiap 4 detik = 25% siklus tugas). Omong sleep-omong perintah shell bisa menghabiskan waktu fraksional. Jadi Anda bahkan bisa mengatakannyasleep 0.1 . Simpan lebih dari 0,001 hanya untuk memastikan, dan jangan lupa bahwa eksekusi skrip menambah waktu juga.

Alexios
sumber
+1 Ide bagus! Saya kira itu mirip dengan alat cpulimit yang disarankan Huygens.
Nicolas Raoul
Kecuali alat Huuygens jauh lebih baik dan lebih praktis, itulah sebabnya jawaban itu mendapatkan +1 saya sendiri. :)
Alexios
0

Cara yang lebih umum untuk membatasi CPU adalah dengan menggunakan /sys . Ini sepertinya seperti yang Anda inginkan karena hal-hal selain tarmampu melakukan tugas-tugas yang mahal secara komputasi, hanya saja yang Anda lihat tarpaling banyak melakukannya.

Cara untuk melakukan ini adalah dengan:

  1. pergi ke /sys/devices/system/cpu/cpuX/cpufreq untuk masing-masing CPU Anda (ganti cpuXdengan masing-masing CPU).
  2. Kemudian lihat di file scaling_available_frequencies untuk melihat frekuensi apa yang didukung CPU Anda.
  3. Pilih frekuensi (katakanlah 1234567) dan lakukan echo 1234567 > scaling_max_freq

Ini akan mencegah CPU dari melampaui frekuensi yang ditentukan.

Patrick
sumber
Terima kasih, tetapi saya sudah berada pada frekuensi serendah mungkin. Saya seharusnya menyebutkan itu. Saya mulai melakukan underclocking segera setelah masalah ini mulai muncul.
Nicolas Raoul