Ziftin çok fazla CPU ve disk kullanmasını önleme (% 100 ise eski dizüstü bilgisayar çöküyor)


15

Harici bir diske 1 terabayt veri yedeklemek istiyorum.

Bu komutu kullanıyorum: tar cf /media/MYDISK/backup.tar mydata

SORUN:% 100 CPU veya% 100 disk kullandığımda zayıf dizüstü bilgisayarım donuyor ve kilitleniyor (bu konuda tepki vermek istiyorsanız lütfen buraya yazın ) . Bu yüzden yaklaşık% 50 CPU ve maksimum% 50 diskte kalmak istiyorum.

Sorum: CPU ve diski tarkomutla nasıl kısaltabilirsiniz?

Rsync bir --bwlimit seçeneği var, ama bir arşiv istiyorum çünkü 1) birçok küçük dosya var 2) Ben bir ağaç yerine tek bir dosyayı yönetmek için tercih ederim. Bu yüzden kullanıyorum tar.


1
Böylesine büyük bir tarball yapmak için ne kadar akıllıca bir fikir: DDD 'Güzel' komuta ne olacak?
jirib

1
@JiriXichtkniha: nice% 100 CPU kullanımını engellemeyecek
Nicolas Raoul

Yanıtlar:


22

pvBir borunun bant genişliğini kısmak için kullanabilirsiniz . Kullanım durumunuz güçlü bir şekilde IO'ya bağlı olduğundan, bir borudan geçmenin ek CPU yükü fark edilmemelidir ve herhangi bir CPU kısıtlaması yapmanız gerekmez.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar

1
Beklediğimden bile daha iyi! IO'yu 5mb / saniye ile sınırlandırıyorum ve CPU% 13'te kalıyor (şifreleme devam ederken makul görünüyor).
Nicolas Raoul

1
Çok hoş!. Belki de ilerleme çubuğunu ortadan kaldırmak için -q bayrağını öneriyoruz.
szabgab

böyle büyük bir komut !!! Debian / Ubuntu'nuzda yoksa, çalıştırın apt-get install pv. Sonra "-b" eklemenizi öneririm -L 1m: bu şekilde her saniye güncellenen artımlı bir bayt sayacı yazdırılır. Bu şekilde, bugüne kadar kaç bayt yazıldığını biliyorsunuz
lucaferrario

Ayrıca, çıktıyı sıkıştırırsanız ( tar czfyerine kullanmak tar cf) sınırın sıkıştırılmış çıktıya karşılık geldiğini -L 1munutmayın (bu nedenle disk yazma işleminiz 1 MB / sn'yi geçmeyecektir ... ancak disk okumanız muhtemelen 1 MB / sn arasında olacaktır. ve içerik türünüze bağlı olarak 5 MB / sn.)
lucaferrario

Harika numara! Xz ile sıkıştırırken, önce pv'den sonra xz'den geçiyorum.
Jean-Bernard Jansen

8

CPU yüzdesini sınırlayan cpulimit aracını deneyebilirsiniz . Standart bir araç değildir, bu yüzden yüklemeniz gerekecektir. İşte README'den hızlı bir alıntı:

"Cpulimit, bir işlemin CPU kullanımını sınırlamaya çalışan bir araçtır (CPU zamanında değil yüzde olarak ifade edilir). [...] Kullanılan işlemci miktarının kontrolü, süreçlere SIGSTOP ve SIGCONT POSIX sinyalleri gönderilerek yapılır. alt süreçler ve belirtilen işlemin iş parçacıkları aynı CPU yüzdesini paylaşacaktır. "

O zaman IO kullanımını sınırlamak için iyonice tavsiye ederim, ancak maksimum verimi değil, sınırlı olan eşzamanlı erişimdir ... Asla daha az burada nasıl kullanılacağı:

ionice -c 3 <your_command>

Harika! Aradığım şey cpulimit gibi görünüyor.
Nicolas Raoul

2

Gerçekten daha az çalıştırmak için bir süreç elde edemezsiniz . Daha nicedüşük bir öncelik vermek için kullanabilirsiniz , ancak bu diğer süreçlerle ilgilidir. Bir işlem çalışırken CPU soğutucusunu çalıştırmanın yolu usleep(3), işlemi çalışma durumundan belirli bir süre zorlamak için kullanmaktır , ancak bu ya çok fazla kullanan yamalı bir işlev sağlamak için yamayı tarya da LD_PRELOADmekanizmayı kullanmayı içerir tar(ör. fopen(3)).

En iyi geçici çözümlerinizin SuperUser'da bahsettiğiniz donanımlar olduğundan şüpheleniyorum: dizüstü bilgisayarı serin tutmak ve / veya CPU saatini düşürmek.

Can sıkıcı ama muhtemelen uygulanabilir bir çözüm (gerçekten bir çamur) 'makroskopik' seviyede çalışır. tarHer 200ms'de 100ms koşmak yerine , her iki saniyede bir saniye çalıştırabilirsiniz. Not: Bu korkunç, korkunç bir çamurdur. Ama hey, işe yarayabilir!

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

Birincisi sleepuyku süresini, ikincisi çalışma zamanını ayarlar. Şu an olduğu gibi,% 50 görev döngüsüne sahip. Sıcaklığı düşük tutmak için, görev döngüsünü belki de% 25 veya daha düşük bir değere düşürmeniz gerekecektir (1 saniye çalışma, 3 saniye uyku = her 4 saniyede 1 =% 25 görev döngüsü). Kabuk komutu sleepbu arada kesirli zamanlar alabilir. Böylece söyleyebilirsin sleep 0.1. Emin olmak için 0.001'in üzerinde tutun ve komut dosyası yürütmenin de zamana eklendiğini unutmayın.


+1 Güzel fikir! Huygens'in önerdiği cpulimit aracına benzer sanırım.
Nicolas Raoul

Huuygens'in aracı dışında çok daha iyi ve daha pratik, bu yüzden bu cevap kendi +1 puanımı aldı. :)
Alexios

0

CPU'yu sınırlamanın daha genel bir amacı kullanmaktır /sys. Bu zaten istediğiniz gibi görünüyor çünkü diğer şeyler tarhesaplama pahalı görevleri yerine getirme yeteneğine sahiptir, sadece tarbunu en çok gördüğünüz görüyorsunuz .

Bunu yapmanın yolu:

  1. /sys/devices/system/cpu/cpuX/cpufreqCPU'larınızın her biri için adresine gidin ( cpuXher işlemci ile değiştirin ).
  2. Ardından scaling_available_frequencies, CPU'nuzun hangi frekansları desteklediğini görmek için dosyaya bakın.
  3. Bir frekans seçin (haydi 1234567 diyelim) ve yapın echo 1234567 > scaling_max_freq

Bu, CPU'nun belirtilen frekansın üzerine çıkmasını önleyecektir.


Teşekkürler, ama zaten mümkün olan en düşük frekanstayım. Bundan bahsetmeliydim. Bu sorunlar ortaya çıkmaya başlar başlamaz, yetersiz hızlanmaya başladım.
Nicolas Raoul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.