Чи можу я вручну обмежити% CPU, який використовується процесом?


52

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

Я не можу зрозуміти, чому такі програми, навіть коли вони не використовуються (нічого завантаження, ніяких анімацій, запуску у фоновому режимі, ...), так голодні ресурси. Чому браузер повинен з'їдати 50% або більше мого процесора? Чи можу я обмежити його 10%?


Це не є безпосередньо відповіддю на ваше запитання, але Safari та Firefox зазвичай не голодні процесору. Можливо, ви захочете вивчити, що вони можуть робити. Можливо, розширення / плагін може спричинити за собою надмірне споживання ресурсів, і ви, можливо, зможете його відключити (або видалити, якщо ви більше не використовуєте його)
Тім Кемпбелл

Відповіді:


7

Це не зовсім те, що ви хотіли, але, що стосується Google Drive і хромування, це зробило для мене трюк:

Диск Google ("Резервне копіювання та синхронізація")

  • зняти пріоритет:

    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потрібні дозволи суперпользователя. Запускайте його як сценарій у робочому процесі автоматизатора, будь-що:

# 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скрипт), яка може бути корисною людям, які прагнуть обмежити процесор на кілька додатків.

Цей новий сценарій також дозволяє вказати список, що містить ім'я програми та ліміт CPU для цього.

Основна відмінність полягає в тому, що ви можете додати ліміт процесора на додаток, і він буде працювати лише один раз у програмі. Я також додав можливість вбити всі 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."

Джерело:


3
Як вказувалося в іншому коментарі , cputhrottleфорумчани були видалені з домашньої книги 17 лютого 2019 року, оскільки вона більше не працює . Yosemite була останньою версією macOS для підтримки cputhrottle.
Казимир

@Casimir і тепер, що робити?
Петро Самохін

@PeterSamokhin Вибачте, я не знаю альтернативи. Але я також нещодавно не шукав.
Казимир

15

Ви дійсно можете! Існує CPUThrottle , який дозволяє вказати PID для обмеження.

Зауважте, вони намагаються використати стільки з причини, що це корисний інструмент, але чи буде це вам краще чи гірше для вас щодня, це буде щось, що ви відкриєте для себе.


1
Цікаво. Але за допомогою цієї утиліти я повинен запустити програму, знайти її PID (и) та вручну використовувати cputhrottle. Кожен раз, коли я його запускаю. Чи є щось, що дозволяє мені сказати системі: "З сьогоднішнього дня завжди запускайте цю програму з максимумом 25% процесора"?
П'єтро

Наскільки я не знаю, я лише коли-небудь стикався з CPUThrottle.
Ніколас Сміт

404 Файл не знайдено
Андре Леві

11

Хоча це не пряма відповідь на питання ОП, якщо у вас виникають проблеми з певним процесом, який займає занадто багато часу вашого процесора та робить ваш комп'ютер непридатним для використання, і ви не заперечуєте, скільки часу цей процес займе, щоб закінчити Завдання над якою працює, ви можете використовувати reniceдля зміни пріоритету цього процесу, примушуючи його вести себе добре (звідси і назва).

По-перше, вам потрібно знайти PID процесу, який використовує ресурси CPU. Ви можете це зробити в Моніторі діяльності або в 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команда use ). Дізнайтеся більше про niceі reniceпо типізації man niceта man reniceв Terminal.app.

niceі reniceне обмежують відсоток CPU, доступний даній програмі, сам по собі вони дозволяють змінити пріоритет планування або іншими словами, скільки часу отримає процес. Це все відносно завантаження процесора у вашій системі, тому, якщо система використовується недостатньо, ви, швидше за все, не побачите різниці.


Чи є спосіб побачити поточний пріоритет процесу?
theonlygusti

використовуйте top або htop для перегляду поточного значення файлу. (brew install htop), (sudo apt install 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 &'. pgrepОднак я не впевнений, чи встановлено macOS із встановленим.
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

3

Посилання, яке розмістив Ніколас Сміт, більше не працює. Тому я знайшов ще одне додаток, яке робить фокус для людей, які знову шукають його. додаток викликає Apppolice.

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


2
Подібно до AppPolice, існує AppTamer ( stclairsw.com/AppTamer ). Одне слово обережності: на мій момент написання цього коментаря AppTamer ще не сумісний з OSX Sierra.
Джон Марк Мітчелл

О мій, яка знахідка. Щойно встановлений AppTamer. Радий повідомити про твори фантастично добре. Я використовую його, щоб утримувати нову StarCraft у відповідному режимі, коли я вкладаю альт-вкладку. О, і я забув згадати, я запускаю macOS Sierra 10.12.6. Дякую за пропозицію!
кавалькада

Apppolice було припинено.
LаngLangС

Але все одно працює цілком чудово.
філ пірожков

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

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

Це, мабуть, має бути редакція, зроблена за оригінальною відповіддю Димитрія, щоб вдосконалити цю відповідь, а не окремою відповіддю (в основному) тієї ж інформацією.
fsb

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.