Могу ли я вручную ограничить% ЦП, используемый процессом?

52

Я хотел бы ограничить количество процессорного времени, выделяемого для определенных процессов (например, Firefox, Safari, ...).

Я не могу понять, почему такие программы, даже когда они не используются (ничего не загружается, нет анимации, работает в фоновом режиме, ...), так ресурсоемки. Почему браузер должен съедать 50% или больше моего процессора? Могу ли я ограничить его до 10%?

Pietro
источник
Это не является прямым ответом на ваш вопрос, но Safari и Firefox обычно не загружают процессор. Вы можете посмотреть, что они могут делать. Возможно, расширение / плагин может быть ответственным за чрезмерное потребление ресурсов, и вы можете отключить его (или удалить, если вы его больше не используете).
Тим Кэмпбелл

Ответы:

7

Это не совсем то, что вы хотели, но, что касается Google Drive и Chrome, это то, что помогло мне:

Google Drive («Резервное копирование и синхронизация»)

  • де-Приоритетность:

    for f in $(pgrep 'Backup and Sync'; pgrep 'FinderSyncAPIExtension'); do renice +20 -p $f; done
    
  • вернуть в нормальное состояние:

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

Хром

  • расставить приоритеты во всех текущих процессах:

    for f in $(pgrep 'Chrome'); do renice +20 -p $f; done
    
  • вернуть в нормальное состояние все текущие процессы:

    for f in $(pgrep 'Chrome'); do renice 0 -p $f; done
    
Ноам
источник
44

cputhrottleэто инструмент, который вам нужен. Вы можете установить его с помощью Homebrew .

Вы можете отслеживать ряд процессов по имени, запустив скрипт Bash ниже. Я не совсем уверен, как превратить это в элемент входа в систему, так как cputhrottleтребует разрешения суперпользователя. Запустите его как скрипт, в рабочем процессе Automator, что угодно:

# 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

[Изменено]

Я добавил другую версию для этого скрипта ( bashскрипт), который может быть полезен для людей, которые хотят ограничить использование процессора для нескольких приложений.

Этот новый скрипт также позволяет вам указать список, содержащий имя приложения и ограничение процессора для него.

Основное отличие состоит в том, что вы можете добавить ограничение процессора для каждого приложения, и оно будет запускаться только один раз для каждого приложения. Я также добавил опцию для уничтожения всех cputhrottleпроцессов.

Скрипт предполагает, что оба cputhrottleи pidofустановлены перед его запуском.

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

Источник:

Fny
источник
3
Как указано в другом комментарии , cputhrottleфорум был удален из Homebrew 17 февраля 2019 года, потому что он больше не работает . Yosemite была последней версией macOS для поддержки cputhrottle.
Казимир
@ Казимир, а теперь что делать?
Петр Самохин
@PeterSamokhin Извините, я не знаю альтернативы. Но я также недавно не искал.
Казимир
15

Вы действительно можете! Есть CPUThrottle , который позволяет указать PID для ограничения.

Обратите внимание, что они пытаются использовать это по какой-то причине, это полезный инструмент, но то, что изо дня в день сделает его лучше или хуже для вас, будет чем-то, что вы обнаружите.

Николас Смит
источник
1
Интересно. Но с помощью этой утилиты мне нужно запустить программу, найти ее PID и вручную использовать cputhrottle. Каждый раз, когда я запускаю его. Есть ли что-то, что позволяет мне сказать системе: «С сегодняшнего дня всегда запускайте эту программу с максимум 25% CPU»?
Пьетро
Насколько я знаю, нет, я только сталкивался с CPUThrottle.
Николас Смит
404 Файл не найден
Андре Леви
11

Хотя это и не прямой ответ на вопрос OP, если у вас есть проблема с тем, что определенный процесс занимает слишком много вашего процессорного времени и делает ваш компьютер непригодным для использования, и вы не возражаете против того, сколько времени потребуется для завершения этого процесса Задача, над которой он работает, вы можете использовать reniceдля изменения приоритета этого процесса, чтобы он вел себя хорошо (отсюда и название).

