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%?
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
cputhrottle
es 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 cputhrottle
requiere 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 bash
script), 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 cputhrottle
procesos.
El script asume que ambos cputhrottle
y pidof
está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:
cputhrottle
la 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
.¡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.
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 renice
para 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 ps
comando, 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 -n
opció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 sudo
comando). Lea más sobre nice
y renice
escribiendo man nice
y man renice
en Terminal.app.
nice
y renice
no 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.
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.
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 -e
para 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!
pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'
. Sin embargo, no estoy seguro de si macOS viene con pgrep
instalado.cputhrottle
ya no funciona en 10.14 Mojavecputhrottle
funciona 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
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.
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.
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 cputhrottle
aquí: http://www.willnolan.com/cputhrottle/cputhrottle.html
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.
tim campbell