Description:

Eight months ago I bought a powerful workhorse for daily work: Lenovo ThinkStation P360. Except strong Intel i9-12900T it has Nvidia Quadro T1000. These heat sources are placed in tiny case (179x37x182). As a results - single fan works very loud on relatively small tasks. This is why I decided to move away this heat box and try to stream entire desktop session over WiFi 6 with help of Moonlight/Sunshine.

Client:

Laptop with Intel i7-13700H and Intel Wi-Fi 6E AX211. Display is LG Dualup Ergo 28MQ780. Moonlight 5.0.1 with HEVC, 2560x2880, 60 fps.

laptop ~ # grep "qdisc\|congestion" /etc/sysctl.conf 
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr


laptop ~ # vainfo 
Trying display: drm
libva info: VA-API version 1.20.0
libva info: Trying to open /usr/lib64/va/drivers/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_20
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.20 (libva 2.20.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 23.4.3 ()
vainfo: Supported profile and entrypoints
      VAProfileNone                   : VAEntrypointVideoProc
      VAProfileNone                   : VAEntrypointStats
      VAProfileMPEG2Simple            : VAEntrypointVLD
      VAProfileMPEG2Simple            : VAEntrypointEncSlice
      VAProfileMPEG2Main              : VAEntrypointVLD
      VAProfileMPEG2Main              : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointVLD
      VAProfileH264Main               : VAEntrypointEncSlice
      VAProfileH264Main               : VAEntrypointFEI
      VAProfileH264Main               : VAEntrypointEncSliceLP
      VAProfileH264High               : VAEntrypointVLD
      VAProfileH264High               : VAEntrypointEncSlice
      VAProfileH264High               : VAEntrypointFEI
      VAProfileH264High               : VAEntrypointEncSliceLP
      VAProfileVC1Simple              : VAEntrypointVLD
      VAProfileVC1Main                : VAEntrypointVLD
      VAProfileVC1Advanced            : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointVLD
      VAProfileJPEGBaseline           : VAEntrypointEncPicture
      VAProfileH264ConstrainedBaseline: VAEntrypointVLD
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
      VAProfileH264ConstrainedBaseline: VAEntrypointFEI
      VAProfileH264ConstrainedBaseline: VAEntrypointEncSliceLP
      VAProfileVP8Version0_3          : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointVLD
      VAProfileHEVCMain               : VAEntrypointEncSlice
      VAProfileHEVCMain               : VAEntrypointFEI
      VAProfileHEVCMain               : VAEntrypointEncSliceLP
      VAProfileHEVCMain10             : VAEntrypointVLD
      VAProfileHEVCMain10             : VAEntrypointEncSlice
      VAProfileHEVCMain10             : VAEntrypointEncSliceLP
      VAProfileVP9Profile0            : VAEntrypointVLD
      VAProfileVP9Profile0            : VAEntrypointEncSliceLP
      VAProfileVP9Profile1            : VAEntrypointVLD
      VAProfileVP9Profile1            : VAEntrypointEncSliceLP
      VAProfileVP9Profile2            : VAEntrypointVLD
      VAProfileVP9Profile2            : VAEntrypointEncSliceLP
      VAProfileVP9Profile3            : VAEntrypointVLD
      VAProfileVP9Profile3            : VAEntrypointEncSliceLP
      VAProfileHEVCMain12             : VAEntrypointVLD
      VAProfileHEVCMain12             : VAEntrypointEncSlice
      VAProfileHEVCMain422_10         : VAEntrypointVLD
      VAProfileHEVCMain422_10         : VAEntrypointEncSlice
      VAProfileHEVCMain422_12         : VAEntrypointVLD
      VAProfileHEVCMain422_12         : VAEntrypointEncSlice
      VAProfileHEVCMain444            : VAEntrypointVLD
      VAProfileHEVCMain444            : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_10         : VAEntrypointVLD
      VAProfileHEVCMain444_10         : VAEntrypointEncSliceLP
      VAProfileHEVCMain444_12         : VAEntrypointVLD
      VAProfileHEVCSccMain            : VAEntrypointVLD
      VAProfileHEVCSccMain            : VAEntrypointEncSliceLP
      VAProfileHEVCSccMain10          : VAEntrypointVLD
      VAProfileHEVCSccMain10          : VAEntrypointEncSliceLP
      VAProfileHEVCSccMain444         : VAEntrypointVLD
      VAProfileHEVCSccMain444         : VAEntrypointEncSliceLP
      VAProfileAV1Profile0            : VAEntrypointVLD
      VAProfileHEVCSccMain444_10      : VAEntrypointVLD
      VAProfileHEVCSccMain444_10      : VAEntrypointEncSliceLP


Server:

QEMU virtual machine with Nvidia Quadro T1000 in passthrough mode. Sunshine 0.21.0.

devbox ~ # cat /etc/X11/xorg.conf
Section "ServerLayout"
    Identifier "layout"
    Screen 0 "metaScreen" 0 0
EndSection

Section "Monitor"
    Identifier "Monitor0"
    Option "Enable" "true"
EndSection

Section "Device"
    Identifier "Card0"
    Driver "nvidia"
    VendorName "NVIDIA Corporation"
    Option "ConnectedMonitor" "DFP-0" # <- VIRTUAL MONITOR
    Option "ModeValidation" "AllowNonEdidModes,NoVirtualSizeCheck,NoMaxPClkCheck,NoHorizSyncCheck,NoVertRefreshCheck"
    Option "CustomEDID" "DFP-0:/etc/X11/lg_sdqhd.edid" # <- EDID DUMP OF LG DUALUP ERGO 28MQ780
EndSection

Section "Screen"
    Identifier "metaScreen"
    Device "Card0"
    Monitor "Monitor0"
    DefaultDepth 24
EndSection

Transport:

Banana Pi BPI-R3, 5Ghz, 160Mhz, distance to the client is 5 meters (behind the wall).

Results:

I've been using this setup for two weeks as my primary workspace. I work in IDE/kitty, watch YouTube, browse Web, use keyboard shortcuts, desktop effects are enabled etc. 80% of time it's just a normal desktop environment, but wireless is not reliable transport and some glitches/artifacts happen regularly. Wired connection will give complete transparency and full sensation of desktop response.

Fully transparent network latency:

100 packets transmitted, 100 received, 0% packet loss, time 99161ms
rtt min/avg/max/mdev = 1.100/1.536/3.122/0.352 ms

Glitched network latency:

100 packets transmitted, 100 received, 0% packet loss, time 99139ms
rtt min/avg/max/mdev = 1.132/10.916/138.044/14.753 ms

Some additional cons:

  1. No biderectional clipboard.
  2. No microphone support.

Future work:

  1. Will try to stabilize wireless connection.
  2. Will use wired connection instead of wireless.

Update:

  1. I replaced Intel AX211 wireless adapter with Qualcomm QCNFA765. That improved overwall bandwidth and stability. There are no iwlwifi cryptic dmesg anymore.
  2. I disabled Network Manager background scanning, because it periodically sparks latency issues.
  3. I moved my entire desktop from QEMU virtual machine to LXC container because hypervisor doesn't aware of E/P cores of my i9-12900T.

As a result I have a seamless 4k remote desktop experience within 1-5 ms latency over the wireless connection :)

Watch Stream entire 4k desktop over WiFi 6 with Moonlight/Sunshine on Youtube