Posso limitare manualmente la% di CPU utilizzata da un processo?


52

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

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


Questa non è direttamente una risposta alla tua domanda, ma Safari e Firefox normalmente non hanno fame di CPU. Potresti voler esaminare cosa potrebbero fare. Forse un'estensione / plug-in può essere responsabile dell'eccessivo consumo di risorse e potresti essere in grado di disabilitarlo (o rimuoverlo se non lo usi più).
Tim Campbell

Risposte:


7

Non è esattamente quello che volevi, ma, per quanto riguarda Google Drive e Chrome, questo è stato il trucco per me:

Google Drive ("Backup e sincronizzazione")

  • de-Prioritize:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • tornare alla normalità:

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

Cromo

  • priorizzare tutti i processi attuali:

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • riportare alla normalità tutti i processi attuali:

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

44

cputhrottleè lo strumento di cui hai bisogno. Puoi installarlo con Homebrew .

Puoi monitorare una serie di processi per nome eseguendo lo script Bash di seguito. Non sono del tutto sicuro di come trasformarlo in un elemento di accesso poiché cputhrottlerichiede autorizzazioni da 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

[Modificato]

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

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

La differenza principale è che puoi aggiungere il limite cpu per applicazione e verrà eseguito una sola volta per applicazione. Ho anche aggiunto l'opzione per uccidere tutti i cputhrottleprocessi.

Lo script presuppone che sia cputhrottlee pidofsiano 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:


3
Come sottolineato in un altro commento , cputhrottleil forumula è stato rimosso da Homebrew il 17 febbraio 2019 perché non funziona più . Yosemite era l'ultima versione di macOS da supportare cputhrottle.
Casimir

@Casimir e ora, cosa fare?
Peter Samokhin,

@PeterSamokhin Spiacente, non conosco un'alternativa. Ma anche io non ho cercato di recente.
Casimir

15

Puoi davvero! C'è CPUThrottle , che consente di specificare un PID da limitare.

Nota, stanno cercando di usare così tanto per una ragione, è uno strumento utile ma se ti renderà migliore o peggiore per te ogni giorno sarà qualcosa che scopri.


1
Interessante. Ma con questa utility devo avviare un programma, trovare i suoi PID e utilizzare manualmente cputhrottle. Ogni volta che lo lancio. C'è qualcosa che mi permette di dire al sistema: "Da oggi esegui sempre questo programma con un massimo del 25% di CPU"?
Pietro,

Per quanto ne so no, mi sono mai imbattuto in CPUThrottle.
Nicholas Smith,

404 File non trovato
André Levy

11

Sebbene non sia una risposta diretta alla domanda del PO, se stai riscontrando un problema con un determinato processo che richiede troppo tempo della CPU e rendi il tuo computer inutilizzabile, e non ti dispiace quanto tempo impiega quel processo per completare il su cui sta lavorando, puoi usare il reniceper modificare la priorità di quel processo, facendolo comportare bene (da qui il nome).

Innanzitutto, è necessario trovare il PID del processo che sta utilizzando le risorse della CPU. Puoi farlo in Activity Monitor o in Terminal.app con il pscomando - ad es. Per trovare il PID del browser Safari, digita:

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

La seconda riga sopra è l'output e il PID è 17452 in questo caso particolare.

Quindi, il prossimo compito è cambiare la priorità del processo (diciamo che è Safari che vogliamo farci comportare bene). Per fare ciò, in Terminal.app digitare:

MacBook:~😈  renice -n 10 -p 17452

L' -nopzione cambia il buon livello aggiungendo 10 al valore corrente (0 per impostazione predefinita). L'intervallo di valori è compreso tra -20 e 20, con il valore più basso che indica la priorità più alta. Come utente normale, è possibile utilizzare i valori da 0 a 20. Per assegnare un valore negativo, è necessario disporre dei privilegi di root (ad esempio, utilizzare il sudocomando). Ulteriori informazioni su nicee renicedigitando man nicee man renicein Terminal.app.

nicee renicenon limitano la percentuale della CPU disponibile per una determinata applicazione di per sé, tuttavia consentono di modificare la priorità di pianificazione o, in altre parole, la quantità di tempo della CPU che un processo impiegherà. Questo è tutto relativo al carico della CPU sul tuo sistema, quindi se il sistema è poco utilizzato, molto probabilmente non vedrai alcuna differenza.


C'è un modo per vedere l'attuale priorità di un processo?
theonlygusti,

usa top o htop per visualizzare il valore attuale di un processo. (brew install htop), (sudo apt install htop). Vedrai una delle colonne che contengono il valore.
Tmanok,

6

C'è un semplice one-liner per fare tutto ciò:

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 anziché Chromium e la percentuale desiderata invece di 10 e sei a posto!


Questo ha funzionato bene, anche se può essere ridotto a: pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. Non sono sicuro se macOS viene fornito con pgrepinstallato, tuttavia.
bigsweater

5

Questo si basa su una risposta precedente, ma aggiungendo la trappola per ctrl + c per assicurarsi che il processo che viene limitato venga lasciato in uno stato continuo, e aggiungendo set -ecosì questo script uscirà 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

3

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

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


2
Simile ad AppPolice, c'è AppTamer ( stclairsw.com/AppTamer ). Un avvertimento: mentre scrivo questo commento, AppTamer non è ancora compatibile con OSX Sierra.
John Mark Mitchell,

Oh mio Dio, che scoperta. AppTamer appena installato. Lieto di segnalare che funziona in modo fantastico. Lo uso per mantenere il nuovo StarCraft rimasterizzato in linea quando tengo premuto alt-tab. Oh, e ho dimenticato di menzionare, sto eseguendo macOS Sierra 10.12.6. Grazie per il suggerimento!
cavalcata

Apppolice è stato sospeso.
LängLаngС,

Ma funziona ancora abbastanza bene.
phil pirozhkov,

3

Questo è il mio script finale, mantieni pulito il comando cputhrottle esegui solo uno nuovo 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

3

Lo script che Dimitri ha scritto 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 sul 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

Probabilmente dovrebbe essere una modifica apportata alla risposta originale di Dimitri, al fine di migliorare quella risposta, e non una risposta separata con (sostanzialmente) le stesse informazioni.
fsb,

2

questo sh 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.