LizardByte / LizardByte/Sunshine

GPU performance drop tied to stream framerate on Linux

Open
#4,567 21 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
C++
Stars
41.3k
Forks
2.1k
Avg merge
23h 47m
Merged PRs (30d)
124

Description

### Is there an existing issue for this?

- [x] I have searched the existing issues

### Is your issue described in the documentation?

- [x] I have read the documentation

### Is your issue present in the latest beta/pre-release?

This issue is present in the latest pre-release

### Describe the Bug

GPU performance is limited, tied to the stream framerate. Using Unigine Superposition to induce GPU load and nvidia-smi to monitor GPU utilization (these are all eye-balled numbers, but broadly show scaling).

- Not streaming: 99% GPU utilization
- Stream @ 30 fps: 94%
- Stream @ 60 fps: 90%
- Stream @ 100 fps: 80%
- Stream @ 144 fps: 70%

The non-vsync fps in Superposition is also reduced accordingly. This behavior mirrors what I see in games.

When at 144 fps, the stream fps is indeed that per Moonlight info. Host processing latency avg 6.0 ms. No dropped frames. Codec is HEVC.

### Expected Behavior

No GPU perf reduction with increased framerate.

### Additional Context

I have also corroborated the issue with the latest Bazzite image to rule out guest OS config.

The display framerate seems irrelevant.

The stream resolution seems irrelevant.

This occurs with both KMS (on Plasma 6 Wayland) and NvFBC (on X11).

This occurs with both nvenc and the software encoder.

Desktop is Plasma 6.

This is in a VM using GPU passthrough, and over a virtual ethernet connection.

### Host Operating System

Linux

### Operating System Version

NixOS unstable fb7944c (Kernel 6.12.63)

also tested on Bazzite

### Architecture

amd64/x86_64

### Sunshine commit or version

v2026.105.231052

### Package

Linux - nixpkgs (Third Party)

### GPU Type

NVIDIA

### GPU Model

5090

### GPU Driver/Mesa Version

Nvidia Open 580.119.02

### Capture Method

KMS (Linux)

also tested on NvFBC

### Config

```Shell
# most values irrelevant so redacted
cert=...
file_apps=...
global_prep_cmd=[{"do":"/bin/sunshine-prep"}]
pkey=...
port=...
sunshine_name=...
```

### Apps

```json

```

### Relevant log output

Tested several different configs, only including the logs from NixOS+Plasma6+KMS+nvenc.

