Posso limitar manualmente a% de CPU usada por um processo?

52

Gostaria de limitar a quantidade de tempo de CPU dedicada a certos processos (por exemplo, Firefox, Safari, ...).

Não consigo entender por que esses programas, mesmo quando não são usados ​​(nada carregando, sem animações, rodando em segundo plano, ...), são tão famintos por recursos. Por que um navegador deve consumir 50% ou mais da minha CPU? Posso limitar a 10%?

Pietro
fonte
Essa não é uma resposta direta à sua pergunta, mas o Safari e o Firefox normalmente não têm fome de CPU. Você pode querer analisar o que eles podem estar fazendo. Possivelmente, uma extensão / plug-in pode ser responsável pelo consumo excessivo de recursos e você pode desativá-lo (ou removê-lo se não o usar mais).
Tim Campbell

Respostas:

7

Não é exatamente o que você queria, mas, no que diz respeito ao Google Drive e Chrome, isso fez o truque para mim:

Google Drive ("Backup e sincronização")

  • de priorizar:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • volte ao normal:

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

cromada

  • de priorizar todos os processos atuais:

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • retorne ao normal todos os processos atuais:

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

cputhrottleé a ferramenta que você precisa. Você pode instalá-lo com o Homebrew .

Você pode monitorar uma série de processos por nome, executando o script Bash abaixo. Não tenho muita certeza de como transformar isso em um item de login, pois cputhrottlerequer permissões de superusuário. Execute-o como um script, em um fluxo de trabalho do Automator, qualquer que seja:

# 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

[Editado]

Adicionei uma versão diferente para este script (um bashscript), que pode ser útil para pessoas que procuram limitar a CPU para vários aplicativos.

Esse novo script também permite especificar uma lista contendo o nome do aplicativo e o limite de CPU para ele.

A principal diferença é que você pode adicionar o limite da CPU por aplicativo e ele será executado apenas uma vez por aplicativo. Eu também adicionei a opção para matar todos os cputhrottleprocessos.

O script assume que ambos cputhrottlee pidofestão instalados antes de executá-lo.

#!/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:

fny
fonte
3
Como apontado em outro comentário , cputhrottleo fórum do foi removido do Homebrew em 17 de fevereiro de 2019 porque não funciona mais . Yosemite foi a última versão do macOS a oferecer suporte cputhrottle.
Casimir
@ Casimir e agora, o que fazer?
Peter Samokhin 16/09
@ PeterSamokhin Desculpe, não sei de uma alternativa. Mas também não pesquisei recentemente.
Casimir
15

Você pode de fato! Há CPUThrottle , que permite especificar um PID para restringir.

Observe que eles estão tentando usar isso por um motivo, é uma ferramenta útil, mas se isso o tornará melhor ou pior para você no dia a dia será algo que você descobrirá.

Nicholas Smith
fonte
11
Interessante. Mas com esse utilitário, tenho que iniciar um programa, encontrar seus PID (s) e usar manualmente o cputhrottle. Toda vez que eu o lanço. Existe algo que me permita dizer ao sistema: “A partir de hoje, sempre execute este programa com no máximo 25% da CPU”?
Pietro
Tanto quanto sei que não, só encontrei o CPUThrottle.
Nicholas Smith
404 Arquivo não encontrado
André Levy
11

Embora não seja uma resposta direta à pergunta do OP, se você está tendo um problema com um processo específico que consome muito tempo da CPU e torna o computador inutilizável, não se importa quanto tempo leva para concluir o processo. Na tarefa em que está trabalhando, você pode usar o renicepara alterar a prioridade desse processo, fazendo com que ele se comporte bem (daí o nome).

Primeiro, você precisa encontrar o PID do processo que está consumindo os recursos da CPU. Você pode fazer isso no Activity Monitor ou no Terminal.app com o pscomando - por exemplo, para encontrar o PID do navegador Safari, digite:

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

A segunda linha acima é a saída e o PID é 17452 nesse caso específico.

Em seguida, a próxima tarefa é alterar a prioridade do processo (digamos que é o Safari que queremos fazer com que se comporte bem). Para fazer isso, no Terminal.app, digite:

MacBook:~😈  renice -n 10 -p 17452

A -nopção altera o nível agradável adicionando 10 ao valor atual (0 por padrão). O intervalo de valores é de -20 a 20, com o menor valor significando a maior prioridade. Como usuário comum, você pode usar os valores de 0 a 20. Para atribuir um valor negativo, você precisa ter privilégios de root (por exemplo, use sudocommand). Leia mais sobre nicee renicedigitando man nicee man reniceno Terminal.app.

nicee renicenão limite a porcentagem da CPU disponível para um determinado aplicativo em si, eles permitem alterar a prioridade do agendamento ou, em outras palavras, quanto tempo da CPU um processo terá. Tudo isso é relativo à carga da CPU no seu sistema; portanto, se o sistema estiver sendo subutilizado, você provavelmente não verá nenhuma diferença.

Mike
fonte
Existe uma maneira de ver a prioridade atual de um processo?
theonlygusti
use top ou htop para visualizar o bom valor atual de um processo. (brew install htop), (sudo apt install htop). Você verá uma das colunas que contêm o valor.
Tmanok
6

Existe uma linha simples para fazer tudo isso:

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

Escreva o nome do seu aplicativo em vez de Chromium e a porcentagem desejada em vez de 10 e pronto!

Yuriy Nasretdinov
fonte
Isso funcionou bem, embora possa ser reduzida a: pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. pgrepNo entanto, não tenho certeza se o macOS vem com o instalado.
Bigsweater #
5

Isso se baseia em uma resposta anterior, mas adicionar a interceptação para ctrl + c para garantir que o processo que está sendo acelerado seja deixado em um estado continuo e adicionar, set -eportanto, esse script sairá corretamente se o próprio processo sair:

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
user100375
fonte
3

O link que Nicholas Smith postou não funciona mais. Então, encontrei outro aplicativo que faz o truque para as pessoas que o pesquisam novamente. o aplicativo chama Apppolice.

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

John Wells
fonte
2
Semelhante ao AppPolice, existe o AppTamer ( stclairsw.com/AppTamer ). Uma palavra de cautela: quando escrevi esse comentário, o AppTamer ainda não é compatível com OSX Sierra.
John Mark Mitchell
Oh meu Deus, que descoberta. Acabei de instalar o AppTamer. O prazer de relatar funciona extraordinariamente bem. Eu o uso para manter o novo StarCraft remasterizado quando eu pressiono a tecla Alt. Ah, e esqueci de mencionar, estou executando o macOS Sierra 10.12.6. Obrigado pela sugestão!
23817 cavalcade
Apppolice foi descontinuado.
LаngLаngС
Mas ainda funciona muito bem.
phil pirozhkov
3

Este é o meu script final, mantenha limpo o comando cputhrottle apenas execute um novo se não existir

#!/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
fonte
3

O script que Dimitri escreveu funciona bem (no macOS), mas continua executando com erros após o fechamento do aplicativo. Eu mudei para finalizar (com uma mensagem de erro sobre PID não encontrada):

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
fonte
Provavelmente deve ser uma edição feita na resposta original de Dimitri, a fim de melhorar essa resposta, e não uma resposta separada com (basicamente) as mesmas informações.
Fsb
2

isso funcionou para mim

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
Dmitriy Buldakov
fonte