Bir işlem tarafından kullanılan% CPU'yu elle sınırlayabilir miyim?


52

Belirli işlemlere ayrılan CPU süresini sınırlamak istiyorum (örn. Firefox, Safari, ...).

Neden bu tür programların kullanılmadıklarında (hiçbir şey yüklenmiyor, animasyon yok, arka planda çalışıyor, ...) neden bu kadar aç olduklarını anlamıyorum. Bir tarayıcı neden işlemcimin% 50 veya daha fazlasını yemeli? % 10 ile sınırlayabilir miyim?


Bu doğrudan sorunuza bir cevap değildir, ancak Safari ve Firefox normalde CPU'ya aç değildir. Ne yaptıklarına bakmak isteyebilirsiniz. Muhtemelen bir uzatma / eklenti, aşırı kaynak tüketiminden sorumlu olabilir ve onu devre dışı bırakabilirsiniz (veya artık kullanmıyorsanız onu kaldırın.)
Tim Campbell

Yanıtlar:


7

Tam olarak istediğin gibi değildi, ama google drive ve chrome açısından bu benim için püf noktasıydı:

Google Drive ("Yedekleme ve Senkronizasyon")

  • önem vermezler:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • normale dön:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice 0 -p $f; done
    

Krom

  • tüm mevcut süreçlerin önceliğini kaldırın:

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • mevcut tüm işlemleri normale döndürmek:

    for f in $(pgrep 'Chrome'); do renice 0 -p $f; done
    

44

cputhrottleihtiyacınız olan araçtır. Homebrew ile yükleyebilirsiniz .

Aşağıdaki Bash komut dosyasını çalıştırarak bir dizi işlemi isme göre izleyebilirsiniz. cputhrottleSüper kullanıcı izinleri gerektirdiğinden , bunun bir giriş öğesine nasıl çevrileceğinden emin değilim . Bir Automator iş akışında, bir komut dosyası olarak çalıştırın.

# Get the Process/App names from Activity Monitor and put them here
apps=("AppOne" "AppTwo" "AppThree")
# Set the respective limits here
limits={30 40 50)

while true; do
  for app in ${apps}; do
    for limit in ${limits}; do
      for pid in $(pgrep ${app}); do
        sudo /path/to/cputhrottle ${pid} ${limit}
      done
    done
  done
done

[Düzenleyen]

Bu komut dosyası için farklı bir sürüm ekledim (bir bashkomut dosyası), bu CPU'yu birden çok uygulama için sınırlandırmak isteyen kullanıcılar için yararlı olabilir.

Bu yeni komut dosyası aynı zamanda uygulama adını ve bunun için CPU sınırını içeren bir liste belirlemenizi sağlar.

Başlıca fark, uygulama başına cpu limiti ekleyebilmenizdir ve uygulama başına yalnızca bir kez çalışacaktır. Ayrıca tüm cputhrottleişlemleri öldürme seçeneğini de ekledim .

Komut dosyası her ikisinin de olduğunu cputhrottleve pidofçalıştırmadan önce yüklendiğini varsayar .

#!/bin/bash

if [[ $EUID > 0 ]]; then
  echo "Please run this script as root/sudo"
  exit 1
fi

# Pass --kill as argument to kill all running cputhrottles
if [ $1 = "--kill" ]; then  
  echo "Looking for running cputhrottles..."
  pids=`pidof cputhrottle`
  for pid in ${pids}; do
    echo "> Killing PID ${pid}"
    sudo kill ${pid}
  done
  echo "Done!"
  exit 0
fi

declare -a applications

# Syntax='application;max-cpu'
applications[0]='Chrome;40'
applications[1]='Firefox;50'
applications[2]='pycharm;40'
applications[3]='webstorm;40'
applications[4]='Safari;35'

