Czy mogę ręcznie ograniczyć% procesora używanego przez proces?

52

Chciałbym ograniczyć czas procesora poświęcony na niektóre procesy (np. Firefox, Safari, ...).

Nie rozumiem, dlaczego takie programy, nawet gdy nie są używane (nic się nie ładuje, nie ma animacji, działa w tle, ...), są tak głodne zasobów. Dlaczego przeglądarka musi zjeść 50% lub więcej mojego procesora? Czy mogę ograniczyć to do 10%?

Pietro
źródło
To nie jest bezpośrednia odpowiedź na twoje pytanie, ale Safari i Firefox zwykle nie są głodne CPU. Możesz przyjrzeć się, co oni robią. Możliwe, że rozszerzenie / wtyczka może być odpowiedzialne za nadmierne zużycie zasobów i możesz je wyłączyć (lub usunąć, jeśli już go nie używasz)
Tim Campbell,

Odpowiedzi:

7

To nie jest dokładnie to, czego chciałeś, ale w odniesieniu do Google Drive i Chrome to, co zrobiło dla mnie lewę:

Dysk Google („Kopia zapasowa i synchronizacja”)

  • usuń priorytet:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • powrócić do normy:

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

Chrom

  • usuń z priorytetu wszystkie bieżące procesy:

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • przywrócono do normy wszystkie bieżące procesy:

    for f in $(pgrep 'Chrome'); do renice 0 -p $f; done
    
Noam
źródło
44

cputhrottlejest narzędziem, którego potrzebujesz. Możesz zainstalować go z Homebrew .

Możesz monitorować szereg procesów według nazwy, uruchamiając poniższy skrypt Bash. Nie jestem pewien, jak zmienić to w element logowania, ponieważ cputhrottlewymaga uprawnień administratora. Uruchom go jako skrypt w przepływie pracy Automatora, cokolwiek:

# 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

[Edytowane]

Dodałem inną wersję tego skryptu ( bashskrypt), która może być przydatna dla osób szukających ograniczenia procesora dla wielu aplikacji.

Ten nowy skrypt umożliwia także określenie listy zawierającej nazwę aplikacji i limit procesora.

Główną różnicą jest to, że możesz dodać limit procesora na aplikację i będzie on działać tylko raz na aplikację. Dodałem także opcję zabijania wszystkich cputhrottleprocesów.

Scenariusz zakłada, że oba cputhrottlei pidofsą zainstalowane przed uruchomieniem.

#!/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."

Źródło:

pieprzony
źródło
3
Jak wskazano w innym komentarzu , cputhrottleforumula została usunięta z Homebrew 17 lutego 2019 r., Ponieważ już nie działa . Yosemite to ostatnia obsługiwana wersja systemu macOS cputhrottle.
Casimir
@Casimir i teraz, co robić?
Peter Samokhin
@PeterSamokhin Przepraszamy, nie znam alternatywy. Ale ostatnio też nie szukałem.
Casimir
15

Rzeczywiście możesz! Istnieje CPUThrottle , który pozwala określić PID do ograniczenia.

Zauważ, że próbują tak często korzystać z jakiegoś powodu, jest to przydatne narzędzie, ale to, czy sprawi, że będzie ci lepiej, czy gorzej z dnia na dzień, będzie czymś, co odkryjesz.

Nicholas Smith
źródło
1
Ciekawy. Ale dzięki temu narzędziu muszę uruchomić program, znaleźć jego PID (y) i ręcznie użyć cputhrottle. Za każdym razem, gdy go uruchamiam. Czy jest coś, co pozwala mi powiedzieć systemowi: „Od dziś zawsze uruchamiaj ten program z maksymalnie 25% CPU”?
Pietro
O ile mi wiadomo nie, nigdy nie spotkałem CPUThrottle.
Nicholas Smith
404 Nie znaleziono pliku
André Levy
11

Chociaż nie jest to bezpośrednia odpowiedź na pytanie OP, jeśli masz problem z konkretnym procesem, który zajmuje zbyt dużo czasu procesora i sprawia, że ​​komputer jest bezużyteczny, i nie masz nic przeciwko, jak długo ten proces trwa do ukończenia zadanie, nad którym pracuje, możesz użyć renicedo zmiany priorytetu tego procesu, dzięki czemu zachowuje się ładnie (stąd nazwa).

