Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Низкий FPS на Ryzen с iGPU: диагностика узких мест

Если на Ryzen со встроенной графикой игра выдаёт вдвое меньше кадров, чем показывают чужие тесты на том же процессоре, почти всегда виновато не «слабое железо», а одно из трёх: узкая память, неверно выбранный драйвер или проваленный scheduler. Ниже — короткий маршрут, который помогает за десять минут понять, где именно теряются проценты, и что с этим делать. Сначала разберёмся с тем, откуда берётся низкая частота кадров, дальше — с проверками, а в конце с настройкой.

Почему iGPU на Ryzen тормозит сильнее, чем должен?

Встроенная графика не имеет собственной видеопамяти: она берёт системную DDR. Отсюда первая и самая частая причина — одноканальный режим памяти. Двухканальный контроллер даёт iGPU почти вдвое больше суммарной полосы, и в сценариях, где GPU упирается в пропускную способность (растеризация, текстуры, шейдеры без окклюзии), просадка легко превышает 30%.

Вторая причина — сама память. Стандартный JEDEC-профиль держит DDR4/DDR5 на низких частотах с высокой латентностью, пока не включён XMP (или EXPO для Ryzen). Пока профиль не активирован, iGPU получает и полосу, и отзывчивость ниже заявленных для платы значений. Подробнее про сам графический стек и драйвер — в статье AMD GPU: Radeon или amdgpu.

Третий фактор — CPU-bound сценарии. Когда узкое место не в памяти, а в логике игры, «разгон GPU» не даёт ничего: узко место в процессоре, и iGPU лишь отображает готовые кадры. Именно в таких сценариях помогают governor performance и отключение энергосбережения — об этом ниже.

Какие проверки сделать в первую очередь?

Порядок примерно такой: сначала убедись, что игра вообще идёт через аппаратный рендерер, потом посмотри память, и только потом трогай настройки.

Смотри, какой рендерер и драйвер выбрала система:

glxinfo -B | grep -E "OpenGL renderer|OpenGL version"
glxinfo -B | grep "OpenGL core profile version"

В строке OpenGL renderer string должно быть AMD Radeon ... (radeonsi, ...), а не llvmpipe или softpipe. Если видишь llvmpipe — игра рисует на процессоре программно, и никакие настройки GPU не помогут. С Vulkan-путём похоже, только там нужен RADV:

vulkaninfo --summary | grep -E "deviceName|driverName|apiVersion"

В deviceName ищи RADV, в driverInfo — версию Mesa. Если в списке RADV нет, а есть llvmpipe или lavapipe, проблема снова в драйвере, а не в железе. Вторую половину проверки — как настроен Vulkan для игр — разбирали в гайде по настройке amdgpu, Vulkan и Mesa.

Проверь частоту и режим памяти:

lshw -short -C memory
dmidecode -t memory | grep -E "Locator|Size|Speed|Part Number"

Если в списке один модуль или все модули работают на одинаковой пониженной частоте, причина найдена: включи XMP/EXPO в UEFI.

Отдельно проверь прогреваемость монитора. В WSL и в виртуальных машинах, а иногда и на нестандартных разрешениях рабочий стол уходит на программный и с медленной вертикальной развёрткой. Сравни FPS в окне игры и на рабочем столе, а для контроля полной частоты:

xrandr | grep -E "\*|connected"

Почему amdgpu.ppfeaturemask не спасает FPS?

Потому что этот параметр управляет профилями энергопотребления и таблицами power play. В CPU-bound сцене кадры ограничены частотой процессора, и любые манипуляции с профилями GPU на неё не влияют — картинка уже готова, дольше её не показать.

С amdgpu.dc=0 (отключение Display Core) эксперименты спорные: на части конфигураций выигрыш есть, на части — артефакты и потеря производительности. Если решишь проверить, сначала зафиксируй исходные значения и откатывай через initramfs, а не через живой перезагрузкой ядра. Порядок такой: сначала amdgpu.ppfeaturemask и power_dpm_force_performance_level, и только потом отключение Display Core — иначе не поймёшь, что именно помогло.

Как заставить GPU работать на высокой частоте?

У amdgpu есть собственный бюджет мощности и собственный governor поверх Linux governor. Текущий уровень читается так:

cat /sys/class/drm/card0/device/power_dpm_force_performance_level

Допустимые значения: low, auto, high, плюс варианты manual со сдвигом деления. Уровень low заставляет карту экономить и держать минимальные частоты, auto даёт драйверу решать, high фиксирует максимальные частоты и заметно поднимает FPS в GPU-bound сценариях.

sudo tee /sys/class/drm/card0/device/power_dpm_force_performance_level <<< "high"
sudo tee /sys/class/drm/card0/device/power_dpm_state <<< "performance"

