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:
- No biderectional clipboard.
- No microphone support.
Future work:
- Will try to stabilize wireless connection.
- Will use wired connection instead of wireless.
Update:
- I replaced Intel AX211 wireless adapter with Qualcomm QCNFA765. That improved overwall bandwidth and stability. There are no iwlwifi cryptic dmesg anymore.
- I disabled Network Manager background scanning, because it periodically sparks latency issues.
- 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