Решение проблемы перегрева ноутбуков

Материал из Rosalab Wiki
Перейти к: навигация, поиск

"Проба пера". не хватает форматирования и глаза грамотного редактора. Ругайте на чём свет стоит, подавайте идеи, проверяйте. И не молчите если что не так


Владельцы лэптопов (или ноутбуков, кому как удобнее), часто испытывают проблемы с охлаждением, тут сказывается недостаток места в корпусе и если охлаждение спроектировано не оптимально или электроника не качественная, то у пользователя рано или поздно появляются проблемы. Вентилятор гудит на полную мощность, хотя Вы ничего не делаете, а то и вовсе выключается. Раз Вы попали на эту страницу, значит этот вопрос Вас волнует. Что же, давайте разберёмся с этим вопросом. Если Вы начинающий пользователь, не бойтесь, я постараюсь сделать всё максимально доступно и сильно не вдаваться в технические вопросы.
Расставим точки над i - Описаное решение на 100% подходит Роса линуксу с рабочим окружением KDE, если у Вас другой дистрибутив или рабочее окружение, то некоторые команды следует заменить. Рассказывать про все варианты я не буду, это просто собьёт с толку.
Чистка кулеров (вентиляторов) тоже не входит, в руководство, на счёт этого скажу просто - кулер надо почистить В ПЕРВУЮ ОЧЕРЕДЬ и если не умеете, лучше отнесите в мастерскую, там его почистят, поменяют пасту и если что - переберут. (но не слушайте их, если скажут что линукс это не правильно, они его просто не знают)

Как наблюдать за температурой

Запускаем системный монитор. Для этого нажмите на значок РокетЛаунчера (меню запуска приложений внизу слева на панели) и найдите Системный монитор и запустите его.
В список процессов можно сортировать по любому из столбцов
Если не получается, не беда, вверху меню есть строка поиска, просто напишите в ней системный монитор он и появится. Что мы видим? список запущеных процессов, давайте сразу посмотрим, кто "ест" больше всех - нажмите вверху столбца % ЦП. Видите, больше всех ест системный монитор. Есть ещё одна вкладка Общая загрузка системы, посмотрим, загрузка процессора, занятая память, сеть, Температуры нет. Сейчас сделаем: в меню Файл выберите Новая вкладка.
Kos-sys-man3.png
Заголовок - пишите Температура, строк - а сколько у Вас ядер процессора? обычно 2 или 4. Колонок - 2. и ОК.
На рисунке ниже мы видим развёрнутый список и у Вас в новой вкладке появился такой же. Выберите CPU Load - CPU 1 - Clock frequency. Нажмите на ней мышкой, перетащите на первое пустое поле и отпустите, выберите числа - видите, это частота Вашего процессора (первое ядро). Сделайте тоже самое для каждого ядра процессора. Теперь перейдём к температурным датчикам: ACPI-Thermal Zone-0-Temperature - перетащите на пустое поле и выберите график. Если в Thermal Zone есть ещё датчики, сделайте тоже самое. А также из Hardware Sensors вытащите всё, чем больше тем нагляднее. Можете полюбоваться этой красотой :)
Обратите внимание что как только частота поднимается, поднимается и температура.

Управление частотой процессора

Итак, начнём с проверки, загружен ли модуль ядра для управления частотой процессора (а вдруг). В РокетЛаунчере ищем Konsole (Терминал)
Kos-term1.png
, запустите его. Если не получается, не беда, вверху меню есть строка поиска, просто напишите в ней konsole он и появится. Откроется страшное чёрное окно, не бойтесь его, ведь теперь Вы хакер :) Ткните мышкой в это окно, чтобы убедиться что Вы там. Напишите слово su и нажмите клавишу Enter, теперь пароль root пользователя, вводите внимательно, Вы не увидите ввода символов и не сможете стереть неправильно введённый символ, но если не получилось, не бойтесь напишите опять su и повторите пароль. Если всё получилось, то в конце последней строки будет значок #, что означает что теперь Вы можете делать с системой что угодно. Этого то нам и надо :) Теперь пишем команду cpupower -c all frequency-info Жмём Enter и смотрим:
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 2000 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 2000 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

В этом выводе нас интересуют строки:

driver: powernow-k8 Как видите, драйвер у меня загружен, у вас скорее всего будет другой драйвер, но главное он есть. available frequency steps 2.00 GHz, 1000 MHz, 500 MHz Частоты процессора на которых он может работать. The governor"ondemand" may decide which speed to use Политика энергосбережения, это тоже важно. ondemand - это хорошо. Итак всё в порядке, можете переходить к разделу Регулировка температуры

проблемы с модулем ядра

А тех же кому не повезло с драйвером (такое редко, но всётаки бывает), попрошу остаться. Если Вы видите это:

analyzing CPU 0:
  no or unknown cpufreq driver is active on this CPU
  boost state support:
    Supported: no
    Active: no
analyzing CPU 1:
  no or unknown cpufreq driver is active on this CPU
  boost state support:
    Supported: no
    Active: no

