Как установить регулятор масштабирования частоты процессора для всех ядер одновременно?

38

Я бы хотел установить регулятор масштабирования частоты процессора для всех ядер одновременно, а не делать это отдельно для каждого ядра. Есть ли способ сделать это?

(Я знаю, что было бы легко присоединиться к губернатору /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor, но я не ищу нестандартного решения.)

htorque
источник
2
Под «нестандартным решением» вы подразумеваете, что сценарий оболочки недопустим, это должна быть встроенная кнопка GUI?
jg-faustus
Мне просто интересно, существует ли уже решение в стандартной установке (не нужно иметь графический интерфейс).
htorque
Проверьте эту страницу: idebian.wordpress.com/2008/06/22/cpu-frequency-scaling-in-linux в разделе «реализация debian»: по-видимому, можно изменить загрузочный параметр по умолчанию, и есть инструмент пользовательского пространства, называемый powernowd. (Это скорее комментарий, чем ответ, потому что пост за 2008 год, и я не проверял, работает ли он по-прежнему ...)
jg-faustus

Ответы:

26

Я по-прежнему Linux noob, но вы не думаете, что cpufrequtils позволяет вам делать это с помощью (его нет в Ubuntu OS, но есть в репозитории)

sudo apt-get install cpufrequtils
sudo cpufreq-set -r -g performance
  • Этот -rфлаг используется для установки изменений для всех ядер (связанных со всем оборудованием).
user49449
источник
6
Опция -r относится не ко всем ядрам. Мы должны указать номер процессора с помощью опции -c <число>, однако этот скрипт сделает это для всех процессоров за один раз: for ((i = 0; i <$ (nproc); i ++)); выполнить cpufreq-set -c $ i -r -g performance; сделано
Шри
6
Точно, @Sri прав. cpufreq-setна самом деле не хватает в конечном итоге простой, но необходимой функциональности. Многие люди, как ясно показывают эти счетчики голосов, просто не знают об этом, потому что его описание просто вводит в заблуждение, чтобы завершить его.
Пой
2
Кто дает эти +1 без тестирования ???? Это не работает вообще. Я разместил самое простое рабочее решение, которое я смог найти.
switch87
20

Я много гуглил и думаю, что это просто невозможно, поэтому я добавил следующую строку .bashrc:

function setgov ()
{
    echo "$1" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}

Теперь я могу запустить что-то вроде setgov ondemandи все ядра переключатся на регулятор по требованию .

htorque
источник
2
Это не работает, так как файл scaling_governor принадлежит пользователю root и имеет ограниченные разрешения. Изменение разрешений не всегда рекомендуется.
Шри
Пожалуйста, смотрите альтернативный сценарий в моем комментарии к ответу пользователя 49449.
Шри
6

кратчайшая команда для изменения регулятора всех ядер следующая:

sudo bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'

Вы можете добавить его в .bashrc, как упомянуто htorque, вам нужно будет запустить его как root sudo setgov performance:

function setgov ()
{
     for i in {0..7}; 
     do 
         cpufreq-set -c $i -g $1; 
     done
}
switch87
источник
2

Можно также добавить завершение кода bash, пока мы на этом:

function setgovernor () {
    echo "$1" | sudo tee 
    /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}
complete -W "$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)" setgovernor
Рэй Маланга
источник
2

Способ, которым я установил это, чтобы придерживаться, так как регулятор по умолчанию возвращается в powersave приблизительно через 30 секунд теперь, начиная с Ubuntu 16.04 или более поздней версии (я нахожусь на Ubuntu Mate);

  1. Поместите этот (одну строку) код (спасибо, любезность switch87 в предыдущем ответе)

    sleep 60 && bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'
    
  2. в файл в каталоге

    /etc/rc.local
    

Шахта - это линия выше «выхода 0» и без комментариев, под комментариями.

«rc.local» для тех, кто не знает, запускает команду как sudo. Кажется, что любая команда, чтобы изменить губернатора, должна быть запущена как sudo.

Это позволяет регулятору вернуться к powersave и через 60 секунд запустить код как sudo, чтобы вернуть его к производительности.

Измените «60» (в коде, который вы копируете) на любое время (в секундах. 60 = 60 секунд = 1 минута), в котором вам нужно отложить команду и «производительность» (в командной части) до того, на какой регулятор вы ее хотите изменить на.

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

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

И, как всегда, чтобы вернуться к настройкам по умолчанию (я видел некоторые проблемы с перегревом ПК людей, из-за чего они, возможно, по умолчанию установили его по умолчанию для powersave), просто удалите код из rc.local и перезагрузите или переключите его обратно вручную с помощью переключателя или значка индикатора процессора;

 sudo /etc/init.d/cpufrequtils restart

в терминале и или перезагрузись.

Roiikka
источник
1

Вы можете сделать это для всех ядер одновременно, запустив

sudo cpupower frequency-set --governor performance
Мартин Андерссон
источник
0

Основываясь на ответе switch87, я сделал простой скрипт cpufreq-set-all, который позволит делать другие cpufreq-setвещи со всеми процессорами:

   #!/bin/bash
   MAX_CPU=$((`nproc --all` - 1))
   for i in $(seq 0 $MAX_CPU); do
       echo "Changing CPU " $i " with parameter "$@;
       cpufreq-set -c $i $@ ;
   done

Теперь он может быть вызван (после chmod +x, конечно) так:

cpufreq-set-all -g powersave

или

cpufreq-set-all -f 800Mhz
side2k
источник