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

47

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

    
pregunta Pietro 14.09.2011 - 11:49

10 respuestas

5

No es exactamente lo que querías, pero, en lo que respecta a google drive y chrome, esto fue el truco para mí:

for f in $(pgrep Drive; pgrep Chrome); do renice -n +20 -p $f ; done
    
respondido por el Noam 10.08.2014 - 07:02
40

cputhrottle es la herramienta que necesita. Puede instalarlo con Homebrew .

Puede supervisar una serie de procesos por nombre ejecutando el script Bash a continuación. No estoy 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]

He agregado una versión diferente para este script (un script bash ), 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 contenga el nombre de la aplicación y el límite de la CPU para ello.

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

El script asume que tanto cputhrottle como 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:

respondido por el fny 05.05.2012 - 05:37
15

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

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

    
respondido por el Nicholas Smith 14.09.2011 - 12:15
10

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 CPU y hace que su computadora sea inutilizable, y no le importa cuánto tiempo lleva ese proceso para finalizar la 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, necesita 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 comando ps , por ejemplo. para encontrar el PID del navegador Safari, escriba:

MacBook:~                                    
respondido por el mike 10.08.2014 - 09:25
6

Hay una línea simple para hacer todo eso:

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

¡Escribe el nombre de tu aplicación en lugar de Chromium y el porcentaje deseado en lugar de 10 y listo!

    
respondido por el Yuriy Nasretdinov 20.09.2017 - 10:38
5

Esto se basa en una respuesta anterior, pero agregar la captura para ctrl + c para asegurarse de que el proceso que se está restringiendo se deja en un estado de continuación, y agregar set -e para que esta secuencia de comandos salga limpiamente si el proceso 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
    
respondido por el user100375 21.02.2016 - 04:48
3

Este es mi script final, mantenga limpio el comando cputhrottle solo ejecuta 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
    
respondido por el Alejo JM 06.05.2016 - 08:52
3

El script que escribió Dimitri funciona bien (en macOS), pero se sigue ejecutando con errores una vez 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
    
respondido por el Bart Meerdink 04.08.2018 - 13:33
2

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

enlace

    
respondido por el John Wells 10.07.2014 - 17:33
1

este sh 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
    
respondido por el Dmitriy Buldakov 18.10.2014 - 19:04

Lea otras preguntas en las etiquetas