Обрати внимание на имя устройства: если карт несколько, нужный cardN ищи через readlink -f /sys/class/drm/card*/device/driver или lspci -k | grep -A3 vga. Значения не переживают перезагрузку — их удобнее прописать в systemd-юнит, который выполняет tee до старта графической сессии, а не в rc.local.

Как настроить scheduler и governor для Ryzen?

Планировщик в ядре влияет на две вещи: как часто CPU будит iGPU для подачи команд и как быстро процессор уходит в максимальные частоты. Для Ryzen практичная связка — amd-pstate (или amd_pstate в новых ядрах), активный EPP и governor performance.

Проверить текущее состояние:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpufreq/policy0/energy_performance_preference
cat /sys/devices/system/cpu/amd_pstate/status

Здесь стоит понимать разницу: amd_pstate=active — активный драйвер, он сам решает между энергосбережением и производительностью; amd_pstate=guided — гибридный, на десктопах он обычно полезнее, потому что учитывает нагрузку; passive отдаёт выбор на schedutil. Параметр amd_pstate_epp в active задаёт профиль качества (например, performance или balance_performance) — именно он заметно поднимает частоты в играх.

Переключить governor и профиль:

sudo cpupower frequency-set -g performance
echo amd_pstate_epp=performance | sudo tee /boot/loader/entries/*/conf
sudo update-grub   # или grub-mkconfig -o /boot/grub/grub.cfg

Чтобы governor не слетал после перезагрузки, проще сделать его постоянным через udev-правило, а не через cpupower.service (тот переписывает настройки при старте и конфликтует с udev). Создай правило, которое выставляет performance на все политики CPU:

sudo tee /etc/udev/rules.d/50-cpufreq-performance.rules <<< 'ACTION=="add", KERNEL=="cpufreq", RUN+="/bin/sh -c \'/usr/bin/cpupower frequency-set -g performance\'"'
sudo udevadm control --reload-rules && sudo udevadm trigger

Если душа лежит к schedutil или powersave, меняй только performance в RUN на нужный governor — остальная логика не меняется. Полезно держать под рукой обе утилиты:

sudo pacman -S cpupower cpufrequtils

Отдельный слой настройки — выбор драйвера: под Vulkan-игры оставляй RADV, под OpenGL-движки можно переключиться на RadeonSI, если RADV даёт артефакты. Переключение делается переменными окружения или драйвер-файлами, без правки конфигов Mesa, и подробнее разобрано в разделе частых вопросов.

Частые вопросы

RadeonSI или RADV — что выбрать?

Для OpenGL-игр (старые движки, DXVK поверх Wine, нативные порты) берут RadeonSI, для Vulkan-игр — RADV. В твоём случае RADV почти всегда лучше: у него заметно выше производительность и свежее компиляторные трюки. Переключать глобально нужно только если конкретная игра глючит с RADV — тогда RADV_PERFTEST=gpl или VK_DRIVER_FILES помогают, а для нативного Wayland у Proton включают RADV принудительно.

Помогает ли amdgpu.ppfeaturemask в играх?

В CPU-bound сценариях — нет, потому что он влияет на энергопотребление и таблицы power play, а не на частоту CPU. В GPU-bound — иногда да: в 0xffff есть полезные профили, но подбирать их стоит по конкретной модели, а не одним флагом на весь ноутбук.

Стоит ли оверклоктить iGPU через power_dpm_force_performance_level?

Это не оверклок, а фиксация максимальных частот. На стоковом напряжении эффект безопасен, минус — рост нагрева и шума вентиляторов в ноутбуке. Разгон частот ядра через pp_od_clk_voltage возможен, но требует нагрузочного теста и даёт куда меньше, чем честные XMP-профили памяти.

Почему FPS скачет: 40 в меню и 75 в бою?

Обычно это встроенный frame limiter или переменная частота кадров в самой игре, а не проблема драйвера. Проверь vblank в glxgears/ любом тесте и убедись, что вертикальная развёртка монитора не ниже частоты кадров в игре.

Что делать, если в glxinfo -B нет строки renderer?

Проверь, запущен ли ты в WSL или в виртуальной машине: там DRI может быть недоступен полностью, и ты вывод уходит в другой путь. На голом железе отсутствие строки означает, что не загрузился amdgpu-модуль — смотри dmesg | grep -i drm и lspci -k.

Полезные ресурсы

Заключение

Встроенная графика Ryzen не конкурент дискретной карте, но в CPU-bound сценариях правильные настройки дают вполне реальные +20–30%. Порядок действий простой: двухканальная память на профиле XMP/EXPO, performance-профиль power_dpm_force_performance_level, governor performance с закреплённым amd_pstate_epp, и проверка того, что игра вообще идёт через RADV, а не через программный рендерер.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max