Температуру ядра, реальную частоту и загрузку видеокарты в Linux можно посмотреть без единой сторонней программы: драйвер выкладывает телеметрию обычными файлами в /sys/class/drm/cardN/device/. Через cat ты получишь текущие значения, а через power_dpm_force_performance_level или pp_power_profile_mode заставишь карту работать тише. Разберём, что лежит в этих каталогах у amdgpu и i915, как ограничить частоты и как закрепить профиль при загрузке.
/sys/class/drm/ — class-каталог подсистемы DRM. Каждый видеодрайвер создаёт там карточку card0, card1 и интерфейс рендеринга renderD128. Сам каталог cardN почти пустой, поэтому всё интересное лежит по симлинку device/, который указывает на PCI-устройство:
ls /sys/class/drm/
ls -l /sys/class/drm/card0/device/
У amdgpu температуры и энергия лежат в hwmon, частота ядра и памяти — в списках pp_dpm_sclk и pp_dpm_mclk, где текущая строка помечена звёздочкой, а загрузка и видеопамять — в gpu_busy_percent и mem_info_vram_used. У i915 скуднее: hwmon/hwmon*/temp1_input есть, а частоты ядра лежат не в device/, а уровнем выше — gt_cur_freq_mhz и gt_max_freq_mhz. Проприетарный NVIDIA телеметрию в sysfs не отдаёт вообще, только через nvidia-smi, поэтому про вентиляторы и лимиты — отдельная история про coolbits и перегрев.
Температура записана в миллинградусах, поэтому дели на 1000:
cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input
awk '{printf "%.1f °C\n", $1/1000}' /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input
cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_crit
Рядом лежат temp1_max и temp1_label — метка подсказывает, это датчик кристалла, памяти или горячей точки.
Частоты и загрузка:
cat /sys/class/drm/card0/device/pp_dpm_sclk
cat /sys/class/drm/card0/device/gpu_busy_percent
cat /sys/class/drm/card0/device/mem_info_vram_used
Значения удобно свернуть в одну строку и обновлять её на лету:
D=/sys/class/drm/card0/device
watch -n1 "awk '{printf \"%.1f C, GPU %s%%, VRAM %d MB\\n\", \$1/1000, \"\$(cat $D/gpu_busy_percent)\", \"\$(cat $D/mem_info_vram_used/1048576)\"}' $D/hwmon/hwmon*/temp1_input"
Для наблюдения в реальном времени хватает watch без всяких демонов:
watch -n1 'cat /sys/class/drm/card0/device/gpu_busy_percent; cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input'
Если поставишь lm_sensors, то hwmon подхватится сам и температуры покажутся в привычном виде вместе с процессорами и вентиляторами:
sudo pacman -S lm_sensors
sudo sensors-detect
sensors
Учти, что sensors печатает температуру в градусах, а sensors -u — в микро градусах, то есть в тысячу раз больше, чем цифра в temp1_input. Полезная привычка: сначала посмотреть сырые файлы и только потом искать причину, если значение кажется странным.
Для игр удобнее оверлей: как настроить MangoHud поверх Vulkan, разбирал в статье про слой и MangoHud. А для терминала есть radeontop (запусти с radeontop -d 1, покажет частоту, температуру и занятость VRAM) и nvtop для карт NVIDIA.
Набор файлов зависит от драйвера, и это нормально. У встроенной графики Ryzen есть только hwmon с температурой и энергией: никаких pp_dpm_sclk, ppfeaturemask и power_dpm_force_performance_level там не будет, частоту ядра iGPU задают через gt_max_freq_mhz. У карт AMD разных поколений отличается поддержка OverDrive, у Intel свой набор файлов, у NVIDIA — ноль sysfs-интерфейсов.
Перед записью всегда делай ls и проверяй, что файл вообще есть, а перед первой записью — что у тебя root. На ноутбуках с гибридной графикой в card0 может оказаться встроенная карта, а дискретная получит card1:
lspci -nnk | grep -A3 'VGA compatible controller'
cat /sys/class/drm/card0/device/uevent
Самый грубый и самый надёжный переключатель — power_dpm_force_performance_level:
cat /sys/class/drm/card0/device/power_dpm_force_performance_level
echo low | sudo tee /sys/class/drm/card0/device/power_dpm_force_performance_level
echo auto | sudo tee /sys/class/drm/card0/device/power_dpm_force_performance_level
Допустимые значения — строки auto, low, high и manual. low прижимает карту к самым низким частотам: шум вентиляторов и нагрев падают, но падают и кадры. Если после такой настройки в играх появились подёргивания, сначала верни auto — про низкую частоту кадров на Ryzen iGPU я писал отдельно.
Более тонкий вариант для игровых сценариев — профиль мощности, где 2 обычно отвечает за 3D_FULL_SCREEN:
cat /sys/class/drm/card0/device/pp_power_profile_mode
echo 2 | sudo tee /sys/class/drm/card0/device/pp_power_profile_mode
Набор числовых режимов отличается от поколения к поколению, поэтому сначала посмотри текущее значение, а потом записывай. Отдельный power_dpm_state со значением battery просит драйвер держать карту на экономном бюджете — удобно на ноутбуке от батареи.
В ручном режиме появляется список уровней, где 1 — минимальный, а последняя строка — максимальный:
cat /sys/class/drm/card0/device/pp_dpm_performance_level
cat /sys/class/drm/card0/device/pp_dpm_performance_level_manual
echo 2 | sudo tee /sys/class/drm/card0/device/pp_dpm_performance_level_manual
Запись в эти файлы требует root и иногда вызывает короткое мигание экрана, будто сбрасывается композитор. Для энергосбережения хватает low или battery, а high и ручной уровень стоит ставить осознанно: карта не даст тебе сэкономить счёт за электричество, зато нагреет ноутбук.
За верхние частоты отвечает OverDrive, а сам он выключен по умолчанию. Включается битом в маске возможностей:
cat /sys/class/drm/card0/device/ppfeaturemask
sudo sh -c 'echo 0xfff7bfff > /sys/class/drm/card0/device/ppfeaturemask'
Значение 0xfff7bfff снимает бит OverDrive, после чего появляется pp_od_clk_voltage. На APU там же включают OverDriveVoltage — бит 14, значение 0x4000; проще сначала прочитать текущую маску и аккуратно скомбинировать биты, чем затирать её всю.
Дальше — сам OverDrive:
cat /sys/class/drm/card0/device/pp_od_clk_voltage
echo "s 2100 1200" | sudo tee /sys/class/drm/card0/device/pp_od_clk_voltage
echo "r" | sudo tee /sys/class/drm/card0/device/pp_od_clk_voltage
Команда s задаёт частоту и напряжение, r возвращает штатные значения. Бюджет мощности настраивают через TDC/EDC: на дискретных картах это делают CoreCtrl и LACT, оба запускаются как обычные консольные утилиты (corectrl, lact, параметры — в man и --help). На APU общий TDP делится между ядром и встроенной графикой: поднял частоты iGPU — урежь бюджет CPU, иначе упрешься в троттлинг всей системы. И не запускай два менеджера разгона одновременно: они пишут в одни и те же файлы и будут драться.
Все значения в sysfs живут до перезагрузки, сна или перезагрузки драйвера — после этого всё возвращается к заводским значениям. Поэтому профиль удобно закреплять через systemd-юнит, а не вручную. Сервис для экономного режима:
# /etc/systemd/system/gpu-power-low.service
[Unit]
Description=GPU: экономный режим
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo low > /sys/class/drm/card0/device/power_dpm_force_performance_level'
И таймер, который периодически возвращает карту в нужное состояние:
# /etc/systemd/system/gpu-power-low.timer
[Unit]
Description=Включить экономный режим GPU
[Timer]
OnBootSec=2min
OnUnitActiveSec=15min
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now gpu-power-low.timer
По времени суток вместо интервала удобнее OnCalendar=*-*-* 09,17:00:00. Если правка sysfs нужна без sudo, добавь правило в /etc/udev/rules.d/, а повторное применение после подключения горячего картоданных повесь на systemd через тег TAG+="systemd". Крон тоже годится, но юнит надёжнее: он переживает загрузку и виден в systemctl list-timers.
echo 0 в power_dpm_force_performance_level не работает?Интерфейс принимает только строки auto, low, high и manual, число 0 драйвер отвергает с ошибкой ввода. Чтобы снять принудительный режим, пиши auto, а manual переключает управление на pp_dpm_performance_level_manual, где доступен список уровней.
Посмотри uevent или связку lspci -nnk: в выводе будет пара «vendor device» с классом VGA/3D. Если в ноутбуке две графики, встроенная обычно получает card0, дискретная — card1, но порядок не гарантирован, поэтому проверяй по вендору, а не по номеру.
Драйвер переинициализирует карту и сбрасывает все значения в sysfs. Чтобы профиль вернулся после пробуждения, добавь в сервис After=suspend.target и выполнение по событию пробуждения либо перезапусти таймер из hook в /usr/lib/systemd/system-sleep/.
power_dpm_state переключает режим энергопотребления целиком: battery ограничивает и частоты, и напряжения, performance снимает ограничения. power_dpm_force_performance_level действует грубее — low просто прижимает карту к нижней частоте, а auto возвращает штатное поведение. На практике battery полезнее для автономной работы, а low удобен как грубый аварийный способ унять шум вентиляторов.
Да, всё то же самое лежит в raw-файлах: пара cat в цикле или watch -n1 покажет температуру и загрузку, а radeontop и nvtop соберут всё в одну таблицу без установки дополнительных библиотек.
Температура, частоты и загрузка видеокарты читаются из /sys/class/drm/cardN/device/ без сторонних программ, а power_dpm_force_performance_level и pp_power_profile_mode позволяют ограничить аппетит карты без перезагрузки. Помни, что набор файлов зависит от драйвера, значения сбрасываются после сна и перезагрузки, поэтому надёжный профиль удобнее закрепить через systemd-юнит с таймером.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии