Уже давно передо мной встал вопрос - как бороться с перегревом ноутбука?
Я периодически устанавливаю разные дистрибутивы "на попробовать", интересно, что нового у "соседей", да и приходится часто чинить компьютеры и решать проблемы (и Виндовса и Линукса), а в разных дистрибутивах одни и те же проблемы решаются по разному.
Что я заметил, уже давно и во всех дистрибутивах пропала регулировка температуры, ядро и все системные сервисы типа acpid, cpufreqd, upower и pm-utils, laptop-mode-tools - все они занимаются только отслеживанием состояния батареи, нажатия кнопки выключения и закрытия крышки и частоты процессора. При чём иногда установлено несколько дублирующих сервисов и всё равно, для лучшего энергосбережения надо доустановить powertop и там нужные галочки поставить и то, не ясно, работает ли? Бардак! И при этом НИ ОДИН сервис или модуль ядра не занимается температурой, только выключение компьютера когда процессор достиг критической температуры.
Не верите? Ну, доказывать я не буду, а поделюсь ценной находкой, которую нашёл на просторах интернета. К сожалению, после проведённых экспериментов и проверки работы, снова найти автора этого скрипта мне не удалось, Злобный гугл спрятал его от меня. Но я домаю он был бы не против публикации, так как писал, мол, пользуйтесь все.
Итак текст скрипта:
Код: Выделить всё
#!/bin/bash
# temp_throttle.sh max_temp
# USE CELCIUS TEMPERATURES.
if [ $# -ne 1 ]; then
# If tempurature wasn't given, then print a message and exit.
echo "Please supply a maximum desired temperature in Celcius." 1>&2
echo "For example: temp_throttle.sh 60" 1>&2
exit 2
else
#Set the first argument as the maximum desired temperature.
MAX_TEMP=$1
fi
# The frequency will increase when low temperature is reached.
let LOW_TEMP=$MAX_TEMP-3
CORES=$(nproc) # Get number of CPU cores.
echo -e "Number of CPU cores detected $CORES\n"
# For some reason the temperatures internally have three zero's behind them.
MAX_TEMP=${MAX_TEMP}000
LOW_TEMP=${LOW_TEMP}000
declare -a FREQ_LIST=($(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies))
let CURRENT_FREQ=1
function set_freq {
echo ${FREQ_LIST[$1]}
for((i=0;i<$CORES;i++)); do
echo ${FREQ_LIST[$1]} > /sys/devices/system/cpu/cpu$i/cpufreq/scaling_max_freq
done
}
function throttle {
if [ $CURRENT_FREQ -ne $((${#FREQ_LIST[@]}-1)) ]; then
let CURRENT_FREQ+=1
echo -n "throttle "
set_freq $CURRENT_FREQ
fi
}
function unthrottle {
if [ $CURRENT_FREQ -ne 0 ]; then
let CURRENT_FREQ-=1
echo -n "unthrottle "
set_freq $CURRENT_FREQ
fi
}
function get_temp {
# Get the system temperature.
# If one of these doesn't work, the try uncommenting another.
TEMP=$(cat /sys/class/thermal/thermal_zone0/temp)
#TEMP=$(cat /sys/class/hwmon/hwmon0/temp1_input)
#TEMP=$(cat /sys/class/hwmon/hwmon1/device/temp1_input)
}
while true; do
get_temp
if [ $TEMP -gt $MAX_TEMP ]; then # Throttle if too hot.
throttle
elif [ $TEMP -le $LOW_TEMP ]; then # Unthrottle if cool.
unthrottle
fi
sleep 3
done
Проверяем для начала - работает ли управление частотой процессора вообще? Запустите консоль (в стартовом меню ищите) напишите su и жмите Enter, введите пароль администратора root. Теперь введите команду: cpupower -c all frequency-info если увидите что-то типа
Значит всё в порядке. У меня, как видите, работает модуль powernow-k8 а политика смены частоты ondemand Максимальная доступная частота 2000, а максимальная разрешённая частота - 1000MHz (у меня уже работает этот скрипт, включен онлайн фильм, компьютер нагрелся, поэтому выше 1000 подниматься не разрешает). У вас модули могут быть и другие (acpi-cpufreq, например), если же модуль не доступен или политика другая - это отдельный разговор.analyzing CPU 0:
driver: powernow-k8
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 1000 ns.
hardware limits: 500 MHz - 2.00 GHz
available frequency steps: 2.00 GHz, 1000 MHz, 500 MHz
available cpufreq governors: conservative, userspace, powersave, ondemand, performance
current policy: frequency should be within 500 MHz and 1000 MHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 1000 MHz (asserted by call to hardware).
boost state support:
Supported: no
Active: no
analyzing CPU 1:
driver: powernow-k8
CPUs which run at the same hardware frequency: 1
CPUs which need to have their frequency coordinated by software: 1
maximum transition latency: 1000 ns.
hardware limits: 500 MHz - 2.00 GHz
available frequency steps: 2.00 GHz, 1000 MHz, 500 MHz
available cpufreq governors: conservative, userspace, powersave, ondemand, performance
current policy: frequency should be within 500 MHz and 1000 MHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 1000 MHz (asserted by call to hardware).
boost state support:
Supported: no
Active: no
Если всё в порядке, нажимаем Alt+F2 появляется строка пишем kdesu dolphin, вводим пароль администратора root . открывается диспетчер файлов с правами root (никогда не пользуйтесь им просто так). Выходим в корневую папку идём в /usr/local/bin И в этой папке правой кнопкой мыши - Создать - текстовый файл пишем имя - temp_throttle.sh жмём Enter. теперь правой кнопкой мыши на этом файле - Свойства - Права - поставить галочку Исполняемый файл и OK. Теперь открываем этот файл, вставляем текст скрипта и сохраняем его. Выходим опять в корневую папку и идём в /etc/pm/power.d создаём тут файл tenp, опять делаем его исполняемым и вставляем следующий текст:
Код: Выделить всё
#!/bin/bash
# ограничитель температуры
needed_module="" #Тут Вставьте нужный драйвер в кавычках
governor="conservative" # Политика энергосбережения
temperature=88 # поставьте максимальную температуру, по умолчанию 88 градусов
cpufreq=/sys/bus/cpu/devices/cpu0/cpufreq #Тут оставил место для изменения пути, если надо в других дистрибутивах
if [${needed_module} != ""] # проверяем, выбран ли модуль ядра
then
if ! [ -e ${cpufreq} ] # если такая папка не существует, значит модуль не загружен
then modprobe ${needed_module} # загружаем
fi
fi
cpupower -c all frequency-set -g ${governor} # устанавливаем нужную политику
killall temp_throttle.sh #если до этого был запущен регулятор температуры, убиваем его
# и запускаем снова
/usr/local/bin/temp_throttle.sh ${temperature} &
exit 0
- acpi-cpufreq - подходит очень многим процессорам.
powernow-k7 и powernow-k8 - процессоры AMD (не знаю как с бульдозерами, не пробовал)
и иногда попадается p4_clockmod - старые процессоры от Intel.
После выбора модуля выберите политику энергосбережения governor
- ondemand - стоит обычно по умолчанию. При его работе процессор быстро реагирует на нагрузку системы и разгоняется сразу до максимума и тормозит до минимума.
conservative - разгоняется и тормозит плавнее, чаще задерживается на промежуточных стадиях
powersave - тут всё просто, ставится минимальная частота и поползли (смысла ставить его нет)
performance - Интересный вариант, максимальная мощность. Если включите этот режим, процессор будет работать на полную мощность, но наш регулятор температуры всё равно будет его держать в узде, снижая частоту при повышении температуры, хотя тут никаких гарантий.
Сохраните файл. Теперь просто выдерните шнур питания ноутбука и вставьте обратно. Ну и осталось проверить работу скрипта запустив всё самое жручее и тяжёлое, например несколько флэш роликов одновременно или world of tanks через wine.
Как это работает? Гениально!
В отличие от других скриптов, он не берётся дублировать функции ядра или перетягивать на себя одеяло, а просто ограничивает максимально разрешённую частоту процессора если температура достигает указанной, хотя уверен, разработчики Росы могли бы его и доработать, но и в таком виде он отлично работает. Теперь, по достижении высокой температуры компьютер начнёт тормозить (не так уж и сильно) а не с разгону вырубаться.
Всем привет!
Автору скрипта - долгих лет жизни

P.S. Модераторы, перенесите пожалуйста в более подходящий раздел. Я хотел в раздел Система, но он закрыт.
Upd. поправил ошибку, был не правильный путь. Перепроверьте
Upd.2 перепроверьте опять, я добавил во второй скрипт функции загрузки модуля и изменил инструкцию. Теперь переносите куда хотите.