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

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 carga, sin animaciones, ejecutándose en segundo plano, ...), consumen tantos recursos. ¿Por qué un navegador debe comer el 50% o más de mi CPU? ¿Puedo limitarlo al 10%?

Respuestas (16)

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

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

  • despriorizar:

    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
    
+1: esta es la respuesta más correcta que se ofrece porque 'agradable' es parte del sistema operativo y se relaciona directamente con el algoritmo utilizado por el programador del kernel para decidir qué proceso obtiene la siguiente porción de tiempo de CPU. Siempre funcionará en cualquier sistema Unix o Linux y no depende de ningún complemento de terceros. La ventaja es que esos procesos pueden usar más CPU si no compiten por el tiempo de CPU con otros procesos.

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]

Agregué 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 CPU para ella.

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

El script asume que ambos cputhrottley pidofestán instalados 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:

Como se señaló en otro comentario , cputhrottlela fórmula de Homebrew se eliminó el 17 de febrero de 2019 porque ya no funciona . Yosemite fue la última versión de macOS compatible con cputhrottle.
@Casimir y ahora que hacer?
@PeterSamokhin Lo siento, no conozco una alternativa. Pero tampoco he buscado recientemente.
Simplemente use Apppolice: github.com/AppPolice/AppPolice/releases No estoy seguro de qué comando de terminal está usando Apppolice, pero el código fuente está disponible.
CPUThrottle se puede encontrar aquí: medium.com/@sbr464/…
AppPolice funciona bien con MacOs Big Sur. Pude reducir OneDrive al 30% para que la velocidad del ventilador se mantuviera muy baja.

¡Ciertamente puedes! Está 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 mejorará o empeorará para usted en el día a día, será algo que descubra.

Interesante. Pero con esta utilidad tengo que iniciar un programa, encontrar su(s) PID(s) y usar cputhrottle manualmente. Cada vez que lo lanzo. ¿Hay algo que me permita decirle al sistema: “A partir de hoy siempre ejecute este programa con un máximo de 25% de CPU”?
Que yo sepa, no, solo me he encontrado con CPUThrottle.
404 Archivo no encontrado
Como se publicó anteriormente, CPU Throttle está aquí: medium.com/@sbr464/…

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 hace que su computadora quede inutilizable, y no le importa cuánto tiempo lleva ese proceso para terminar el tarea en la que está trabajando, puede usar renicepara alterar la prioridad de ese proceso, haciendo que se comporte bien (de ahí el nombre).

