Introduction
Introduction Statistics Contact Development Disclaimer Help
Title: External GPU on Linux review
Author: Solène
Date: 01 September 2021
Tags: linux gentoo games egpu
Description:
# Introduction
I like playing video games, and most games I play require a GPU that is
more powerful than the integrated graphic chipset that can be found in
laptop or computers. I recently found that external graphic card were
a thing, and fortunately I had a few spare old graphic card for trying.
The hardware is called an eGPU (for external GPU) and are connected to
the computer using a thunderbolt link. Because I buy most of my
hardware second hand now, I've been able to find a Razer Core X eGPU
(the simple core X and not the core X Chroma which provides USB and
RJ45 connectivity on the case through thunderbolt), exactly what I was
looking for. Basically, it's an external case with a PSU inside and a
rack, pull out the rack and insert the graphic card, and you are done.
Obviously, it works fine on Windows or Mac but it can be tricky on
Linux.
Razer core X product
Attempt to make a picture of my eGPU with an nvidia 1060 in it
# My setup
I'm using a Lenovo T470 with an i5 CPU. When I want to use the eGPU, I
connect the thunderbolt wire and keyboard / mouse (which I connect
through an USB KVM to switch those from a computer to another). The
thunderbolt port also provide power to the laptop which is good to
know.
# How does it work?
There are two ways to use this device, the display can be connected to
the eGPU itself or the rendering could be done on the laptop (let's say
we only target laptops here) using the eGPU as a discrete card (only
rendering, without display). Both modes have pros and cons.
* External display Pros: best performance, allow many displays to be
used
* External display Cons: require a screen
* Discrete mode Pros: no extra wire, no different setup when using the
laptop without the eGPU
* Discrete mode Cons: performance penalty, support doesn't work well on
Linux
The performance penalty comes from the fact the thunderbolt bandwidth
is limited, and if you want to display on your screen you need to
receive the data back which will reduce the bandwidth allowed for
rendering. A penalty of at least 20% should be expected in normal
mode, and around 40% in discrete mode. This is not really fun but for
a nice boost with an old graphic card this is still nice.
eGPU on Linux with a Razer core X Chroma
eGPU benchmarks
# Configuration (NVIDIA)
It's quite simple now in 2023 (blog update), the first step is to
install nvidia-drivers.
## Discrete mode
- Add your user to the video group (at least on Gentoo)
- No `/etc/X11/xorg.conf` file is required
- The graphical card should appear in `nvidia-settings` under a "PRIME"
menu
- Use `prime-run` as a prefix to run commands, the discrete mode is
simply enabled by environment variables. If `prime-run` isn't a thing
in your distribution, create a script `nvidia-offload` like explained
in the NixOS wiki
NixOS wiki: Nvidia - offload mode
If you want to run Flatpak programs with the discrete GPU, you will
need to set all the environment variables in the flatpak program
environment. You can't just set them in your shell and run flatpak
from there because of the sandboxing.
## External display
- Run `nvidia-xconfig` to create a `/etc/X11/xorg.conf` file that uses
the Nvidia card as the main display
## Both mode
I ended figuring a `xorg.conf` allowing me to keep the same file with
and without the eGPU, and to use the discrete and external display at
the same time. The funniest part is if you run a program on the nvidia
screen and move it back to the laptop screen, the eGPU continues to
render it.
It's by far the most convenient configuration as you have nothing to
tweak, and you can use laptop + eGPU displays.
```xorg.conf
Section "ServerLayout"
Identifier "layout"
Screen 0 "intel"
Inactive "nvidia"
Option "AllowNVIDIAGPUScreens"
EndSection
Section "Device"
Identifier "intel"
Driver "modesetting"
BusID "PCI:0:2:0"
EndSection
Section "Screen"
Identifier "intel"
Device "intel"
EndSection
Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID "PCI:10:0:0"
Option "AllowExternalGpus" "True"
EndSection
Section "Screen"
Identifier "nvidia"
Device "nvidia"
EndSection
```
## Switching between modes
If you want to switch from one to the other, you need to exit all X
servers first. Booting with a `xorg.conf` for Nvidia while not having
a Nvidia card plugged in will prevent X to start, which is annoying.
The program egpu-switch can help in that regard, but it can't choose
between discrete or external display mode, you will need to decide
which mode you prefer when the card is plugged by providing the
according xorg.conf file.
egpu-switcher GitHub project page
# What to expect of it on Linux?
I've been using this on Gentoo only so far, but I had a previous
experience with a pretty similar setup a few years ago with a laptop
with a discrete nvidia card (called Optimus at that time), and the GPU
was only usable as a discrete GPU and it was a mess at that time.
As for the eGPU, in external mode it works fine using the nvidia
driver, I needed an xorg.conf file to tell to use the nvidia driver,
then the display would be fine and 3D would work perfectly as if I was
using a "real" card on a computer. I can play high demanding games
such as Control, Death Stranding or other games using my Thinkpad
Laptop when docked, this is really nice!
The setup is a bit weird though, if I want to undock, I need to prepare
the new xorg.conf file and stop X, disconnect the eGPU and restart the
display manager to login. Not very easy. I've been able to script it
using a simple script at boot that will detect the Nvidia GPU and
choose the correct xorg.conf file just before starting the display
manager, it works quite fine and makes life easier.
# Video games?
I've been playing Steam video games, it works absolutely perfectly due
to their work on Proton to make Windows games running. GOG games works
fine too, I use Lutris games library manager to handle them and it
works so far.
Now, there is the tricky discrete mode. On linux, the bumblebee
project allows rendering a program in a virtual display to benefit from
the 3D acceleration and then show it on another device, this work was
done for Optimus hardware hence the bumblebee name (related to
Transfomers lore). Steam doesn't like bumblebee at all and won't start
game, this is a known bug, Steam is bad at managing multiple GPUs.
I've not been able to display anything using bumblebee.
On the other hand, native Linux GOG games were working fine using
bumblebee, however I don't own much high demanding Linux games so I've
not been able to see if the performance hit was hard. Windows GOG
games wouldn't run, partially because the DXVK (directX to vulkan) Wine
rendering can't be used because bumblebee doesn't allow using Vulkan
graphical API and error messages were unhelpful. I have literally lost
two days of my life trying to achieve something useful with the
discrete GPU mode but nothing came out of it, except native Linux
games.
Playing Control on Gentoo (windowed for the screen)
# Why using an eGPU?
Laptops are very limited in their upgrade capabilities, adding a GPU
could avoid someone to own a "gaming" tower PC and a good laptop. The
GPU is 100% replaceable because the case offers a pci express port and
a standard PSU (which can be replaced too!). The EGPU could be shared
among a few users in a home too. This is a nice way to recycling old
GPUs for a nice graphic boost to play everything that is more than 5
years old (and that's a bunch of good games!). I think using a top
notch GPU in this would be a waste though.
# Conclusion
I'm pretty happy with the experience so far, now I can play my
favorites games on Linux using the same computer I like to use all the
day. While the experience is not as plug and play than it is on
Windows, it is solid and stable.
# Troubleshoot
Some reminders when something is wrong.
## OpenSUSE setup
This distribution ships with a tool "prime-select" which is very
convenient, you can pick which driver you want to enable first, or if
you want to do discrete rendering.
## No sound
An udev rule is certainly blocking the audio device for some reasons...
On a system, I found the file
"/lib/udev/rules.d/90-nvidia-udev-pm-G05.rules" with a comment about
disabling audio devices, commenting it solves the problem.
You are viewing proxied material from dataswamp.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.