Scenario: GPU load is invisible in standard monitors
You just launched a heavy video render or a demanding game on your Fedora laptop. The fans spin up, but the frame rate feels sluggish. You open htop and see the CPU cores are busy, but you have no idea if the Intel graphics engine is maxed out, throttling, or stuck at a low frequency. Standard system monitors only show CPU threads. They cannot see the dedicated hardware engines inside the GPU. You need a tool that reads the Performance Monitoring Unit counters exposed by the kernel to understand what the GPU is actually doing.
What's actually happens
Intel GPUs split work across specialized hardware engines. The 3D engine handles OpenGL and Vulkan rendering. The Video engine handles hardware decoding and encoding for formats like H.264 and HEVC. The Copy engine moves data between system memory and the GPU. These engines run independently. A video player might keep the Video engine at 100% while the 3D engine sits idle.
Think of the GPU like a kitchen with specialized stations. The 3D engine is the chef chopping vegetables. The Video engine is the dishwasher processing plates. The Copy engine is the busboy moving trays. You cannot judge the kitchen's speed by watching the chef if the dishwasher is the bottleneck. intel_gpu_top gives you a view of every station at once.
The tools also report residency counters like RC6 and PC6. These measure how much time the GPU spends in deep power-saving states. High RC6 means the GPU is idle and saving power. Low RC6 means the hardware is active. Frequency scaling adjusts the clock speed based on load. If the frequency is stuck low, the GPU might be hitting a thermal or power limit.
Install the monitoring tools
Fedora ships the necessary utilities in the intel-gpu-tools package. This package includes intel_gpu_top, intel_gpu_frequency, and related diagnostics. Install it from the default repositories.
Here's how to install the monitoring suite from the default repositories.
sudo dnf install intel-gpu-tools # WHY: Installs intel_gpu_top, intel_gpu_frequency, and related utilities from Fedora repos
If the package is not found, the metadata cache might be stale. Run sudo dnf upgrade --refresh to update the cache and try again. This is the standard weekly maintenance command on Fedora.
Run the install as root. The tools need access to kernel interfaces that unprivileged users cannot touch.
Run the interactive monitor
intel_gpu_top provides a live, top-style interface. It updates every second and shows utilization percentages for each engine. It also displays the current frequency and residency counters. This is the best way to observe load while a workload is running.
Run the interactive monitor to see real-time engine utilization.
intel_gpu_top # WHY: Launches the top-style interface showing 3D, Video, and Copy engine percentages
The output looks like this. The comments explain the key metrics.
GPU load: 12.5% RC6: 85.0% PC6: 90.0% freq: 1200MHz
# GPU load is the aggregate utilization. RC6 is residency in the deep power-saving state.
# High RC6 means idle. PC6 is residency in the partial power-saving state.
3D: 10.0% Video: 2.0% Copy: 0.5%
# Engine utilization percentages. 3D handles rendering. Video handles encode/decode.
# Copy handles memory transfers. Percentages sum to less than GPU load due to overhead.
If you see "Permission denied" or "No such file or directory", the tool cannot read the device files under /dev/dri. This is a permissions issue, not a bug. Fix it by adding your user to the video group.
Fix permission errors by adding your user to the video group.
sudo usermod -aG video $USER # WHY: Adds your user to the video group, granting read access to /dev/dri devices
The -a flag appends the group. Omitting -a replaces all groups and can lock you out of sudo or other essential groups. Always use -a. Log out and back in for the group change to take effect. The change does not apply to your current session until you restart the login process.
Watch the percentages while the workload runs. Static numbers mean the tool is broken, not the GPU.
Check frequency and power states
intel_gpu_frequency queries the GPU frequency states and current power management mode. It does not provide an interactive interface. It prints the current frequency, the minimum and maximum frequencies, and the power state. Use this tool when you need to verify frequency scaling or log a snapshot of power settings.
Check power states and frequency scaling when the GPU is idle or under load.
intel_gpu_frequency # WHY: Queries the GPU frequency states and current power management mode
The output shows the current frequency in MHz. Compare this to the maximum frequency. If the current frequency is significantly lower than the maximum while the GPU is under load, the system might be throttling due to temperature or power limits.
For scripting or automated monitoring, you can extract raw data. intel_gpu_top supports a JSON output mode in recent versions. This is useful for logging metrics over time or feeding data into a dashboard.
Capture usage data to a file for post-analysis of a long render job.
intel_gpu_top --json > gpu_log.json # WHY: Outputs metrics in JSON format for parsing by scripts or log analyzers
Verify the JSON output is valid before processing it. Check the first few lines to ensure the structure matches your parser expectations.
Verify the fix
Run intel_gpu_top while a known workload is active. Launch a game, start a video render, or play a high-resolution video. You should see the relevant engine percentage rise above zero. The 3D engine should increase during gaming. The Video engine should increase during hardware-accelerated playback.
If the numbers stay flat while the system is busy, the tool is not reading the counters correctly, or the workload is not hitting the GPU. Check the renderer string to confirm which GPU is active.
Confirm which GPU is handling the workload on hybrid systems.
glxinfo | grep "OpenGL renderer" # WHY: Identifies the active graphics renderer, distinguishing between Intel iGPU and discrete GPUs
If the output shows an NVIDIA or AMD renderer, the discrete GPU is doing the work. intel_gpu_top only monitors the Intel integrated graphics. On laptops with hybrid graphics, the discrete GPU might handle the workload while the Intel GPU remains idle.
Check the renderer string before blaming the driver. The wrong GPU is the culprit more often than a bad kernel.
Common pitfalls
Permission errors are the most common issue. The tool requires read access to /dev/dri. The video group provides this access. If you added your user to the group and still see errors, verify the group exists and the user is actually in it. Run groups $USER to check. Log out and back in if the group is missing from the output.
Wayland does not block intel_gpu_top. The tool reads kernel counters directly, bypassing the compositor. However, some desktop environments might restrict access to device files for security reasons. If you see denials, check the SELinux audit logs. Do not disable SELinux immediately. Read the denial summary first.
Investigate access denials by checking SELinux audit logs before changing security policies.
sudo journalctl -t setroubleshoot | tail -n 20 # WHY: Shows recent SELinux denial summaries with actionable context
The setroubleshoot service provides one-line summaries of denials with suggestions. If the log indicates a policy issue, you can create a local policy module or adjust the boolean. Disabling SELinux with setenforce 0 exposes the system to privilege escalation. Use it only for temporary testing and revert to enforcing mode immediately after.
Hybrid graphics confusion causes false negatives. If you have a laptop with both Intel and NVIDIA GPUs, intel_gpu_top only shows the Intel engine. The NVIDIA GPU might be running the workload. Use glxinfo or vulkaninfo to check the active renderer. If the discrete GPU is active, you need NVIDIA or AMD monitoring tools instead.
Thermal data is not included. intel_gpu_top focuses on engine load and frequency. It does not report temperature. Use sensors from the lm-sensors package to check GPU temperature. Install lm-sensors and run sensors to see thermal readings.
Run journalctl -xe if the tool crashes or fails to start. The extended output includes explanatory text and jumps to the end of the log. This helps identify kernel errors or module loading failures.
Decision matrix
Use intel_gpu_top when you need a live view of engine utilization during gaming or rendering.
Use intel_gpu_frequency when you want to verify frequency scaling and power states without an interactive interface.
Use intel_gpu_top --json when you are building a script to log metrics over time.
Use sensors from lm-sensors when you need thermal data, as GPU tools do not report temperature.
Use glxinfo when you suspect the workload is running on a discrete GPU instead of the Intel integrated graphics.
Use journalctl -t setroubleshoot when you encounter permission denials and need to check for SELinux policy issues.