Skip to content

xrdp has very low bandwidth on high latency connections that can be mitigated via SSH tunnel #2905

@vincent-163

Description

@vincent-163

xrdp version

0.9.23.1

Detailed xrdp version, build options

xrdp 0.9.23.1
  A Remote Desktop Protocol Server.
  Copyright (C) 2004-2020 Jay Sorg, Neutrino Labs, and all contributors.                                                                                                           See https://github.com/neutrinolabs/xrdp for more information.

  Configure options:
      --prefix=/usr                                                                                                                                                      [0/1157]      --sysconfdir=/etc
      --localstatedir=/var
      --sbindir=/usr/bin
      --with-systemdsystemunitdir=/usr/lib/systemd/system
      --enable-jpeg
      --enable-tjpeg
      --enable-fuse
      --enable-fdkaac
      --enable-opus
      --enable-rfxcodec
      --enable-mp3lame
      --enable-pixman
      --enable-painter
      --enable-vsock
      --enable-ipv6
      --enable-pam-config=arch
      --enable-rdpsndaudin
      --with-imlib2
      CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security         -fstack-clash-protection -fcf-protection
      LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now

  Compiled with OpenSSL 3.2.0 23 Nov 2023

Operating system & version

Arch Linux 20240101.0.204074

Installation method

git clone & make install

Which backend do you use?

xorgxrdp-0.9.19

What desktop environment do you use?

any

Environment xrdp running on

A systemd-nspawn container

What's your client?

Windows 11 mstsc

Area(s) with issue?

Network

Steps to reproduce

  1. On a server with high latency to the client (~250ms) but enough bandwidth (at least 100Mbps), set up an XRDP server. Here is my dockerfile for setting up the xrdp server. The built docker image is then exported to /var/lib/machines/xrdp and booted using systemd-nspawn -M xrdp -b:
FROM archlinux:latest
RUN pacman -Syu --needed --noconfirm --noprogressbar git base base-devel sudo archlinux-keyring
RUN useradd -ms /bin/bash user && groupadd sudo && usermod -aG sudo user && \
    echo '%sudo ALL=(ALL:ALL) NOPASSWD: ALL' > /etc/sudoers.d/50-sudo-nopasswd
RUN printf '[archlinuxcn]\nServer = https://repo.archlinuxcn.org/$arch\n' >> /etc/pacman.conf && \
    pacman-key --init && \
    pacman-key --lsign-key "[email protected]" && \
    pacman -Syu --noconfirm --noprogressbar archlinuxcn-keyring && \
    pacman -Syu --noconfirm --noprogressbar yay
RUN pacman -Syu --noconfirm --noprogressbar plasma-desktop xorg-server
RUN sudo -u user yay -S aur/xrdp aur/xorgxrdp --noconfirm --noprogressbar
RUN sed -i s%param=Xorg%param=/usr/lib/Xorg% /etc/xrdp/sesman.ini
RUN echo 'startplasma-x11' > /home/user/.xinitrc

Use machinectl shell xrdp to get into the container and do systemctl start xrdp to run it. I'm running it in a systemd-nspawn container but the exact way of running xrdp probably doesn't matter.

  1. Use msrtc to connect to the server. Install google chrome in the container and play a video. It's very laggy, and the bandwidth is around 1.3Mbps.

  2. Use SSH to connect to the server and set up a tunnel with -L 33890:127.0.0.1:3389. Then connect to 127.0.0.1:33890. You get the same desktop but the bandwidth goes up to 80Mbps and the video plays smoothly.

✔️ Expected Behavior

Direct msrtc connection should work at least as smoothly as the connection via SSH tunnel, and use up 80Mbps of bandwidth available to xrdp.

❌ Actual Behavior

Direct msrtc connection uses only 1.3Mbps, a tiny fraction of what is possible.

Anything else?

I switched net.ipv4.tcp_congestion_control between cubic and bbr and the behavior doesn't change, suggesting it's not a problem with the congestion algorithm used.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions