¿Puedo limitar manualmente el% de CPU utilizado por un proceso?

52

Me gustaría limitar la cantidad de tiempo de CPU dedicado a ciertos procesos (por ejemplo, Firefox, Safari, ...).

No puedo entender por qué tales programas, incluso cuando no se usan (sin cargar nada, sin animaciones, ejecutándose en segundo plano, ...), requieren tantos recursos. ¿Por qué un navegador debe comer el 50% o más de mi CPU? ¿Puedo limitarlo al 10%?

Pietro
fuente
Esta no es una respuesta directa a su pregunta, pero Safari y Firefox normalmente no tienen mucha CPU. Es posible que desee ver lo que pueden estar haciendo. Posiblemente una extensión / complemento puede ser responsable del consumo excesivo de recursos y es posible que pueda deshabilitarlo (o eliminarlo si ya no lo usa).
Tim Campbell

Respuestas:

7

No es exactamente lo que querías, pero, en lo que respecta a Google Drive y Chrome, esto fue lo que me sirvió:

Google Drive ("Copia de seguridad y sincronización")

  • des-priorizar:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • volver a la normalidad:

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

Cromo

  • eliminar la prioridad de todos los procesos actuales:

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • restablecer a la normalidad todos los procesos actuales:

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

cputhrottlees la herramienta que necesitas Puedes instalarlo con Homebrew .

Puede monitorear una serie de procesos por nombre ejecutando el script Bash a continuación. No estoy muy seguro de cómo convertir esto en un elemento de inicio de sesión, ya que cputhrottlerequiere permisos de superusuario. Ejecútelo como un script, en un flujo de trabajo de Automator, lo que sea:

# 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]

He agregado una versión diferente para este script (un bashscript), que podría ser útil para las personas que buscan limitar la CPU para múltiples aplicaciones.

Este nuevo script también le permite especificar una lista que contiene el nombre de la aplicación y el límite de la CPU.

La principal diferencia es que puede agregar un límite de CPU por aplicación, y se ejecutará solo una vez por aplicación. También agregué la opción de eliminar todos los cputhrottleprocesos.

La secuencia de comandos supone que tanto cputhrottley pidofse instalan antes de ejecutarlo.

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

Fuente:

fny
fuente
3
Como se señaló en otro comentario , cputhrottleel foro se eliminó de Homebrew el 17 de febrero de 2019 porque ya no funciona . Yosemite fue la última versión de macOS compatible cputhrottle.
Casimir
@Casimir y ahora, ¿qué hacer?
Peter Samokhin
@PeterSamokhin Lo siento, no sé de una alternativa. Pero tampoco he buscado recientemente.
Casimir
15

¡De hecho puedes! Hay CPUThrottle , que permite especificar un PID para restringir.

Tenga en cuenta que están tratando de usar tanto por una razón, es una herramienta útil, pero si lo hará mejor o peor para usted en el día a día será algo que descubra.

Nicholas Smith
fuente
1
Interesante. Pero con esta utilidad tengo que iniciar un programa, encontrar su PID (s) y usar manualmente cputhrottle. Cada vez que lo lanzo. ¿Hay algo que me permita decirle al sistema: "Desde hoy, siempre ejecute este programa con un máximo de 25% de CPU"?
Pietro
Por lo que sé, no, solo me he encontrado con CPUThrottle.
Nicholas Smith
404 Archivo no encontrado
André Levy
11

Aunque no es una respuesta directa a la pregunta del OP, si tiene un problema con un proceso en particular que consume demasiado tiempo de su CPU y deja su computadora inutilizable, y no le importa cuánto tiempo tarda ese proceso en terminar el proceso. En la tarea en la que está trabajando, puede usar la renicepara alterar la prioridad de ese proceso, haciendo que se comporte bien (de ahí el nombre).

Primero, necesita encontrar el PID del proceso que está utilizando los recursos de la CPU. Puede hacerlo en Activity Monitor o en Terminal.app con el pscomando; por ejemplo, para encontrar el PID del navegador Safari, escriba:

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

La segunda línea de arriba es la salida, y el PID es 17452 en este caso particular.

Luego, la siguiente tarea es cambiar la prioridad del proceso (digamos que es Safari lo que queremos que se comporte bien). Para hacer esto, en Terminal.app escriba:

MacBook:~😈  renice -n 10 -p 17452

La -nopción cambia el nivel agradable agregando 10 al valor actual (0 por defecto). El rango de valores es de -20 a 20, con el valor más bajo que significa la máxima prioridad. Como usuario normal, puede usar los valores de 0 a 20. Para asignar un valor negativo, debe tener privilegios de root (por ejemplo, usar el sudocomando). Lea más sobre nicey reniceescribiendo man nicey man reniceen Terminal.app.

nicey reniceno limitan el porcentaje de la CPU disponible para una aplicación dada per se; sin embargo, permiten cambiar la prioridad de programación o, en otras palabras, cuánto tiempo de CPU obtendrá un proceso. Todo esto es relativo a la carga de la CPU en su sistema, por lo que si el sistema está infrautilizado, lo más probable es que no vea ninguna diferencia.

Miguel
fuente
¿Hay alguna manera de ver la prioridad actual de un proceso?
theonlygusti
use top o htop para ver el buen valor actual de un proceso. (brew install htop), (sudo apt install htop). Verá una de las columnas que contiene el valor.
Tmanok
6

Hay una frase simple para hacer todo eso:

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

Escriba el nombre de su aplicación en lugar de Chromium y el porcentaje deseado en lugar de 10, ¡y listo!

Yuriy Nasretdinov
fuente
Esto funcionó bien, aunque puede reducirse a: pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. pgrepSin embargo, no estoy seguro de si macOS viene con instalado.
bigsweater
5

Esto se basa en una respuesta anterior, pero agrega la trampa para ctrl + c para asegurarse de que el proceso que se estrangula se deja en un estado continuo, y agrega set -easí que este script se cerrará limpiamente si el proceso en sí se cierra:

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
usuario100375
fuente
3

El enlace que Nicholas Smith publicó ya no funciona. Así que encontré otra aplicación que hace el truco para las personas que la están buscando nuevamente. la aplicación llama a Apppolice.

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

John Wells
fuente
2
Similar a AppPolice, hay AppTamer ( stclairsw.com/AppTamer ). Una advertencia: cuando escribí este comentario, AppTamer aún no es compatible con OSX Sierra.
John Mark Mitchell
Oh, qué hallazgo. Acabo de instalar AppTamer. Encantado de informar funciona fantásticamente bien. Lo uso para mantener el nuevo StarCraft remasterizado en línea cuando hago la ficha alternativa. Ah, y olvidé mencionar que estoy ejecutando macOS Sierra 10.12.6. ¡Gracias por la sugerencia!
cabalgata el
Apppolice ha sido descontinuado.
LаngLаngС
Pero aún funciona bastante bien.
phil pirozhkov
3

Este es mi script final, mantenga limpio el comando cputhrottle solo ejecute uno nuevo si no existe

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

El script que Dimitri escribió funciona bien (en macOS), pero sigue ejecutándose con errores después de que se cierra la aplicación. Lo cambié para que finalice (con un mensaje de error sobre PID no encontrado):

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
fuente
Probablemente debería ser una edición realizada a la respuesta original de Dimitri, para mejorar esa respuesta, y no una respuesta separada con (básicamente) la misma información.
fsb
2

esto me funcionó

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
fuente