My personal ThinLinc use case and some performance comparison

Hi there!
My name is Andre, I’m undergraduate in Mathematics/Teaching, working as a Computer Technician at Universidade de São Paulo - Brazil and I’m here to share my Thinlinc personal use case.
Since the start of COVID-19 pandemic in 2020, I have started working from home most of the time. My wife is also working and studying from home and our nephew, who lives here with us, is also taking classes and doing all his homework using our computers. We had only 2 notebooks that we had to share, one of them is an Intel i5-4200 8GB RAM (still pretty capable to attend our demand) and the other one is an old Intel Centrino Duo 4GB (does work, but it is very limited for a more intense usage).

I had a few experiences in remote access softwares before: VNC, RDP, SSH -X and we were using X2Go at work to solve some problems with users that needed graphical output from our servers. So, I’ve planned to test if it would be possible to share my i5-4200 at home and use a Raspberry Pi or the Centrino notebook as “thin clients” in a way that no one would have a slow computer or an irritating poor performance.

Not working solutions (for me!)

RDP was out because it’s for Windows hosts and it allows just one interactive user at a time. In fact, it’s a Windows version limitation, since it is possible to share a Windows computer if it is running Windows Server edition… Windows Server costs a lot and you also have to pay extra licenses according to the number of users. I wanted something for Linux and free of charge.

VNC could work, but it took me some time to configure it in my previous experiences… I know that it’s possible to configure it on Linux to use it as an independent desktop session instead of just sharing the screen, but it needs some configuration (and maybe some hardening if you bother about security). So I’ve skipped it this time because I didn’t want to configure it. I still use some VNC at work, but not in the way I wanted at home.

SSH -X is too slow! It works simply by using “ssh -X user@host” but it is more about simplicity than usability. Even using compression (-XC), it takes a lot for the host to answer clicks and typing and drawing the screen at the client-side. Maybe there is some optimization that I didn’t find, but I also never tried to search deeply since I had some other working cases that could work for me.

Possible solution found?

X2Go has been in use at work as a way to provide GUI (Graphical User Interface) for programs like R and Matlab and I decided to give it a try at home. It is very simple to configure on host: You just need to install x2goserver and its dependencies and have a working openssh-server. It worked fine at my job, but then I found some problem for my personal use: It was possible to watch videos, but full of screen tearing due to latency. I was using a Raspberry Pi 3 over 2.4GHz Wi-Fi to reach my host notebook also over 2.4GHz Wi-Fi and latency was a problem. Even after lowering the image quality, It was possible to watch videos, but there was a lot of skipping frames and tearing due to high latency. That’s when I started searching for other solutions and found Thinlinc.

I found a demo video at Youtube Virtualização de terminal e aplicações GNULinux - YouTube (in portuguese) where the presenter is remotely connecting to his PC through Thinlinc using a Raspberry Pi and it was pretty close from what I needed at home regarding video playback (jump to 20:36). So, I’ve installed Thinlinc Server on my notebook and used my Raspberry Pi to access it. Even with both connected via Wi-Fi, it was a lot better to use than through X2Go. My nephew was able to use the Raspberry Pi and use OBS-Studio to create a video accessing the notebook via Thinlinc and that was my ultimate test by that time. Using Thinlinc was satisfactory in home use temporarily.

Then I got married last November, we moved to a bigger apartment and our nephew still lives with us. Because of the Wi-Fi latency and because now is not just for a temporary fix, I decided to run ethernet cables on the wall, from the router to the bedrooms and my small home office. And a new problem appeared: My main Desktop PC was still at my parents home and I would need to get it sooner or later. Since my father just uses the PC for browsing the internet and watching streaming occasionally, I planned to swap my Desktop PC with a Raspberry Pi, but first I needed to make sure that he would be able to access all his favorite websites in a satisfactory way. And then I started testing if I could remotely use my Desktop at my workplace as an alternative if my Raspberry Pi couldn’t meet what I was expecting in terms of performance.

I had a little trouble setting up my Thinlinc server at my workstation because of the distro I was using and because I had problems with the NAT. Got a hint at an openSUSE’s Telegram group and managed to install the Thinlinc server, but still had problems working around the NAT and decided to write to Cendio’s support. Martin gently pointed me out to my mistake and how to properly work with the “HOST_ALIASES” parameter. Now I can not just share my PC or notebook at home with my family, but also access my workstation at my workplace and work remotely.

A graphical demonstration

Here’s a video I made that shows the difference between both Thinlinc and X2Go using different hardware and places. Thinlinc demonstration vs X2Go and SSH -X - YouTube

The video linked above has 6 tests mixing X2Go, Thinlinc and SSH -X, accessing my notebook running on the same LAN and accessing my computer running remotely at my workplace. It is divided into chapters so you can jump to the tests directly if you want to.

Some notes: latency is under 0.3ms to my notebook (LAN machine) and under 20ms to my workplace;

My wife and nephew were using my notebook simultaneously all the time to watch streaming videos in FullHD. So it’s a kind of real use case scenario that I wanted: A machine that could be shared by two or more users at same time.

