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.