GPU & Display Config¶
NVIDIA GPU configuration and X11 virtual display setup for headless rendering with Isaac Sim.
Why X11 (not Wayland)?¶
- Isaac Sim uses Xlib/OpenGL directly, no Wayland support
- XWayland has issues -- users switch to X11
- Virtual display setup easier on X11
- Sunshine/Moonlight works better with X11 for unattended access
NVIDIA Persistence Mode¶
| Status | Enabled (set Feb 2026 to fix 30fps idle issue) |
| Service | nvidia-persistenced |
| Override | /etc/systemd/system/nvidia-persistenced.service.d/override.conf |
| Verify | nvidia-smi -q \| grep "Persistence Mode" -- should show Enabled |
| Manual enable | sudo nvidia-smi -pm 1 |
The stock service at /usr/lib/systemd/system/nvidia-persistenced.service has --no-persistence-mode which defeats the purpose. Override removes that flag.
Persistence Mode Required
Known Issue: 30fps after idle¶
- Symptom: Sunshine drops to 30fps after not streaming for a while
- Root cause: Without persistence mode, GPU drops to P8 (low power) when idle, throttling NVENC encoder
- Fix applied:
- Enabled persistence mode (
nvidia-smi -pm 1) - Created systemd override to persist across reboots
- Disabled DPMS in xorg.conf and via
xset -dpms - If it recurs: check
nvidia-smifor P-state (should not be P8) and persistence mode status
X11 / Display Configuration¶
xorg.conf¶
| Path | /etc/X11/xorg.conf |
| Backup | /etc/X11/xorg.conf.backup |
| Display | Headless virtual (no physical monitor) |
| Connected monitor | DP-0 (virtual) |
| DPMS | Disabled (Option "DPMS" "false") |
| DPI | 96x96 |
| ModeValidation | Permissive (AllowNonEdidModes, NoVirtualSizeCheck, etc.) |
Current xorg.conf¶
# Headless virtual display - 2016x1260 (1.5x zoom)
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection
Section "Files"
EndSection
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/psaux"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Virtual"
ModelName "Headless"
Option "DPMS"
EndSection
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "NVIDIA GeForce RTX 3090"
BusID "PCI:1:0:0"
Option "AllowEmptyInitialConfiguration" "True"
Option "ConnectedMonitor" "DP-0"
Option "ModeValidation" "AllowNonEdidModes,NoVirtualSizeCheck,NoMaxPClkCheck"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
SubSection "Display"
Depth 24
Modes "1920x1080"
EndSubSection
EndSection
Available Resolutions (MetaModes)¶
| Resolution | Refresh | Use Case |
|---|---|---|
| 3024x1964 | 60Hz | MacBook Pro 14" native (with notch) |
| 3024x1890 | 60Hz | MacBook Pro 14" native (no notch) |
| 3440x1440 | 60Hz | Ultrawide |
| 3840x2160 | 60Hz | 4K |
| 2560x1440 | 60Hz | 1440p |
| 1920x1080 | 120Hz | 1080p high refresh |
| 1920x1080 | 60Hz | 1080p standard |
| 1600x900 | 60Hz | Low-res fallback |
Custom Resolution with EDID Generator¶
Set a custom resolution (e.g., matching MacBook Pro 14" display):
# Clone EDID generator (if not already done)
cd /tmp && git clone https://github.com/akatrevorjay/edid-generator.git
# Install dependencies
sudo apt-get install -y zsh edid-decode automake dos2unix
# Generate modeline for desired resolution
cvt 2016 1260 60
# Output: Modeline "2016x1260_60.00" 213.00 2016 2152 2368 2720 1260 1263 1269 1307 -hsync +vsync
# Create EDID source file
cd /tmp/edid-generator
echo 'Modeline "2016x1260_60" 213.00 2016 2152 2368 2720 1260 1263 1269 1307 -hsync +vsync ratio=16:10' | ./modeline2edid
# Compile to binary
make 2016x1260_60.bin
# Install EDID
sudo cp 2016x1260_60.bin /etc/X11/edid.bin
# Update xorg.conf with matching modeline, then restart
sudo systemctl restart gdm
Common Resolutions for MacBook Pro 14"¶
| Resolution | Zoom | Use Case |
|---|---|---|
| 3024x1890 | 1x | Native (below notch) |
| 2016x1260 | 1.5x | Comfortable viewing |
| 1512x945 | 2x | Large UI elements |
DPMS / Screen Blanking¶
- DPMS disabled (both in xorg.conf and at runtime via
xset -dpms) - Screen saver off (
xset s off) - Prevents GPU from downclocking when idle
GDM¶
| Autologin | Enabled (user: zeul) |
| Wayland | Disabled (X11 only for NVIDIA KMS capture) |
| Config | /etc/gdm3/custom.conf |
Troubleshooting¶
X server not starting¶
# Check logs
journalctl -u gdm -f
# Check Xorg log
tail -50 /var/log/Xorg.0.log
# Restore backup if virtual display broke things
sudo cp /etc/X11/xorg.conf.backup /etc/X11/xorg.conf
sudo systemctl restart gdm
NVIDIA kernel module failed to initialize¶
If X fails with "Failed to initialize the NVIDIA kernel module":
# Check if driver is working
nvidia-smi
# If nvidia-smi works but X fails, restart GDM
sudo systemctl restart gdm
# If nvidia-smi fails, check DKMS
dkms status
# Reinstall DKMS module if needed (use installed driver version)
sudo dkms install nvidia-srv/<driver-version>
Rollback xorg.conf¶
Quick Reference¶
# GPU status
nvidia-smi
# Display config
DISPLAY=:0 xrandr
# DPMS status
DISPLAY=:0 xset q | grep -A3 DPMS