The X2Go server running on the remote machine has a bug that prevents me from accessing a full LXDE session… So I had to open a lxterminal and run the browser from there. The bug seems to be related to Tumbleweed, because the X2Go server replies with something like “unsupported OS”.

Machine specs used in the test above:
Notebook at home: Intel i5-4200 8GB running openSUSE Leap 15.2. It is running X2Go server 4.1.0.4-lp152.15.3, Thinlinc server 4.12.0 and OpenSSH 8.1p1;
Desktop at home: AMD Phenom 1090T 12GB running openSUSE Tumbleweed. It is running X2Go client 4.1.0.4-15.11, Thinlinc client 4.12.1, OpenSSH 8.4p1-4.3 and recording screen using OBS-Studio 26.1.1-2.4;
Desktop at workplace: AMD Phenom 1055T 8GB running openSUSE Tumbleweed. It is running X2Go server 4.1.0.4-15.11, Thinlinc server 4.12.1 and OpenSSH 8.4p1-4.3.
Network connection at home: Gigabit ethernet LAN and 250Mb/15Mb WAN
Network connection at workplace: Gigabit ethernet LAN (between tunnel machine and desktop) and 10Gbps fiber WAN.

Tests conclusion

Thinlinc has performed well since I got it all working, either I’m at home sharing my Desktop or Notebook with my wife/nephew or either I’m working from my parents house and using my father’s Raspberry Pi. I managed to compare Thinlinc vs X2Go and I just figured out that in a broadband low latency connection, X2Go may be as good as Thinlinc for simple use. At home working on Gigabit ethernet, X2Go and Thinlinc perform similarly when watching streaming for example. But you just need a little more latency and a narrow band to see that Thinlinc performs better in these situations. For example: connecting to my notebook using a Raspberry Pi (which is Fast Ethernet and not Gigabit Ethernet) shows a better performance when using Thinlinc over X2Go. Connecting to my workstation at my workplace (more latency and narrower bandwidth) is very clear that Thinlinc overperforms X2Go. Despite the client machine being a Phenom II 1090T, I could get similar results if the client machine was as weak as a simple Raspberry Pi 2. The problem is that it wouldn’t be easy for me to record the Raspberry Pi’s screen output.

Is it over? Any new test?

I don’t plan to stop my tests because there’s still something missing The ability to play games remotely. I’ve just noticed after reading an article suggested by Jean (from Cendio) that I need to configure my host to be able to use video hardware acceleration. With the simple setup, I can use most of the computer, but games are unplayable. I know that Steam and other gaming software like Parsec have a feature that allows you to remotely play games and with some configuration it’s possible to play them running from a headless machine (a machine without a monitor). I want to know if it’s possible to use Thinlinc to play games and have a full desktop experience with hardware video acceleration (and apparently it is, by configuring Virtual GL and using “vglrun”)

Suggestions

So, as you can see, the Thinlinc client has better performance over X2Go using default settings, especially when using more limited connections in terms of latency and bandwidth. As a suggestion to Thinlinc devs, there are some missing features that should add a lot to the client’s usability: For example: If I have more than one server that I can connect to, I miss the ability to choose a different profile and instantly connect to another host with other settings. Let’s say that I can choose between more than one different Thinlinc server to connect to. For now I have to manually input the host name each time I want to connect Thinlinc’s client to another server (and also manually change the client’s configuration if I use a different port or connection quality).

Another good feature that could be added to the Thinlinc’s client and could help users running Thinlinc servers under NAT connections would be the ability to configure a proxy connection through SSH and translate the server’s NAT address to connect through this SSH tunnel. In my use case, my workstation is behind a NAT and there’s a SSH server that I can use to tunnel my connection. To connect to my server under this situation, Thinlinc’s documentation suggests using split DNS configuration, port-forwarding, relays or setting “HOST_ALIASES” parameter under ~/.thinlinc/tlclient.conf file so it can translate your NAT address to your tunnel. To use the “HOST_ALIASES” parameter is pretty simple because you don’t need specific network knowledge neither super-user credentials to configure DNS servers or Firewalls under your network: You simply set the desired serveraddress:serverport to localhost:localport under your tlclient.conf file and and set a ssh tunnel using something like "ssh -L localport:serveraddress:serverport myuser@myproxyserver. For a practical example, my HOST_ALIASES parameter under ~/.thinlinc/tlclient.conf file is:

“HOST_ALIASES=192.168.0.2:22=localhost:2222”
And before running Thinlinc client, I open a terminal and start a tunnel like this:

“ssh -L 2222:192.168.0.2:22 username@myexampleserver”
After the above configuration and starting the tunnel, I can just start Thinlinc’s client and connect to host 192.168.0.2. It is easy to configure manually, but would be a great feature if these settings could be configured somewhere inside Thinlinc’s client GUI instead of manual editing the file and tunneling my connection.

Thanks

I’d like to thank openSUSE’s brazilian Telegram group for helping me to install Thinlinc under openSUSE Tumbleweed distro, Martin Östlund and Jean Zagonel from Cendio who helped me configuring HOST_ALIASES parameter correctly.

4 Likes