Я бы хотел установить регулятор масштабирования частоты процессора для всех ядер одновременно вместо того, чтобы делать это отдельно для каждого ядра. Есть ли способ сделать это?
(я знаю, что было бы легко вывести губернатора на /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
, но я не ищу нестандартного решения.)
Я много гуглил, и я думаю, что это просто невозможно,поэтому я добавил следующий однострочный файл в свой .bashrc
:
function setgov ()
{
echo "$1" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
}
Теперь я могу запустить что-то вроде setgov ondemand
, и все ядра переключатся на ondemand губернатор.
Вы можете сделать это для всех ядер одновременно, запустив
sudo cpupower frequency-set --governor performance
Можно также добавить завершение кода 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
Я все еще новичок в Linux, но разве вы не думаете, что cpufrequtils позволяет делать это, используя (он не входит в состав ОС Ubuntu, но есть в репозитории)
sudo apt-get install cpufrequtils
sudo cpufreq-set -r -g performance
-r
используется для установки изменений для всех («связанных со всем оборудованием») ядер самая короткая команда для смены регулятора всех ядер следующая:
sudo bash -c 'for ((i=0;i<$(nproc);i++)); 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 я создал простой скрипт 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
Как я установил это, так как регулятор по умолчанию возвращается в режим энергосбережения примерно через 30 секунд, начиная с Ubuntu 16.04 или более поздней версии (я использую Ubuntu Mate);
Поместите это (одна строка) кода (спасибо, любезно предоставлено switch87 в предыдущем ответе)
sleep 60 && bash -c 'for i in {0..7}; выполнить cpufreq-set -c $ i -g performance; сделанный'
в файл в каталоге
/etc/rc.local
Моя - это строка над «exit 0» и раскомментированная под прокомментированными.
«rc.local» для тех, кто не знает, он запускает команду как sudo. Кажется, что любая команда для смены регулятора должна быть запущена как sudo.
Это позволяет регулятору вернуться в режим энергосбережения и запускает код как sudo через 60 секунд, чтобы вернуть его к производительности.
Измените " 60 "(в коде, который вы копируете) на любое время (в секундах. 60 = 60 секунд = 1 минута) вам нужно отложить команду и" производительность "(в командной части) до того, на какой регулятор вы хотите его изменить.
За часы и часы поиска я не нашел более постоянного решения этой проблемы, чем это. Я полагаю, что через пару минут он находится в режиме энергосбережения, если это лучшее решение, которое я нашел, верно? Правильно.
Не лучшее исправление, но оно делает его несколько постоянным после небольшого перехода на режим энергосбережения. Если вы хотите сразу загрузиться и перейти в игру или что-то еще, вам придется подождать минуту кода, который вы только что ввели, чтобы переключить его обратно из режима энергосбережения или уменьшить время на нем (в зависимости от того, сколько времени потребуется, чтобы все запустилось, чтобы оно вернулось к нормальной производительности).
И, как всегда, чтобы вернуться к значениям по умолчанию (я видел некоторые проблемы с перегревом компьютеров людей, поэтому они могли сначала установили для него режим энергосбережения) просто удалите код из rc.local и перезагрузите или переключите его обратно вручную с помощью переключателя индикатора значка процессора или запустите;
sudo /etc/init.d/cpufrequtils restart
в терминале и / или перезагрузите.
иногда недостаточно установить регулятор. Мне также пришлось установить переменные MAX и MIN для частоты, потому что в политиках масштабирования они были установлены на минимум, поэтому я делаю следующее: 1. Получите минимальную и максимальную частоты масштабирования от CPU 0. 2. Разделите их на миллион, чтобы получить частоту в ГГц. 3. Передайте результат через bc , чтобы я мог получить результат в формате с плавающей запятой (BASH может обрабатывать только целые числа) - scale = 1 - это количество десятичных знаков. 4. Убедитесь, что в командной строке указан регулятор масштабирования. 5. Если нет, установите ONDEMAND - сэкономьте деньги на холостом ходу. 6. Выполните команду cpufreq-set в цикле на всех CPU-s
#!/bin/bash
echo "Setting all CPUs to " "$@"
CPUINFO_MIN_FREQ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq)
CPUINFO_MAX_FREQ=$(cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq)
MIN=$(echo "scale=1; $CPUINFO_MIN_FREQ / 1000000" | bc)"G"
MAX=$(echo "scale=1; $CPUINFO_MAX_FREQ / 1000000" | bc)"G"
echo "Minimum frequency: " $MIN ", Maximum frequency: " $MAX
GOVERNOR=@0
if [ $# -eq 0 ]
then
echo "No arguments supplied, using ONDEMAND governor"
GOVERNOR="ondemand"
else
echo "Governor " $1 " supplied"
GOVERNOR=$1
fi
for ((i=0;i<$(nproc);i++));
do cpufreq-set -c $i -r -g $GOVERNOR --min $MIN --max $MAX;
done