Во-первых, вам нужно найти PID процесса, который использует ресурсы процессора. Вы можете сделать это в Activity Monitor или в Terminal.app с помощью psкоманды - например, чтобы найти PID браузера Safari, введите:

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

Вторая строка выше - это вывод, а PID в данном конкретном случае - 17452.

Затем следующая задача - изменить приоритет процесса (допустим, мы хотим, чтобы Safari вел себя хорошо). Для этого в Terminal.app введите:

MacBook:~😈  renice -n 10 -p 17452

-nОпция изменяет хороший уровень путем добавления 10 к текущему значению (0 по умолчанию). Диапазон значений от -20 до 20, при этом самое низкое значение означает самый высокий приоритет. Как обычный пользователь, вы можете использовать значения от 0 до 20. Чтобы назначить отрицательное значение, вам нужно иметь привилегии root (например, использовать sudoкоманду). Узнайте больше о niceи reniceнабрав man niceи man reniceв Terminal.app.

niceи reniceне ограничивайте процент использования ЦП для данного приложения как такового, однако они позволяют изменять приоритет планирования или, другими словами, сколько процессорного времени получит процесс. Это все зависит от загрузки процессора в вашей системе, поэтому, если система используется недостаточно, вы, скорее всего, не увидите никакой разницы.

Майк
источник
Есть ли способ увидеть текущий приоритет процесса?
theonlygusti
используйте top или htop для просмотра текущего значения процесса. (brew install htop), (sudo apt установить htop). Вы увидите один из столбцов, содержащих значение.
Тманок
6

Для всего этого есть простой однострочник:

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

Напишите название вашего приложения вместо Chromium и желаемый процент вместо 10, и все готово!

Юрий Насретдинов
источник
Это хорошо работало, хотя она может быть уменьшена до: pgrep Dropbox | sudo xargs -n 1 -I'{}' sh -c 'cputhrottle {} 10 &'. Однако я не уверен, что MacOS поставляется с pgrepустановленным.
bigsweater
5

Это основано на предыдущем ответе, но добавление ловушки для ctrl + c, чтобы удостовериться, что регулируемый процесс остается в состоянии продолжения, и добавление set -eтак, что этот скрипт будет корректно завершаться, если сам процесс завершится:

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
источник
3

Ссылка, которую разместил Николас Смит, больше не работает. Поэтому я нашел еще одно приложение, которое помогает людям, которые ищут его снова. приложение вызывает Apppolice.

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

Джон Уэллс
источник
2
Как и в AppPolice, есть AppTamer ( stclairsw.com/AppTamer ). Одно предостережение: на момент написания этого комментария AppTamer еще не был совместим с OSX Sierra.
Джон Марк Митчелл
Боже мой, что за находка. Только что установил AppTamer. Рад сообщить, что работает фантастически хорошо. Я использую его, чтобы сохранить новый StarCraft ремастеринг в линию, когда я Alt-Tab. Ох, и я забыл упомянуть, я использую macOS Sierra 10.12.6. Спасибо за предложение!
кавалькада
Apppolice был прекращен.
LаngLаngС
Но все еще работает вполне нормально.
Фил Пирожков
3

Это мой последний скрипт, держите в чистоте, команда cputhrottle выполняет только новый, если не существует

#!/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
источник
3

Сценарий, написанный Димитрием, работает хорошо (на macOS), но продолжает работать с ошибками после закрытия приложения. Я изменил его, чтобы он закончил (с сообщением об ошибке о PID не найден):

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
Барт Меердинк
источник
Вероятно, это должно быть изменение, внесенное в первоначальный ответ Дмитрия, чтобы улучшить этот ответ, а не отдельный ответ с (в основном) той же информацией.
ФСБ
2

этот ш работал на меня

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
Дмитрий Булдаков
источник