Posso limitare manualmente la% CPU utilizzata da un processo?

47

Vorrei limitare la quantità di tempo CPU dedicato a determinati processi (ad esempio Firefox, Safari, ...).

Non riesco a capire perché tali programmi, anche se non utilizzati (niente caricamento, nessuna animazione, esecuzione in background, ...), sono così affamati di risorse. Perché un browser deve mangiare il 50% o più della mia CPU? Posso limitarlo al 10%?

    
posta Pietro 14.09.2011 - 11:49
fonte

10 risposte

5

Non è esattamente quello che volevi, ma, per quanto riguarda google drive e chrome, questo è stato il trucco per me:

for f in $(pgrep Drive; pgrep Chrome); do renice -n +20 -p $f ; done
    
risposta data 10.08.2014 - 07:02
fonte
40

cputhrottle è lo strumento necessario. Puoi installarlo con Homebrew .

È possibile monitorare una serie di processi per nome eseguendo lo script Bash di seguito. Non sono abbastanza sicuro di come trasformarlo in un elemento di accesso poiché cputhrottle richiede autorizzazioni di superutente. Eseguilo come script, in un flusso di lavoro di Automator, qualunque sia:

# 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

[Edited]

Ho aggiunto una versione diversa per questo script (uno script bash ), che potrebbe essere utile per le persone che cercano di limitare la CPU per più applicazioni.

Questo nuovo script consente anche di specificare un elenco contenente il nome dell'applicazione e il limite della CPU per esso.

La differenza principale è che è possibile aggiungere il limite di CPU per applicazione e verrà eseguito solo una volta per applicazione. Ho anche aggiunto l'opzione per uccidere tutti i processi cputhrottle .

Lo script presuppone che sia cputhrottle sia pidof siano installati prima di eseguirlo.

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

Fonte:

risposta data 05.05.2012 - 05:37
fonte
15

Puoi davvero! Esiste CPUThrottle , che consente di specificare un PID per limitare .

Nota, stanno tentando di usarlo così tanto per un motivo, è uno strumento utile, ma se lo renderà migliore o peggiore per te ogni giorno sarà qualcosa che scoprirai.

    
risposta data 14.09.2011 - 12:15
fonte
10

Sebbene non sia una risposta diretta alla domanda dell'OP, se stai riscontrando un problema con un particolare processo che occupa troppo tempo della tua CPU, e rendi il tuo computer inutilizzabile, e non ti importa di quanto tempo impieghi quel processo per completare l'attività su cui sta lavorando, puoi usare renice per modificare la priorità di quel processo, facendolo comportare bene (da qui il nome).

Per prima cosa, devi trovare il PID del processo che sta utilizzando le risorse della CPU. Puoi farlo in Activity Monitor o in Terminal.app con il comando ps - ad es. per trovare il PID del browser Safari, digitare:

MacBook:~                                    
risposta data 10.08.2014 - 09:25
fonte
6

C'è un semplice liner per fare tutto questo:

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

Scrivi il nome della tua app al posto di Chromium e la percentuale desiderata invece di 10 e sei a posto!

    
risposta data 20.09.2017 - 10:38
fonte
5

Questo è basato su una risposta precedente, ma aggiungendo il trap per ctrl + c per assicurarsi che il processo che viene ridotto rimanga in uno stato continuativo e aggiungendo set -e in modo che questo script si chiuda in modo pulito se il processo stesso esce:

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
    
risposta data 21.02.2016 - 04:48
fonte
3

Questo è il mio script finale, mantieni pulito il comando cputhrottle Esegui solo una nuova se non esiste

#!/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
    
risposta data 06.05.2016 - 08:52
fonte
3

Lo script scritto da Dimitri funziona bene (su macOS), ma continua a funzionare con errori dopo la chiusura dell'applicazione. L'ho modificato per completarlo (con un messaggio di errore relativo al PID non trovato):

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
    
risposta data 04.08.2018 - 13:33
fonte
2

Il link pubblicato da Nicholas Smith non funziona più. Così ho trovato un'altra app che fa il trucco per le persone che stanno cercando di nuovo. l'app chiama Apppolice.

link

    
risposta data 10.07.2014 - 17:33
fonte
1

questo ha funzionato per me

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
    
risposta data 18.10.2014 - 19:04
fonte

Leggi altre domande sui tag