for i in "${applications[@]}"; do
  app=(${i//;/ })
  app_name=${app[0]}
  cpu_limit=${app[1]}

  printf "\nLooking for ${app_name}...\n"
  pids=`pidof ${app}`
  for pid in ${pids}; do
    echo "> PID=${pid}, CPU=${cpu_limit}"
    sudo cputhrottle ${pid} ${cpu_limit} &
  done
done

printf "\nDone!\n"
echo "Run this script passing '--kill' as argument to remove all cputhrottles."

Kaynak:


3
Başka bir yorumda da belirtildiği gibi , cputhrottleforumu 17 Şubat 2019 tarihinde Homebrew'den kaldırıldı, çünkü artık çalışmıyor . Yosemite, macOS'un desteklediği son versiyondu cputhrottle.
Casimir

@Casimir ve şimdi, ne yapmalı?
Peter Samokhin

@PeterSamokhin Üzgünüm, bir alternatif bilmiyorum. Ama aynı zamanda son zamanlarda aramadım.
Casimir

15

Gerçekten yapabilirsin! Kısıtlamak için bir PID belirtmenize izin veren CPUThrottle var .

Unutmayın, bu kadarını bir sebepten kullanmaya çalışıyorlar, faydalı bir araç ama sizin için bir günden güne sizin için daha iyi veya daha kötü hale getirip getirmeyeceği keşfedilecek bir şey olacak.


1
İlginç. Ancak bu yardımcı programla bir program başlatmalı, PID'lerini bulmalı ve manuel olarak cputhrottle kullanmalıyım. Her başlattığımda. Sisteme söylememe izin veren bir şey var mı: “Bugünden itibaren bu programı her zaman en fazla% 25 CPU ile çalıştır”?
Pietro

Bildiğim kadarıyla hayır, sadece CPUThrottle ile karşılaştım.
Nicholas Smith

404 Dosya bulunamadı
André Levy

11

Her ne kadar OP'nin sorusuna doğrudan bir cevap olmasa da, belirli bir işlemle ilgili olarak CPU sürenizi çok fazla alan ve bilgisayarınızı kullanılamaz hale getiren bir sorun yaşıyorsanız ve bu işlemin ne kadar süreceğini umursamıyorsanız üzerinde çalıştığı görev renice, bu sürecin önceliğini değiştirerek, güzel davranmasını sağlar (dolayısıyla adı).

Öncelikle, CPU kaynaklarını kullanan işlemin PID'sini bulmanız gerekir. Bunu Activity Monitor'da veya Terminal.app'de pskomutla yapabilirsiniz - örneğin Safari tarayıcısının PID'sini bulmak için şunu yazın:

MacBook:~😈  ps -ef | grep Safari
  501 17452   263   0 11:36pm ??         4:15.60 /Applications/Safari.app/Contents/MacOS/Safari

Yukarıdaki ikinci satır çıktı ve PID bu özel durumda 17452.

O zaman bir sonraki görev, sürecin önceliğini değiştirmektir (diyelim ki, güzel davranmak istediğimiz Safari budur). Bunu yapmak için Terminal.app yazın:

MacBook:~😈  renice -n 10 -p 17452

Bu -nseçenek geçerli seviyeye 10 ekleyerek hoş seviyeyi değiştirir (varsayılan olarak 0). Değer aralığı -20 ila 20'dir, en düşük değer en yüksek önceliği ifade eder. Sıradan bir kullanıcı olarak, 0 ila 20 arasındaki değerleri kullanabilirsiniz. Negatif bir değer atamak için kök ayrıcalıklarına sahip olmanız gerekir (örn. Use sudocommand). Hakkında daha fazla bilgi niceve reniceyazarak man niceve man reniceTerminal.app.

niceve reniceCPU'nun yüzdesini belirli bir uygulamaya göre sınırlamayın, bunlar zamanlama önceliğini değiştirmeyi ya da başka bir deyişle bir işlemin CPU zamanının ne kadarını alacağını değiştirmeyi sağlar. Bunların hepsi sisteminizdeki CPU yüküne göredir, bu nedenle sistem kullanılıyorsa, büyük olasılıkla herhangi bir fark görmezsiniz.


Bir sürecin mevcut önceliğini görmenin bir yolu var mı?
theonlygusti

Bir işlemin geçerli değerini görüntülemek için top veya htop komutunu kullanın. (demleme yükleme noktası), (sudo apt yükleme yükleme noktası). Değeri içeren sütunlardan birini göreceksiniz.
Tmanok

6

Tüm bunları yapmak için basit bir astar var:

ps axu | grep Chromium | grep -v grep | awk '{print $2}' | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'

Chromium yerine uygulama adınızı ve 10 yerine istediğiniz yüzdeyi yazın;


O indirgenebilir gerçi bu, iyi çalıştı: pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. pgrepBununla birlikte, macOS yüklü olarak gelip gelmediğinden emin değilim .
bigsweater

5

Bu önceki bir cevaba dayanır, ancak atılan işlemin devam eden bir durumda bırakıldığından emin olmak için ctrl + c için tuzak eklenmesi set -eve işlemin kendiliğinden çıkması durumunda bu betiğin temiz bir şekilde çıkması için ekleme :

trap ctrl_c_fn INT

function ctrl_c_fn() {
    echo "caught CTRL-C, exiting"
    kill -SIGCONT $pid
    exit
}

echo "enter process id"
read pid
echo "press Ctrl-C to exit"

set -e

while true; do
    kill -SIGSTOP $pid
    sleep 0.009
    kill -SIGCONT $pid
    sleep 0.001
done

3

Nicholas Smith'in gönderdiği bağlantı artık çalışmıyor. Bu yüzden tekrar arayan insanlar için hile yapan başka bir uygulama buldum. Uygulamaya Apppolice çağırır.

http://www.macupdate.com/app/mac/49836/apppolice


2
AppPolice'e benzer şekilde AppTamer ( stclairsw.com/AppTamer ) vardır. Dikkatli bir kelime: bu yorumu yazarken, AppTamer henüz OSX Sierra uyumlu olmamıştı.
John Mark Mitchell,

Aman Tanrım, ne buldum. Yeni yüklü AppTamer. Fevkalade iyi çalıştığını bildirmekten memnuniyet duyuyorum. Yeni StarCraft'ı alt sekme aldığımda hizada tutmak için kullanıyorum. Söylemeyi unuttum, ben MacOS Sierra 10.12.6 kullanıyorum. Önerin için teşekkürler!
süvari alayı

Uygulamaya son verildi.
L'AngLаngС

Ama yine de oldukça iyi çalışıyor.
phil pirozhkov

3

Bu benim son betiğim, temiz tut cputhrottle sadece yoksa yenisini yürütün

#!/bin/bash

###
# setup cputhrottle if doesn't exists
###
set_service_cpu_limit(){
    service_pid=$(pgrep $1)
    limit=$2
    if [[ ! -z $service_pid  ]]; then
        service_cpu=$(ps aux | grep "sudo cputhrottle $service_pid $limit" | grep -v grep | wc -l)
        if [[ ! $service_cpu -gt 0 ]]; then
            sudo cputhrottle $service_pid $limit &
        fi
    fi
}

###
# main loop
###
while true; do
    set_service_cpu_limit bzfilelist 2
    set_service_cpu_limit bztransmit 2
    sleep 0.5
done

3

Dimitri'nin yazdığı senaryo iyi çalışıyor (macOS'ta), ancak uygulama kapatıldıktan sonra hatalarla çalışmaya devam ediyor. Bitirmek için değiştirdim (PID ile ilgili bir hata mesajı bulunamadı):

echo "enter process id"
read pid
echo "press Ctrl-C to exit"

while kill -SIGSTOP $pid; do
    sleep 0.009
    kill -SIGCONT $pid
    sleep 0.001
done

Bu muhtemelen, Dimitri'nin orijinal cevabına yapılan ve bu cevabı geliştirmek için yapılan bir düzenleme olmalı, (temelde) aynı bilgiyle ayrı bir cevap vermemelidir.
fsb

2

bu sh benim için çalıştı

echo "enter process id"
read pid
echo "press Ctrl-C to exit"

while true; do
    kill -SIGSTOP $pid
    sleep 0.009
    kill -SIGCONT $pid
    sleep 0.001
done
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.