Видите? no or unknown cpufreq driver is active on this CPU Драйвер не загружен и поэтому не регулируется частота процессора. Что делать? Надо попробовать его загрузить, но какой выбрать? Есть много вариантов, но у Вас скорее всего один из этих:

  • acpi_cpufreq Если у Вас процессор Intel, то этот драйвер скорее всего подойдёт.
  • p4_clockmod, speedstep-ich, speedstep-smi - Линейка устаревших поцессоров Intel
  • powernow-k6, powernow-k7 и powernow-k8 процессоры AMD (старый, новее, новее)

Можете ввести команду cat /proc/cpuinfo, чтобы больше узнать о процессоре. Сильно не пугайтесь, если Вы попытаетесь загрузить не правильный драйвер - 1)он просто не загрузится, 2)его всегда можно выключить командой rmmod (и имя модуля) Теперь пробуем загрузить его вручную - переключаемся опять в консоль и пишем команду modprobe acpi_cpufreq или modprobe powernow-k8 или другой модуль, жмём Enter. Не ругается? Посмотрим, завелось ли? В консоли нажмите на клавиатуре клавишу "стрелка вверх", или "стрелка вниз", чтобы найти команду которой мы смотрели работу процессора (cpupower -c all frequency-info), потом нажмите Enter. Теперь показывает драйвер и частоту? Ура! Вы победили злобного дракона! Теперь команда cpupower -c all frequency-set -g ondemand указываем какую политику энергосбережения использовать Переходим к следующему разделу

Регулировка температуры

Посмотрим, что говорят наши датчики температуры? Опять же в консоли пишем sensors и видим:

acpitz-virtual-0
Adapter: Virtual device
temp1:        +57.0°C  (crit = +105.0°C)

k10temp-pci-00c3
Adapter: PCI adapter
temp1:        +60.5°C  (high = +70.0°C)
Это у моего компьютера такое, обратите внимание на (crit = +105.0°C) - это температура до которой он не должен доходить, у вашего может и другая температура и датчик другой (но acpitz-virtual-0 всегда будет, на него и будем опираться).
Kos-dolph-home.png
Теперь нам надо создать два скрипта для контроля температуры. Для этого запустите Dolphin (он рядом со значком Рокет лаунчера). Убедитесь что вы находитесь в домашней папке. Теперь в пустом месте нажмите правой кнопкой мыши и в появившемся меню - Создать - Текстовый файл. Введите имя файла temperature.sh теперь ОК. В домашней папке появится файл throttle.sh Щёлкните по нему два раза, откроется текстовый редактор. В редакторе вставьте ниже приведённый текст:</br>

Примечание: тут хотелось бы подсветку синтаксиса

#!/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 5
done

Сохраните файл и закройте редактор. Топерь также создадим файл с названием starttemp.sh И вставим нижеприведённый текст:

#!/bin/bash
# ограничитель температуры
needed_module="" #Тут Вставьте нужный драйвер в кавычках
governor="ondemand" # Политика энергосбережения
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/throttle.sh ${temperature} &
exit 0

Тут остановимся подробнее:

  • needed_module="" - тут в кавычках можно проставить свой модуль ядра(это нужно тем у кого он не загружается сам при старте системы)
  • governor="ondemand" - выставить политику энергосбережения. ondemand - быстрый разгон до максимума по требованию, conservative - медленнее разгоняется и притормаживает, мне больше нравится, performance - максимальная частота постоянно, для перегревающегося ноутбука не вариант. и powersave - максимальное энергосбережение, тоже не вариант, это постоянно работать на минимуме мощностей.
  • temperature=88 У меня критическая температура 105°C, я скинул 17°, чтобы компьютер успел среагировать, да и вообще, больше 90° не надо. Вы же посчитайте от своей критической температуры.

Сохраните файл и закройте редактор. Теперь дадим разрешение на запуск этих файлов: В Dolphin (в домашней папке) выделите оба файла и нажмите на них правой кнопкой мыши, в открывшемся меню - Свойства - Вкладка Права - поставить галочку Исполняемый файл и OK. Теперь Вы разрешили запуск скриптов. Но их надо поместить на место. Перейдите в консоль (вы её не закрыли? если закрыли, то запустите снова и волучите права root, как в начале. Теперь впишите туда команды (внимание, не добавляйте лишних пробелов в конце):
mv starttemp.sh /etc/pm/power.d/
Нажмите Enter
mv throttle.sh /usr/local/bin/
Нажмите Enter
Теперь все файлы настроены и помещены на место. Можно испытывать. Вытащите шнур питания компьютера, подождите пять секунд и снова вставьте. Запустите Системный монитор, переключите на таблицу процессов, в строке фильтра напишите throttle. Есть он в списке? тогда всё хорошо, переходим на вкладку температура и смотрим что происходит. Для наглядности запустите всё то от чего греется компьютер, например зайдите на youtube, найдите hd video, запустите два-три экземпляра на лучшем качестве и смотрите за температурой, поцессор нагружен на 100%, частота максимальная, температура растёт и вдруг частота начинает снижаться, а следом и температура. Это работает наш скрипт. Он просто снижает максимально допустимую частоту, когда температура достигает установленного максимума.