Primero, debe encontrar el PID del proceso que está utilizando los recursos de la CPU. Puede hacerlo en el Monitor de actividad 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 queremos que Safari 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, donde el valor más bajo significa la prioridad más alta. Como usuario ordinario, puede usar valores de 0 a 20. Para asignar un valor negativo, debe tener privilegios de root (por ejemplo, usar 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 determinada 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.

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

El enlace que publicó Nicholas Smith 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 Apppolice.

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

Similar a AppPolice, existe AppTamer ( stclairsw.com/AppTamer ). Una palabra de advertencia: al momento de escribir este comentario, AppTamer aún no es compatible con OSX Sierra.
Madre mía, qué hallazgo. Acabo de instalar AppTamer. Encantado de informar que funciona fantásticamente bien. Lo uso para mantener el nuevo StarCraft remasterizado en línea cuando quito la tecla Alt. Ah, y olvidé mencionar que estoy ejecutando macOS Sierra 10.12.6. ¡Gracias por la sugerencia!
Apppolice ha sido descontinuada.
Pero todavía funciona bastante bien.
Puedo confirmar que AppPolice funciona en 10.15.1
AppPolice también es completamente gratuito y funciona en macOS Catalina, a diferencia de AppTimer.
Brillante hallazgo. Apppolice es mucho menos complicado (y por lo tanto más libre de problemas) que Fancypants AppTamer. Aquí está mi mini revisión: Encontré el lanzamiento aquí en GitHub, instalado, limité Lightroom Classic al 1600 %, vi que el uso de la CPU cayó del 2200 % al 1473 % inmediatamente. Hacer que mi computadora vuelva a funcionar mientras Lightroom importa 150,000 fotos. Podría ver esto como muy útil para los renderizados de DaVinci Resolve también. Tan fácil de usar. Brillante. PD. Normalmente no uso Lightroom, prefiero FastRawViewer y DxO PhotoLab pero necesito un catálogo de todo para fusionar algunos discos duros.
La tercera vez que publico esto, disculpas, pero sigue apareciendo: El CPUThrottle original está aquí: medium.com/@sbr464/… Hay otros, por supuesto.
AppPolice funciona bien con MacOs Big Sur. Pude reducir OneDrive al 30 % para que la velocidad del ventilador se mantuviera muy baja

Esto se basa en una respuesta anterior, pero se agrega la trampa para ctrl+c para asegurarse de que el proceso que se está acelerando se deje en un estado de continuación, y se agrega set -epara que este script salga limpiamente si el proceso en sí mismo sale:

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

Hay una sola línea 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!

Esto funcionó bien, aunque se puede reducir a: pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. Sin embargo, no estoy seguro de si macOS viene con pgrepinstalado.
cputhrottleya no funciona en 10.14 Mojave
cputhrottlefunciona en 10.15, por lo que si no funcionaba en Mojave, podría funcionar ahora.

esto funcionó para mí

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

El script que escribió Dimitri funciona bien (en macOS), pero sigue ejecutándose con errores después de que se cierra la aplicación. Lo cambié para que termine (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
Probablemente debería ser una edición realizada en la respuesta original de Dimitri, para mejorar esa respuesta, y no una respuesta separada con (básicamente) la misma información.

Acabo de encontrar CPUSetter , que para mí es mejor que cualquiera de las opciones anteriores.

Esta aplicación viene con control adicional sobre hyperthreading, número de núcleos usados, preferencia de CPU física y configuraciones separadas relacionadas con la energía.

Estaba usando esto con cierto éxito, hasta que actualicé a Monterrey. Ahora no se ejecuta o, lo que es peor, congela toda la máquina y me cierra la sesión.

Usar cpulimit

brew install cpulimit

y usar comocpulimit -l (Number of threads x 100) -p (PID)

cpulimit -l 200 -p 947

donde 200 significa dos hilos.

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

Yo uso AppPolice . Es un poco inestable y torpe, pero como no hay otras opciones y los problemas son menores, creo que es una solución decente. Trabaja en Catalina.

Excepto que hay otras opciones, como AppTamer , que en realidad todavía está en desarrollo.
esto funcionó para mí
En macOS Mojave, no encuentro que AppPolice sea inestable en absoluto.

cputhrottle(consulte las respuestas de fny y Nicholas Smith) funciona en macOS 10.15 siempre que firme el ejecutable.

Puede hacerlo de manera simple y rápida siguiendo los pasos que se enumeran aquí: https://web.archive.org/web/20191223180139/https://sourceware.org/gdb/wiki/PermissionsDarwin

Puede descargarlo cputhrottleaquí: http://www.willnolan.com/cputhrottle/cputhrottle.html

Donde encontraría find “cputhrottle”. Y es mejor incluir los elementos esenciales del enlace porque a menudo se vuelven obsoletos y la respuesta es inútil.
@Alan, gracias. Agregué algunos enlaces adicionales. Hubiera dejado mi respuesta como un comentario originalmente sobre las otras respuestas, pero no tengo suficiente reputación.
Ese es un CPUThrottle diferente, que yo sepa. El original mencionado anteriormente, que estaba en Homebrew, se puede encontrar aquí: medium.com/@sbr464/… No he probado el de Will Nola: todo lo que veo es que es un ejecutable significativamente más pequeño. ¿Alguna idea de por qué?
@JPGConnolly el artículo de medium.com enlaza con el sitio de Will Nolan. En cuanto a los tamaños binarios, cuando lo construí para mi máquina con march=native, el ejecutable era <20KiB, por lo que puede haber mucha sobrecarga según la configuración de compilación.

Esta secuencia de comandos es lo que uso: este código ejecuta la aplicación a toda velocidad cuando la pantalla está bloqueada; de lo contrario, se ejecuta aproximadamente 50%a la misma velocidad. En mi MacBook Pro M1 Pro, esto funciona muy bien para una aplicación que normalmente requiere 800%CPU. La computadora sigue respondiendo mientras la aplicación se ejecuta en segundo plano.

#!/bin/bash

PID=$1

if [ "$PID" == "" ]; then
    echo "no process id given! Use something like:"
    echo "   ps -ef|grep whatever"
    exit
fi

# exit if any command fails
set -e
# continue running when we exit this script
trap 'kill -CONT '$PID'; exit' EXIT HUP TERM INT

status=none
prevstatus=none

while true; do
    if [ "$status" != "$prevstatus" ]; then
        date
        echo $status
        prevstatus=$status
    fi
    if python -c 'import sys,Quartz; d=Quartz.CGSessionCopyCurrentDictionary(); print d'|grep "CGSSessionScreenIsLocked = 1">/dev/null; then
        if [ "$status" != "running" ]; then
            kill -CONT $PID;
            status=running
        fi
        sleep 1;
    else
        if [ "$status" != "stopped" ]; then
            kill -STOP $PID;
            status=stopped
        else
            for _ in {1..10}; do
                sleep 0.05;
                kill -CONT $PID;
                sleep 0.05;
                kill -STOP $PID;
            done
        fi
    fi;
done

Algunos otros han mencionado App Tamer y el hecho de que AppPolice es gratis. Eso es genial, y si AppPolice satisface sus necesidades, ¡puede estar feliz!

Pero si usa su computadora profesionalmente, el tiempo que ha perdido en los procesos que consumen recursos probablemente sea mucho más alto que el pequeño costo de AppTamer.

Todas las opciones que ofrece AppTamer que no ofrece AppPolice están ahí por una razón.

AppPolice requiere que configure cada proceso individualmente. Lo único que puede hacer globalmente es dejar de acelerar. (Lo que podría hacerse cerrándolo de todos modos).

AppTamer, por otro lado, puede distinguir entre aplicaciones en primer plano y en segundo plano, de modo que puede acelerar una aplicación en segundo plano pero darle todo el poder en primer plano. Navegadores, por ejemplo.

domador de aplicaciones