Управление вентилятором Radeon RX-6xx0: различия между версиями
Дым (обсуждение | вклад) |
Дым (обсуждение | вклад) |
||
Строка 158: | Строка 158: | ||
==Результаты== | ==Результаты== | ||
===Утро/вечер: веб-сёрфинг, общение, редактирование и пр.=== | ===Утро/вечер: веб-сёрфинг, общение, редактирование и пр.=== | ||
Переключение ШИМа на 20% (51) после | Переключение ШИМа на 20% (51) после примерно 5-минутного прогрева до 48°C, далее — колебания в пределах 50..55°C. | ||
Отход на перекус — температура примерно за то же время падает до 42°C, ШИМ обнуляется, далее — колебания как ночью. | Отход на перекус — температура примерно за то же время падает до 42°C, ШИМ обнуляется, далее — колебания как ночью. | ||
Будним днём с повышением забортной температуры системная тоже подрастает и гуляет в рамках 40°C+ без запуска вентиляторов. | Будним днём с повышением забортной температуры системная тоже подрастает и гуляет в рамках 40°C+ без запуска вентиляторов. | ||
===Запуск FarCry5=== | ===Запуск FarCry5=== | ||
(видюха легко её вертит на ультрах) | (видюха легко её вертит на ультрах) |
Версия от 07:48, 31 мая 2022
Введение
Столкнулся с проблемой перегрева видюхи RX-6700XT на игровых нагрузках — и не только её самой, поскольку она ведь и вокруг себя изрядно греет.
- Процессор прямо над нею кипятится — мéста между видюхой, крышкой и стенками отнюдь не завались.
- М2-накопитель посреди видюхи и проца тоже знатно подгорает — хоть и с радиатором, и от проц-кулера на него дует… горячим.
- Дополнительным винчестерам в корзине, вставленной в пространство 5-дюймовых отсеков, жарко и душно.
- Да и тем, что в нижних 3,5-дюймовых, ни разу не уютно.
До некоторой степени спасает вариант поставить (скорей, положить) перед открытой крышкой системника большой комнатный вентилятор — для всего, кроме самой видюхи: она ж к нему краем, и толку ноль. А заводская авторегулировка видюхиного ШИМа как-то не особо способствует её охлаждению даже зимой, о жаре за бортом вовсе молчу.
Реализация
Пошарив по просторам, нарыл массу графических «мониторилок» — но ни одной «крутилки» именно для АМД, хотя для ненаВидии — завались (один лишь «позеленевший от зависти» чего стóит). И это невзирая на то, что всё нужное доступно прямо из системы, без нужды ковыряться в проприетарщине… Странное дело.
При этом для командной строки нарубинено да напитонено всякого, но к чему плодить сущности, если всё можно сделать перманентно доступным шеллом? Проникся довольно замороченным решением amdgpu-fancontrol
и по образу/подобию слепил на скорую руку собственный упрощённый вариант, для которого понадобится тройка файлов — скрипт да конфиг c юнитом к нему.
Файл настроек
# restart service amdgpufan if config changed
card=0 # vega rather has number 1
rate=3 # check frequency
step=5 # min to max divider
within=2 # temperature borders and pwm diff tolerance
min_tmp=45 # no need cooling lower
sensor=junction # 'edge' (gpu), 'mem' or 'junction' (hottest one)
Запускающий юнит
/lib/systemd/system/amdgpufan.service
:
[Unit]
Description = AMD GPU fan control
[Service]
ExecStart = /usr/local/sbin/amdgpufan
Restart = on-failure
RestartSec = 5
[Install]
WantedBy = default.target
Как включать юниты, все давно знают. :)
Сам скрипт
/usr/local/sbin/amdgpufan
:
#!/bin/sh
[ $UID -eq 0 ] || { # Check user permissions.
echo "Writing to /sys requires root privileges."
exit 1
}
config=/etc/sysconfig/amdgpufan
[ -f $config -a -s $config ] &&
source $config || {
echo "User settings not found."
exit 1
}
case $sensor in
junction)
min_tmp=$[min_tmp+5]
sensor=2;;
edge)sensor=1;;
mem) sensor=3;;
esac
## System variables ##############################################
gpuinfo=/sys/kernel/debug/dri/$card/amdgpu_pm_info
dev_dir=/sys/class/drm/card$card/device
sys_dir=`ls -d $dev_dir/hwmon/*`
sys_lvl=${dev_dir}/power_dpm_force_performance_level
sys_clk=${dev_dir}/pp_od_clk_voltage
sys_tmp=${sys_dir}/temp${sensor}_input
sys_pwm=${sys_dir}/pwm1
sys_fan=${sys_pwm}_enable
## Calculated variables ##########################################
part=$[step-2] # loops' divider: steps num except first and last
# Achievable frequencies for gpu & mem:
mhz=(`awk '/^(M|S)/{gsub("Mhz","");print $3}' $sys_clk | sort -V`)
max_tmp=$[`cat $sys_dir/temp*_crit | sort -V | head -1`/1000]
max_pwm=`cat ${sys_pwm}_max`
min_pwm=`cat ${sys_pwm}_min`
gap_pwm=$[(max_pwm-min_pwm)/step]
gap_tmp=$[(max_tmp-min_tmp)/step]
reset(){ # Sudden break.
printf "Exiting and s"
setmode auto
exit 0
}
setmode(){ # Change as mode as gpu & mem frequency.
echo "etting clock & fan mode to '$1'."
case $1 in
auto) mode=2;;
manual) mode=1
echo m 1 ${mhz[0]} >$sys_clk
echo s 1 ${mhz[1]} >$sys_clk
;;
esac
echo $mode >$sys_fan
echo $1 >$sys_lvl
}
main(){ # Whole magic.
cur_pwm=`cat $sys_pwm`
cur_tmp=$[`cat $sys_tmp`/1000]
[[ `cat $sys_fan` -eq 1 ]] || {
printf "S"
setmode manual
}
if [[ $cur_tmp -gt $max_tmp ]]; then
echo "$cur_tmp°C exceeds critical, set 100% blowing."
new_pwm=$max_pwm
elif [[ $cur_tmp -le $min_tmp ]]; then
new_pwm=$min_pwm
else
for i in `seq 0 $part`; do
[[ $cur_tmp -ge $[min_tmp+gap_tmp*i] ]] &&
[[ $cur_tmp -le $[min_tmp+gap_tmp*(i+1)] ]] && {
new_pwm=$[min_pwm+gap_pwm*(i+1)]
break
}
done
fi
printf "%3d°C @%3d PWM" $cur_tmp $cur_pwm
[[ $cur_pwm -ge $[new_pwm-within] ]] &&
[[ $cur_pwm -le $[new_pwm+within] ]] &&
echo "." || { # Change PWM if differ.
for i in `seq 0 $part`; do
[[ $cur_tmp -ge $[min_tmp+gap_tmp*i-within] ]] &&
[[ $cur_tmp -le $[min_tmp+gap_tmp*i+within] ]] && {
echo "."
break
}
done || {
printf ", switching to %3d.\n" $new_pwm
echo $new_pwm >$sys_pwm
}
}
}
trap "reset" SIGINT SIGTERM # Handle signals.
while :; do # Go on!
main
sleep ${rate}s
done
Пояснения
- Пользовательскими переменными из конфига задаю:
- card — № видюхи (судя по статьям от спецов, при наличии встройки оная будет пронумерована единичкой);
- min_tmp — температуру, ниже которой мослать вентилятором бессмысленно (с завода вентилятор не включается до 52°C процессора, а при остывании останавливается на 46°C);
- sensor — какой из датчиков «пасти»: процессора, самый холодный (памяти) или самый горячий (температуры перехода), однако max_tmp выбираю минимальную из критических;
- rate — частоту опроса со сменой значения в ШИМ-контроллере при выходе температуры из предыдущего диапазона (не обязательно делать это ежесекундно, чтоб и не дать перегреться, и не надоело листать портянку журнала);
- step — число сегментов, на которые будет разбит как диапазон регулируемых температур, так и шкала делений ШИМ-контроллера (вроде процентной, но не на 100, а на 255 делений);
- whithin — допустимый разброс задаваемого значения ШИМ с не всегда одинаковым текущим, а также перехлёст температурных диапазонов, дабы вентилятор не дёргался на градус разницы, внося сумятицу в умы и сердца.
- Запускать скрипт по таймеру не стал, оставил а-ля «резидентным» (см. цикл while), дабы между его запусками не бросать видюху в ручном режиме без управления (см. функцию setmode).
Результаты
Утро/вечер: веб-сёрфинг, общение, редактирование и пр.
Переключение ШИМа на 20% (51) после примерно 5-минутного прогрева до 48°C, далее — колебания в пределах 50..55°C.
Отход на перекус — температура примерно за то же время падает до 42°C, ШИМ обнуляется, далее — колебания как ночью.
Будним днём с повышением забортной температуры системная тоже подрастает и гуляет в рамках 40°C+ без запуска вентиляторов.
Запуск FarCry5
(видюха легко её вертит на ультрах)
мая 30 19:52:59 comp.ill amdgpufan[356185]: 55°C @ 51 PWM. мая 30 19:53:02 comp.ill amdgpufan[356185]: 63°C @ 51 PWM, switching to 102. мая 30 19:53:05 comp.ill amdgpufan[356185]: 64°C @102 PWM. ... мая 30 19:54:26 comp.ill amdgpufan[356185]: 71°C @102 PWM. мая 30 19:54:29 comp.ill amdgpufan[356185]: 72°C @102 PWM, switching to 153. мая 30 19:54:32 comp.ill amdgpufan[356185]: 71°C @153 PWM. ... мая 30 19:55:44 comp.ill amdgpufan[356185]: 67°C @153 PWM. мая 30 19:55:47 comp.ill amdgpufan[356185]: 66°C @153 PWM, switching to 102. мая 30 19:55:50 comp.ill amdgpufan[356185]: 67°C @102 PWM. ... мая 30 19:59:35 comp.ill amdgpufan[356185]: 71°C @102 PWM. мая 30 19:59:38 comp.ill amdgpufan[356185]: 72°C @102 PWM, switching to 153. мая 30 19:59:41 comp.ill amdgpufan[356185]: 70°C @153 PWM. мая 30 19:59:44 comp.ill amdgpufan[356185]: 71°C @153 PWM. мая 30 19:59:47 comp.ill amdgpufan[356185]: 62°C @153 PWM, switching to 102. мая 30 19:59:50 comp.ill amdgpufan[356185]: 60°C @102 PWM. ... мая 30 20:00:11 comp.ill amdgpufan[356185]: 55°C @102 PWM. мая 30 20:00:14 comp.ill amdgpufan[356185]: 54°C @102 PWM, switching to 51. мая 30 20:00:17 comp.ill amdgpufan[356185]: 54°C @ 51 PWM. мая 30 20:00:20 comp.ill amdgpufan[356185]: 54°C @ 51 PWM. мая 30 20:00:23 comp.ill amdgpufan[356185]: 55°C @ 51 PWM. ... мая 30 23:57:42 comp.ill amdgpufan[356185]: 58°C @102 PWM.
Выход из игры:
мая 30 23:57:45 comp.ill amdgpufan[356185]: 54°C @102 PWM, switching to 51. мая 30 23:57:48 comp.ill amdgpufan[356185]: 52°C @ 51 PWM. ... мая 31 00:09:04 comp.ill amdgpufan[356185]: 45°C @ 51 PWM. мая 31 00:09:07 comp.ill amdgpufan[356185]: 44°C @ 51 PWM. ... мая 31 00:17:10 comp.ill amdgpufan[356185]: 43°C @ 51 PWM. мая 31 00:17:13 comp.ill amdgpufan[356185]: 42°C @ 51 PWM, switching to 0. мая 31 00:17:16 comp.ill amdgpufan[356185]: 43°C @ 0 PWM.
Всю ночь 39-42°C при нулевом ШИМе (шуме), а после подъёма:
мая 31 07:07:42 comp.ill amdgpufan[356185]: 47°C @ 0 PWM. мая 31 07:07:45 comp.ill amdgpufan[356185]: 48°C @ 0 PWM, switching to 51. мая 31 07:07:48 comp.ill amdgpufan[356185]: 48°C @ 51 PWM.
И т.д., и т.п..
Выводы
До +30°C на улице большой внешний вентилятор сбоку более не нужен: игрушки на ультрах в высоком разрешении прогревают самый горячий компонент видюхи не выше 96°C, тогда как прежде и с вентилятором за сотку вылезало — теперь такое только при стресс-тестах, на которых до того система попросту аварийно отключалась. Как будет в самую жару, опробовать пока не довелось, но по результатам отчитаюсь.
Когда не ломанная / не чиненная железяка работает не так, как ожидается, порой на помощь спешат чип и… программные средства. Пусть без рюшечек и фантиков, зато задача решена на системном уровне. Ну, и есть надежда, что дружелюбного софта тоже не придётся долго ждать.