```shell
Info: Sunshine version: 2026.105.231052 commit:
Info: Package Publisher: nixpkgs
Info: Publisher Website: https://nixos.org
Info: Get support: https://github.com/NixOS/nixpkgs/issues
Info: config: 'cert' = ...
Info: config: 'global_prep_cmd' = [{"do":"/bin/sunshine-prep"}]
Info: config: 'file_apps' = ...
Info: config: 'pkey' = ...
Info: config: 'port' = ...
Info: config: 'sunshine_name' = ...
Error: Failed to create session:
Info: Found display [wayland-0]
Info: Found interface: zxdg_output_manager_v1(31) version 3
Info: Found interface: zwp_linux_dmabuf_v1(58) version 5
Info: Found interface: wl_output(65) version 4
Warning: Missing Wayland wire for wlr-export-dmabuf
Info: /dev/dri/card0 -> nvidia-drm
Info: Found display [wayland-0]
Info: Found display [wayland-0]
Info: Found interface: zxdg_output_manager_v1(31) version 3
Info: Found interface: zwp_linux_dmabuf_v1(58) version 5
Info: Found interface: wl_output(65) version 4
Info: Resolution: 3840x2160
Info: Offset: 0x0
Info: Logical size: 2259x1271
Info: Name: DP-3
Info: Found monitor: GSM LG ULTRAGEAR+
Info: -------- Start of KMS monitor list --------
Info: Monitor 0 is DP-3: GSM LG ULTRAGEAR+
Info: --------- End of KMS monitor list ---------
Warning: Gamepad ds5 is disabled due to Permission denied
Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
Info: Trying encoder [nvenc]
Info: Screencasting with KMS
Info: /dev/dri/card0 -> nvidia-drm
Info: Found monitor for DRM screencasting
Info: Found connector ID [138]
Info: Found cursor plane [55]
Info: Creating encoder [h264_nvenc]
Info: Color coding: SDR (Rec. 601)
Info: Color depth: 8-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info: Creating encoder [hevc_nvenc]
Info: Color coding: SDR (Rec. 601)
Info: Color depth: 8-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info: Creating encoder [av1_nvenc]
Info: Color coding: SDR (Rec. 601)
Info: Color depth: 8-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info: Screencasting with KMS
Info: /dev/dri/card0 -> nvidia-drm
Info: Found monitor for DRM screencasting
Info: Found connector ID [138]
Info: Found cursor plane [55]
Info: Creating encoder [hevc_nvenc]
Info: Color coding: SDR (Rec. 709)
Info: Color depth: 10-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info: Creating encoder [av1_nvenc]
Info: Color coding: SDR (Rec. 709)
Info: Color depth: 10-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info:
Info: // Ignore any errors mentioned above, they are not relevant. //
Info:
Info: Found H.264 encoder: h264_nvenc [nvenc]
Info: Found HEVC encoder: hevc_nvenc [nvenc]
Info: Found AV1 encoder: av1_nvenc [nvenc]
Info: Starting system tray
Info: Adding avahi service ...
Info: Configuration UI available at [https://localhost:47990]
Info: System tray created
Info: Starting main loop
Info: Avahi service ... successfully established.
Info: // Testing for available encoders, this may generate errors. You can safely ignore those errors. //
Info: Trying encoder [nvenc]
Info: Screencasting with KMS
Info: /dev/dri/card0 -> nvidia-drm
Info: Found monitor for DRM screencasting
Info: Found connector ID [138]
Info: Found cursor plane [55]
Info: Creating encoder [h264_nvenc]
Info: Color coding: SDR (Rec. 601)
Info: Color depth: 8-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info: Creating encoder [hevc_nvenc]
Info: Color coding: SDR (Rec. 601)
Info: Color depth: 8-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info: Creating encoder [av1_nvenc]
Info: Color coding: SDR (Rec. 601)
Info: Color depth: 8-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info: Screencasting with KMS
Info: /dev/dri/card0 -> nvidia-drm
Info: Found monitor for DRM screencasting
Info: Found connector ID [138]
Info: Found cursor plane [55]
Info: Creating encoder [hevc_nvenc]
Info: Color coding: SDR (Rec. 709)
Info: Color depth: 10-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info: Creating encoder [av1_nvenc]
Info: Color coding: SDR (Rec. 709)
Info: Color depth: 10-bit
Info: Color range: JPEG
Info: Streaming bitrate is 1000000
Info:
Info: // Ignore any errors mentioned above, they are not relevant. //
Info:
Info: Found H.264 encoder: h264_nvenc [nvenc]
Info: Found HEVC encoder: hevc_nvenc [nvenc]
Info: Found AV1 encoder: av1_nvenc [nvenc]
Info: Executing Do Cmd: [/bin/sunshine-prep]
Info: Executing [Desktop]
Info: New streaming session started [active sessions: 1]
Info: CLIENT CONNECTED
Info: /dev/dri/card0 -> nvidia-drm
Info: Found display [wayland-0]
Info: Found interface: zxdg_output_manager_v1(31) version 3
Info: Found interface: zwp_linux_dmabuf_v1(58) version 5
Info: Found interface: wl_output(65) version 4
Info: Resolution: 3840x2160
Info: Offset: 0x0
Info: Logical size: 2259x1271
Info: Name: DP-3
Info: Found monitor: GSM LG ULTRAGEAR+
Info: -------- Start of KMS monitor list --------
Info: Monitor 0 is DP-3: GSM LG ULTRAGEAR+
Info: --------- End of KMS monitor list ---------
Info: Screencasting with KMS
Info: /dev/dri/card0 -> nvidia-drm
Info: Found monitor for DRM screencasting
Info: Found connector ID [138]
Info: Found cursor plane [55]
Info: Creating encoder [hevc_nvenc]
Info: Color coding: SDR (Rec. 709)
Info: Color depth: 8-bit
Info: Color range: JPEG
Info: Streaming bitrate is 62988000
Info: Minimum FPS target set to ~30fps (33.3333ms)
Info: Setting default sink to: [sink-sunshine-stereo]
Info: Found default monitor by name: sink-sunshine-stereo.monitor
Info: Opus initialized: 48 kHz, 2 channels, 512 kbps (total), LOWDELAY
```

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the GPU-utilization drop during a streaming session, comparing KMS and NvFBC capture with nvenc and the software encoder as described. Examine the streaming-session, capture, and encoder paths; done means identifying the responsible path and demonstrating that higher stream framerates no longer reduce GPU performance.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp, linux
Domain
audio-video-rtc, operating-systems, performance
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Needs clarification
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.