Performance Troubleshooting¶
This guide covers common performance issues and their solutions for the BC-250.
Quick Diagnostics¶
Before troubleshooting specific issues, run these commands to check your system status:
# Check GPU frequency and temperature
sensors
# Check GPU clock state (live)
# Pick the right card: ls -l /sys/class/drm/ | grep card (usually card0 for the BC-250)
watch -n 1 cat /sys/class/drm/card0/device/pp_dpm_sclk
watch -n 1 cat /sys/class/drm/card0/device/pp_dpm_mclk
# Note: `gpu_busy_percent` does NOT work on the BC-250 (amdgpu driver leaves
# the metric field uninitialised, hence the famous MangoHud 655% bug).
# See the MangoHud admonition further down for the fix and root cause.
# Check if GPU driver is loaded
lspci -k | grep -A 3 VGA
# Verify Mesa version
glxinfo | grep "OpenGL version"
# Check governor status
systemctl status cyan-skillfish-governor-smu
# or if using TT governor:
# systemctl status cyan-skillfish-governor-tt
GPU Locked at 1500MHz¶
Symptoms:
- GPU frequency stuck at 1500MHz regardless of load
- Low FPS in games despite acceptable temperatures
- radeontop or monitoring tools show constant 1500MHz
Cause: The default GPU governor is locked by BIOS. Without a user-space governor, the GPU cannot scale frequency dynamically.
Solution: Install GPU Governor
The BC-250 requires a custom GPU governor to enable dynamic frequency scaling between 350-2300MHz (patched kernel) or 1000-2000MHz (unpatched kernel).
Option 1: Cyan Skillfish Governor SMU (Recommended)¶
Features: - Continuous frequency adjustment via SMU firmware calls - Maintains GPU utilization 70-95% (configurable) - No kernel patch required on any distro - 24ms burst-to-max time - More responsive to burst loads
Installation:
Fedora/RPM:
Arch/AUR:
Debian/Ubuntu:
Upstream does not ship a .deb. Grab the latest cyan-skillfish-governor-smu-*-x86_64-linux.tar.gz from filippor's releases, extract it, and run sudo ./scripts/install.sh.
Configuration:
The governor uses voltage/frequency pairs. Edit the config file and add as many stable points as you've tested:
safe-points = [
{ freq_mhz = 350, voltage_mv = 570 },
{ freq_mhz = 860, voltage_mv = 600 },
{ freq_mhz = 1090, voltage_mv = 650 },
{ freq_mhz = 1280, voltage_mv = 700 },
{ freq_mhz = 1460, voltage_mv = 750 },
{ freq_mhz = 1620, voltage_mv = 800 },
{ freq_mhz = 1760, voltage_mv = 850 },
{ freq_mhz = 1890, voltage_mv = 900 },
{ freq_mhz = 2030, voltage_mv = 950 },
{ freq_mhz = 2090, voltage_mv = 975 },
{ freq_mhz = 2140, voltage_mv = 1000 },
{ freq_mhz = 2230, voltage_mv = 1050 },
]
load_target = { min = 70, max = 95 }
Test Your Values
Default values are conservative. Test stability for your specific board:
# Stop the governor
sudo systemctl stop cyan-skillfish-governor-smu
# Manually set frequency/voltage
echo vc 0 <CLOCK> <VOLTAGE> > /sys/devices/pci0000:00/0000:00:08.1/0000:01:00.0/pp_od_clk_voltage
# Run stress test (benchmark, game, etc.)
# If stable, add to config. If crashes, increase voltage or lower frequency.
Enable and start:
GPU Frequency Not Scaling Above 2000MHz¶
Symptoms: - Governor installed but GPU won't go above 2000MHz - Governor config shows max 2300MHz but actual frequency limited
Cause: Kernel doesn't have the frequency range patch.
Solution: Apply Kernel Patch
The BC-250 needs a kernel patch to unlock frequency range from 500-2500MHz (default is 1000-2000MHz).
Pre-patched Kernels:
Bazzite: Uses patched kernel by default (no action needed)
CachyOS:
Fedora/Arch - Manual Patch:
Download the patch:
wget https://raw.githubusercontent.com/mothenjoyer69/bc250-documentation/main/kernel-patches/amdgpu-frequency-range.patch
Apply to kernel source and recompile, or use a tool like dkms or CachyOS kernel manager.
Verification:
Software Rendering (llvmpipe) Instead of GPU¶
Symptoms:
- glxinfo | grep "OpenGL renderer" shows "llvmpipe"
- Games extremely slow (5-10 FPS)
- Steam shows "Software Rendering" in system info
Diagnostic:
glxinfo | grep "OpenGL renderer"
# Bad: OpenGL renderer string: llvmpipe (LLVM 15.0.0, 256 bits)
# Good: OpenGL renderer string: AMD Radeon Graphics (gfx1013, LLVM 15.0.0, DRM 3.54, 6.12.0)
vulkaninfo --summary
# Should show AMD RADV driver
Cause 1: Mesa Too Old
Solution: Upgrade to Mesa 25.1.3 or newer
Fedora 43+:
Fedora 42 is End of Life
Upgrade to Fedora 43 which ships Mesa 25.x in repos.
Arch/Manjaro:
Verification:
Cause 2: Wrong Graphics Adapter Selected
Some games (especially Red Dead Redemption 2) default to software rendering.
Solution:
Check available adapters:
In-game, change graphics adapter number to match the GPU (not llvmpipe).
For RDR2 specifically, launch with:
Cause 3: Driver Not Loaded
Check if amdgpu driver is loaded:
If not loaded, check:
Common fix - ensure these kernel parameters are set (and nomodeset is removed):
# Edit /etc/default/grub (sg_display=0 only needed for kernels < 6.10)
GRUB_CMDLINE_LINUX_DEFAULT="amdgpu.sg_display=0"
# Regenerate grub config
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # Fedora
sudo grub-mkconfig -o /boot/grub/grub.cfg # Arch
Low FPS / Poor Gaming Performance¶
Check GPU Utilization¶
# Monitor GPU clock state under load (proxy for utilisation since gpu_busy_percent is broken on BC-250)
watch -n 1 cat /sys/class/drm/card0/device/pp_dpm_sclk
# If the * marker sits at the lowest level under a heavy game = governor not boosting
# If it sits at the top level = GPU is loaded; check temps and thermal throttle
# Alternative: `radeontop` for a busier overview (apt/dnf/pacman install radeontop)
Issue: Governor Not Installed¶
See "GPU Locked at 1500MHz" section above.
Issue: Broken Kernel Version¶
Symptoms: - Previously working setup suddenly has poor performance after kernel update - Random GPU crashes under load - System freezes during gaming - Running kernel 6.15.0-6.15.6 or 6.17.8-6.17.10
Solution:
Install Working Kernel
AVOID BROKEN KERNEL VERSIONS
Kernel 6.15.0-6.15.6 and 6.17.8-6.17.10 break GPU driver support. Use 6.18.18 LTS (recommended) or 6.17.11+ for best performance.
Arch/Manjaro:
# Option 1: Install working kernel (6.17.11+ or 6.18.x)
sudo pacman -S linux # Check version is 6.17.11+ or 6.18.x
# Option 2: Install LTS kernel for guaranteed stability
sudo pacman -S linux-lts linux-lts-headers
# Set as default in bootloader
CachyOS:
# Check version first
paru -S linux-cachyos # Ensure it's 6.17.11+ or 6.18.x
# Or for LTS stability:
paru -S linux-cachyos-lts linux-cachyos-lts-headers
Fedora:
# Check current kernel
uname -r
# Install older kernel from koji if needed
# Or wait for kernel fixes
Issue: IOMMU Causing Crashes¶
Symptoms: - Random system crashes under GPU load - Weird performance issues - System hangs
IOMMU is Broken on BC-250
IOMMU MUST be disabled in BIOS. It is broken on BC-250 and causes crashes, display failures, and instability.
Solution:
Disable IOMMU in BIOS (required), or add kernel parameter as backup:
Issue: Game-Specific Optimizations¶
Steam Launch Options:
# FSR enabled
WINE_FULLSCREEN_FSR=1 %command%
# Vulkan backend
PROTON_USE_WINED3D=0 %command%
# Gamescope for consistent frametimes
gamescope -W 1920 -H 1080 -f -- %command%
Thermal Throttling¶
Symptoms: - Performance starts good then degrades after 5-15 minutes - Temperatures above 85-90C - GPU frequency drops under sustained load
Check Temperatures:
Safe operating temperatures: - 70-85C: Normal under load - 85-90C: High but acceptable - 90C+: Thermal throttling likely
Solutions:
1. Improve Cooling¶
Arctic P12 Max recommended (high static pressure: 3.27 mmH2O)
Alternative good options: - Noctua NF-A12x25 (2.34 mmH2O) - Arctic P14 PWM (2.4 mmH2O)
Fan configuration:
2. Repaste / Replace Thermal Pads¶
- APU die: Use quality thermal paste (Arctic MX-4, Noctua NT-H1) or PTM7950 phase-change pad
- Memory/VRM: 2mm thermal pads (verify thickness first)
- Ensure heatsink is properly secured
3. Undervolt GPU¶
If thermal throttling persists, try undervolting:
# Example: 2000MHz at 940mV instead of 1000mV
echo vc 0 2000 940 > /sys/devices/pci0000:00/0000:00:08.1/0000:01:00.0/pp_od_clk_voltage
echo c > /sys/devices/pci0000:00/0000:00:08.1/0000:01:00.0/pp_od_clk_voltage
Test stability with benchmarks. If stable, update governor config.
VRAM Allocation Issues¶
Checking Current VRAM Split¶
Issue: Game Crashes with "Out of Memory"¶
Symptoms: - Games crash after loading - Artifacts then crash (Company of Heroes 3, RDR2) - "Out of memory" errors
Common with: 512MB dynamic allocation + ZRAM enabled
Solution 1: Use Fixed VRAM Allocation
Boot into BIOS and change VRAM allocation: - For most games: 4GB VRAM / 12GB RAM - For competitive/esports: 6GB VRAM / 10GB RAM - For VRAM-heavy games: 8GB VRAM / 8GB RAM or 10GB VRAM / 6GB RAM
Dynamic Allocation Issues
512MB dynamic allocation conflicts with ZRAM on some games. Use fixed allocation instead.
Solution 2: Disable ZRAM
Solution 3: Replace ZRAM with zswap (Better for RAM-Hungry Games)
zswap compresses swap in RAM before writing to disk, avoiding ZRAM's VRAM conflicts while still helping with memory pressure.
Bazzite setup:
# Disable zram
echo "" | sudo tee /etc/systemd/zram-generator.conf
# Set up swapfile first (see https://docs.bazzite.gg/Advanced/swapfile/)
# Enable lz4 drivers in initramfs
rpm-ostree initramfs --enable \
--arg=--add-drivers \
--arg=lz4 \
--arg=--add-drivers \
--arg=lz4_compress
# Add kernel parameters
rpm-ostree kargs --append-if-missing="zswap.enabled=1 zswap.max_pool_percent=25 zswap.compressor=lz4"
# Reboot, then set swappiness
echo 180 | sudo tee /proc/sys/vm/swappiness
Verify: grep -r . /sys/module/zswap/parameters/
zswap and SSD Wear
zswap eventually writes to your swap file on disk. Not recommended on slow storage devices.
Solution 4: Increase VRAM Visibility (Advanced)
For LLM/AI workloads that need more than 12GB VRAM:
Add to kernel command line:
This allows GPU to allocate up to ~14.75GB VRAM. Limit usage to 14.25-14.5GB in applications to avoid crashes.
Stuttering and Frame Pacing¶
Issue: Inconsistent Frame Times¶
Symptoms: - FPS counter shows 60+ but feels choppy - Frame time graph shows spikes - Stuttering during gameplay
Solution 1: Use Gamescope
Gamescope provides consistent frame pacing:
# Install gamescope
sudo dnf install gamescope # Fedora
sudo pacman -S gamescope # Arch
# Launch game through gamescope
gamescope -W 1920 -H 1080 -f -- %command%
# With frame limit
gamescope -W 1920 -H 1080 -r 60 -f -- %command%
Solution 2: Disable Compositor (X11)
For KDE Plasma (X11):
# Disable compositor in System Settings > Display > Compositor
# Or use keyboard shortcut: Alt+Shift+F12
Solution 3: Use Wayland
Wayland generally has better frame pacing than X11.
Solution 4: Audio Configuration
Some games (especially emulators) have frame pacing tied to audio:
# Check PulseAudio/PipeWire sample rate
pactl info | grep "Default Sample"
# Lock to 48kHz
# Edit /etc/pulse/daemon.conf (PulseAudio) or PipeWire config
default-sample-rate = 48000
For Ryujinx (Switch emulator): Change audio backend in settings can dramatically improve performance.
System Configuration Issues¶
Kernel Parameters (Optimal)¶
Edit /etc/default/grub:
Explanation:
- amdgpu.sg_display=0: Required for kernel < 6.10 (doesn't hurt on newer)
- mitigations=off: +18 FPS in Cyberpunk 2077 (60→78 FPS) but reduces security
Security Warning
mitigations=off disables CPU vulnerability mitigations. Only use if you trust all code running on the system.
Regenerate grub:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg # Fedora
sudo grub-mkconfig -o /boot/grub/grub.cfg # Arch
Remove nomodeset¶
Critical: Remove nomodeset After Driver Installation
nomodeset is ONLY for installation. It disables GPU acceleration. Remove it after Mesa is installed.
Check if present:
If found, remove it and regenerate grub config.
Performance Monitoring Tools¶
Real-time Monitoring¶
MangoHud (in-game overlay):
# Install
sudo dnf install mangohud # Fedora
sudo pacman -S mangohud # Arch
# Use in Steam launch options
mangohud %command%
# Or global config in ~/.config/MangoHud/MangoHud.conf
MangoHud reports 655% GPU usage on BC-250
The BC-250 amdgpu driver does not populate the GPU activity field of /sys/.../gpu_metrics. Bytes 0x1C-0x1D stay at 0xFFFF, MangoHud reads that as 65535 and divides by 100, so the overlay shows 655% GPU load. Reproduced on Fedora 43, kernel 7.0.9-105.fc43.x86_64, MangoHud 0.8.2.
Fix: run cyan-skillfish-governor-smu (smu branch) with its defaults. The governor bind-mounts a writable tmpfs file over gpu_metrics and writes a sampled activity value (busy-flag method) into byte 0x1C every cycle. Anything that reads gpu_metrics (MangoHud, radeontop, etc.) then sees a sane percent. No MangoHud config change required.
# /etc/cyan-skillfish-governor-smu/config.toml — defaults shown for reference
[gpu-usage]
fix-metrics = true
method = "busy-flag"
flush-every = 10
Verified live: with the governor stopped, bytes at offset 0x1C of gpu_metrics read ffff. With the governor running, the same bytes read 0000 at idle (0%). Bind mount is visible in /proc/self/mountinfo while the service is active.
Source: filippor/cyan-skillfish-governor smu branch — src/gpu_usage_fix.rs.
Radeontop (terminal):
Sensors (temperatures/voltages):
CoolerControl (GUI):
Benchmarking¶
Unigine Superposition:
# Good for thermal/stability testing
# 1080p Extreme preset
# Stock BC-250: ~3888 score
# 2.22GHz OC: ~4118 score
vkmark (Vulkan):
Cyberpunk 2077 Benchmark: Popular community test - consistent results: - Stock: ~57 FPS (1080p high) - 2.22GHz: ~60 FPS - With mitigations=off: +15-20 FPS
Testing GPU Load on a Headless BC-250¶
A lot of BC-250 builds run headless (LLM server, render farm, etc). When you want to verify the GPU is actually being loaded by your workload, two pitfalls to avoid:
Don't use glmark2 --off-screen to test GPU load on a headless box
Without a display, glmark2 --off-screen silently falls back to LLVMpipe (CPU software rendering). The GPU does nothing, gpu_busy_percent stays at 0, the governor never boosts, and you may chase a phantom "governor doesn't work" bug for hours. This is documented experience from BC-250 maintainers.
Use one of these to load the GPU for real:
# Vulkan compute, deterministic
clpeak
# Real-world Vulkan workload
llama-bench -m model.gguf -ngl 99
# Vulkan rendering benchmark (offscreen works correctly)
vkmark
To confirm the GPU is genuinely loaded before drawing any conclusions from a test, check the GPU clock and power are actually climbing:
# In another terminal while your test runs
watch -n 1 cat /sys/kernel/debug/dri/0/amdgpu_pm_info 2>/dev/null \
| grep -E "GFX|SCLK|MCLK|^[[:space:]]*[0-9]+\.[0-9]+ W"
If SCLK stays at idle and power stays under 60 W during your "load test", the test isn't loading the GPU and any conclusions you draw from it are noise.
Distribution-Specific Issues¶
Fedora¶
Issue: MTG Arena crashes GUI - Confirmed issue on Fedora with Gnome - Works fine on Manjaro - Try KDE Plasma instead of Gnome
Bazzite¶
Issue: Freeze on Sleep - Known issue: system appears frozen when entering sleep - Solution: Press power button to wake (don't hold, just press)
Issue: Bazzite Update Breaks System - If an update causes issues, rollback:
CachyOS¶
Issue: Installation ISO Won't Boot - Use LTS kernel ISO - Build custom ISO with LTS kernel (see guide in System Configuration section)
Quick Performance Checklist¶
Use this checklist to verify your system is properly configured:
- Mesa version 25.1.3 or higher
- Kernel 6.18.18 LTS (recommended), 6.17.11+, or 6.12.x-6.14.x LTS (NOT 6.15.0-6.15.6 or 6.17.8-6.17.10)
- GPU governor installed and running (cyan-skillfish-governor-smu recommended)
-
nomodesetremoved from kernel parameters - BIOS flashed to P3.00 with 512MB dynamic or 4-12GB fixed VRAM
-
glxinfoshows RADV driver, not llvmpipe - Temperatures under 85C under load
- Cooling with high static pressure fan (>2.0 mmH2O)
- IOMMU disabled in BIOS
-
systemctl status cyan-skillfish-governor-smushows active
Quick test:
# This should show GPU scaling dynamically
watch -n 0.5 'cat /sys/class/drm/card0/device/pp_dpm_sclk && cat /sys/class/drm/card0/device/pp_dpm_mclk'
# Run a game or benchmark
# Frequency should scale from ~1000MHz idle to 2000+MHz under load
# GPU utilization should be 80-100% in demanding scenes
Getting Help¶
If you're still experiencing performance issues after following this guide:
-
Gather system information:
-
Join the Discord community:
- BC-250 Discord: Largest community, most active support
-
Search for your specific issue first - likely already solved
-
Check GitHub documentation:
- https://github.com/mothenjoyer69/bc250-documentation
- https://github.com/AMD-BC-250/documentation