Najpierw musisz znaleźć PID procesu, który zużywa zasoby procesora. Możesz to zrobić w Monitorze aktywności lub w Terminal.app za pomocą pspolecenia - np. Aby znaleźć PID przeglądarki Safari, wpisz:

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

Drugi wiersz powyżej to dane wyjściowe, aw tym konkretnym przypadku PID to 17452.

Następnie kolejnym zadaniem jest zmiana priorytetu procesu (powiedzmy, że chcemy, aby Safari ładnie się zachowywało). Aby to zrobić, w Terminal.app wpisz:

MacBook:~😈  renice -n 10 -p 17452

-nOpcja zmienia piękny poziom przez dodanie 10 do bieżącej wartości (domyślnie 0). Zakres wartości wynosi od -20 do 20, przy czym najniższa wartość oznacza najwyższy priorytet. Jako zwykły użytkownik możesz użyć wartości od 0 do 20. Aby przypisać wartość ujemną, musisz mieć uprawnienia roota (np. sudoPolecenie use ). Przeczytaj więcej na temat nicei renicewpisując man niceoraz man renicew Terminal.app.

nicei renicenie ograniczają odsetka procesora dostępnego dla danej aplikacji per se, pozwalają jednak na zmianę priorytetu planowania, czyli innymi słowy, ile czasu procesorowi zajmie proces. Wszystko to zależy od obciążenia procesora w systemie, więc jeśli system jest nieduży, najprawdopodobniej nie zobaczysz żadnej różnicy.

mikrofon
źródło
Czy istnieje sposób, aby zobaczyć aktualny priorytet procesu?
theonlygusti
użyj top lub htop, aby wyświetlić bieżącą niezłą wartość procesu. (brew install htop), (sudo apt install htop). Zobaczysz jedną z kolumn zawierających tę wartość.
Tmanok
6

Istnieje prosty jeden linijka do robienia tego wszystkiego:

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

Wpisz nazwę swojej aplikacji zamiast Chromium i żądany procent zamiast 10 i możesz zacząć!

Jurij Nasretdinow
źródło
To działa dobrze, choć może to być zmniejszona do: pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. Nie jestem jednak pewien, czy system macOS jest pgrepzainstalowany.
bigsweater
5

Jest to oparte na poprzedniej odpowiedzi, ale dodanie pułapki dla ctrl + c, aby upewnić się, że dławiony proces pozostanie w stanie kontynuacji, i dodanie, set -eaby ten skrypt zamknął się czysto, jeśli sam proces zakończy się:

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
użytkownik100375
źródło
3

Link opublikowany przez Nicholasa Smitha już nie działa. Znalazłem więc inną aplikację, która rozwiązuje problem osób, które przeszukują ją ponownie. aplikacja nazywa się Apppolice.

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

John Wells
źródło
2
Podobnie jak AppPolice, istnieje AppTamer ( stclairsw.com/AppTamer ). Jedno słowo ostrzeżenia: w chwili pisania tego komentarza AppTamer nie jest jeszcze kompatybilny z OSX Sierra.
John Mark Mitchell
O rany, co za znalezisko. Właśnie zainstalowany AppTamer. Miło nam poinformować, że działa fantastycznie dobrze. Używam go, aby utrzymać nowy StarCraft zremasterowany, gdy mam wciśnięty klawisz Alt. No i zapomniałem wspomnieć, że używam macOS Sierra 10.12.6. Dzieki za sugestie!
kawalkada
Apppolice zostało wycofane.
LаngLаngС
Ale nadal działa całkiem dobrze.
phil pirozhkov
3

To jest mój ostatni skrypt, utrzymuj w czystości polecenie cputhrottle uruchom tylko nowy, jeśli nie istnieje

#!/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
Alejo JM
źródło
3

Skrypt napisany przez Dimitri działa dobrze (w systemie macOS), ale po zamknięciu aplikacji nadal działa z błędami. Zmieniłem go, aby zakończyć (z komunikatem o błędzie dotyczącym braku PID):

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
Bart Meerdink
źródło
Prawdopodobnie powinna to być modyfikacja oryginalnej odpowiedzi Dymitra, aby poprawić tę odpowiedź, a nie osobna odpowiedź z (zasadniczo) tymi samymi informacjami.
fsb
2

to działało dla mnie

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
Dmitrij Bułdakow
źródło