Warum ist X11-Weiterleitung so ineffizient?

24172
user129186

Immer, wenn ich aus der Ferne große GUIs mit X11-Weiterleitung starte, selbst wenn ich den -C-Schalter betreibe, ist die Erfahrung nicht sehr ansprechend. Meine Frage ist, was verursacht dies auf Konzept- / Protokollebene?

Mit meiner 25-MBit-Verbindung kann ich absolut problemlos HD-Videos auf meinen Computer streamen. Auf der anderen Seite tritt die Reaktion von remote gestarteten GUIs mit X11-Weiterleitung sogar über ein 100-MBit-LAN ​​auf, bei dem die Latenz nahe null sein sollte.

Ich verstehe, dass im Gegensatz zum Video-Streaming die Latenz im besten Fall verdoppelt wird (da die Eingabe an den Remote-Computer gesendet werden muss und erst danach die Appliction reagieren kann). Intern gibt es jedoch andere Faktoren, die die Latenz sogar erhöhen des Weiteren?

Zweitens die Bandbreite. Warum frisst es so viel davon auf? Bei Bild- und Videoformaten werden viele Methoden verwendet, um die Größe drastisch zu reduzieren.

Im Fall von .bmp vs .png nimmt ein großes schwarzes Quadrat in der .png-Darstellung viel weniger in Anspruch, da Informationen nicht für jedes einzelne Pixel gespeichert werden, sondern soweit meines Wissens bereichsweise.

Bei Videos kann eine ganze Menge von Informationen gespeichert werden, indem der Unterschied zwischen den Frames und nicht den ganzen Frames gesendet wird.

Ich weiß, dass dies sehr vereinfacht ist, aber verwendet X11 diese Methoden nicht? Verhält es sich auf einer bestimmten Ebene in einem Bitmap-Prinzip oder einem Nicht-Differentialprinzip? Und wenn nicht, warum braucht es so viel Bandbreite?

80
Wissenswertes: [Xpra] (https://xpra.org/) bietet einen interessanten Ansatz. Kamil Maciorowski vor 6 Jahren 6
BTW - Die Verwendung von "-C" verlangsamt Ihre Verbindung, wenn Ihre Verbindung schnell genug ist, da die Komprimierung Zeit braucht. "-C" könnte 100 MB nutzen, schadet aber wahrscheinlich 1 GB und sicherlich 10 GB. Es ist auch der Fall, dass 'ssh' Ihrem Durchsatz schadet - ebenso wie jede Verschlüsselung über schnelle Verbindungen. Wenn Sie eine direkte Verbindung zwischen Computern oder eine sichere interne Verbindung haben, gehen Sie direkt mit Ihrer X-Verbindung über TCP: 6000. Sie erhalten eine spürbare Verbesserung der Geschwindigkeit. Astara vor 6 Jahren 12
Klingt so, als würden Sie über SSH weiterleiten, das alle Daten verschlüsseln / entschlüsseln muss. Das wird zusätzlichen Aufwand / Latenz hinzufügen. Schnellere Prozessoren können helfen, aber es gibt eine gewisse Latenzzeit, die hinzugefügt wird, unabhängig davon, was Sie tun. X ist sehr "gesprächig", also eine geringfügige Erhöhung der Latenz = erheblicher Leistungsabfall. In früheren Zeiten konnte ich X verwenden, das über SSH über ein 28.8-Modem getunnelt wurde. das war lbxproxy (jetzt veraltet), das eine Menge Daten zwischengespeichert / komprimiert und das "Gespräch" der Verbindung verringert hat. Die Verwendung von -C kann nur mehr Latenz hinzufügen. Meower68 vor 6 Jahren 2
Verwenden Sie etwas wie "ssh -Y -c blowfish", um den Overhead während der Verschlüsselung zu minimieren. Wenn Sie beide Seiten voll im Griff haben, lernen Sie ssh, die Verschlüsselung "keine" zu verwenden, um die volle Übertragungsgeschwindigkeit für die Verbindung zu erhalten. Thorbjørn Ravn Andersen vor 6 Jahren 0

2 Antworten auf die Frage

104
Tonny

Das X11-Protokoll war nie für grafische (in Bezug auf Bitmaps / Texturen) intensive Operationen gedacht. Damals, als X11 zum ersten Mal entwickelt wurde, war die Computergrafik viel einfacher als heute.

Grundsätzlich sendet X11 den Bildschirm nicht an Ihren Computer, sendet jedoch die Anzeigeanweisungen, damit der X-Server auf Ihrem lokalen Computer den Bildschirm auf Ihrem lokalen System neu erstellen kann. Dies muss bei jeder Änderung / Aktualisierung der Anzeige erfolgen.
Ihr Computer empfängt also einen Strom von Anweisungen wie "Zeichnen einer Linie in dieser Farbe von den Koordinaten x, y bis (xx, yy), Zeichnen des Rechtecks ​​W Pixel breit, H Pixel hoch mit der oberen linken Ecke bei (x, y) usw." "
Der lokale Client ist sich nicht wirklich bewusst, was aktualisiert werden muss, und das ferne System enthält nur sehr wenige Informationen darüber, was der Client tatsächlich benötigt. Daher muss der Server im Wesentlichen eine Menge redundanter Informationen senden, die der Client möglicherweise benötigt oder nicht.
Dies ist sehr effizient, wenn die darzustellende Anzeige aus einer begrenzten Anzahl einfacher grafischer Formen besteht und nur eine niedrige Aktualisierungsfrequenz (keine Animationen usw.) erforderlich ist. Das war zu der Zeit, als X11 erstmals entwickelt wurde.

Moderne GUIs haben jedoch eine Menge Augenschmaus und viele davon müssen vom Remote-System in Form von Bitmaps / Texturen / Schriftarten an Ihren Client gesendet werden, die viel Bandbreite erfordern. Zu allen Arten von Augenweiden gehören animierte Effekte, die häufig aktualisiert werden müssen. Und die Anzeigen werden auch immer größer, doppelt so breit / hoch ist 4x die Anzahl der Pixel.

Im Laufe der Zeit wurden natürlich Verbesserungen des X11-Protokolls vorgenommen, um dies so weit wie möglich zu optimieren, aber das grundlegende zugrunde liegende Design ist im Wesentlichen einfach nicht gut für die Anforderungen, die heutige GUI-Leute erwarten.

Andere Protokolle (wie RDP und VNC) sind eher dafür ausgelegt, dass das Remote-System alle harte Arbeit erledigt und dieses System entscheiden lässt, welche Updates (als komprimierte Bitmaps) so effizient wie möglich an den Client gesendet werden sollen. Dies stellt sich oft als effizienter für moderne GUI heraus.

Keine Methode ist perfekt und kann mit jeder Situation gleich gut umgehen. Es gibt kein einzelnes Anzeigeprotokoll, das unter jedem denkbaren Anwendungsfall gut funktioniert.
In den meisten Fällen probieren Sie einfach alle Protokolle aus, die zwischen Ihrem lokalen Client und dem Remote-Server unterstützt werden, und verwenden Sie das Protokoll, das die besten Ergebnisse liefert. Und in einigen Fällen gibt es keine Wahl und Sie müssen sich nur mit dem, was verfügbar ist, begnügen.

Die meisten Protokolle erlauben eine gewisse Leistungsoptimierung, aber viele dieser Einstellungen sind nur serverseitig und nicht für den durchschnittlichen Benutzer verfügbar. (Und sie richtig zu konfigurieren, ist ein bisschen eine geheimnisvolle Kunst. Viele Sys-Admins werden sich nicht damit abfinden.)

In den meisten Fällen ist der einfachste Weg, die Leistung zu verbessern (manchmal sehr dramatisch), die Umstellung auf eine einfachere Desktop-Umgebung mit weniger Augenmerk auf den Einsatz von Hintergrundbildern.

+1 Da RDP und VNC erwähnt werden, sollte ich auch [x2go] (http://wiki.x2go.org/doku.php) erwähnen, eine X11-Caching / Forwarding-Lösung, die die X11-Weiterleitung wirklich beschleunigt. Ich habe es mit Erfolg in der Vergangenheit verwendet. rath vor 6 Jahren 12
Bezüglich der "serverseitigen Einstellungen" am Ende sei daran erinnert, dass der X * -Server * auf dem Computer läuft, der mit der physischen Anzeige verbunden ist, und der X * -Client * ist die Software, die zum Ausführen einer Aufgabe (z. B. eines Webs) verwendet wird Browser oder Textverarbeitungsprogramm). Auf die X-Servereinstellungen kann also der Benutzer zugreifen, der eine Verbindung zum Remote-System herstellt, um eine grafische Anwendung auszuführen. Dies beeinträchtigt jedoch nicht den Wert Ihrer Antwort. a CVn vor 6 Jahren 4
Technisch ist das Protokoll RFB, nicht VNC. OrangeDog vor 6 Jahren 2
Bin ich falsch oder verwechseln Sie Client und Server in Ihrem zweiten Absatz? Der Client ist das Remote-Programm, der Server ist der lokale Computer. Jonas Schäfer vor 6 Jahren 5
Nach meinen Tests ist RDP nicht schneller als X11. VNC befindet sich in vielen Fällen, da die Fähigkeit zum Frame-Dropping verhindert, dass Anwendungen durch bandbreitenbegrenzende Frameraten verlangsamt werden. Joshua vor 6 Jahren 1
NoMachine ist auch eine Erwähnung wert, ich fand es schneller und besser integriert als VNC. Boris the Spider vor 6 Jahren 1
Was Sie im dritten Absatz behandelt haben, wurde in den 90er Jahren weitgehend gemildert, da auf Computern mit X-Servern nun genügend Speicherplatz vorhanden war, sodass das Sichern des Backing-Stores praktisch werden konnte. Blrfl vor 6 Jahren 1
In der Welt von X11 sind die Bedingungen umgekehrt. Der Gedanke war, dass die Maschine mit Tastatur / Maus / Monitor (dh das X-Terminal) "Präsentations" -Dienste für die Maschine bereitstellt, auf der das Hauptprogramm ausgeführt wird. In diesem Fall ist der Remote-Host-Server der "X-Client". DocSalvager vor 6 Jahren 0
36
virtex

Es gibt hauptsächlich zwei Gründe, warum X11-Verbindungen langsam sind, und beide haben Sie in Ihrer Frage angesprochen: Bandbreite und Latenz. Um zu verstehen, warum X11-Apps über ein Netzwerk langsam sind, sollten wir beide besprechen.

Bandbreite

X11 führt standardmäßig keine Komprimierung der Netzwerkdaten durch, die zwischen der Anwendung und dem Anzeigeserver übertragen werden. Wie Sie bereits erwähnt haben, können Sie die Option -C für SSH verwenden, um die Komprimierung zu aktivieren. Dies hilft zwar, ist jedoch nicht für die Komprimierung grafischer Daten optimiert. Verglichen mit Formaten wie H.264, die Komprimierungsraten von 100 zu 1 erreichen können, ist die -C-Komprimierung glücklich, eine Kompression von 2 zu 1 zu erzielen. Eine bessere Lösung ist die Verwendung eines Grafik- oder Video-optimierten Codecs für das X11-Video. Wir müssen jedoch darauf achten, dass es nicht zu verlustbehaftet ist, da Desktops in der Regel schärfere Bilder benötigen als ein Film, sodass der Benutzer den Text und das Textfeld noch gut lesen kann feine Details ausmachen.

Latenz

X11 neigt zu einer hohen Latenz, da die meisten Vorgänge mehrere Roundtrips zwischen der Anwendung und dem Anzeigeserver erfordern. Wenn Sie über ein LAN laufen, in dem die Ping-Zeiten weniger als eine Millisekunde betragen, sind diese Rundreisen nicht wahrnehmbar, aber über eine Internetverbindung summieren sie sich schnell.

Lösungen

Vor einigen Jahren wurden mehrere Projekte aufgebaut, um die mit dem X11-Protokoll verbundenen Bandbreiten- und Latenzprobleme zu lösen. lbx (Low Bandwidth X) und dxpc (Differential X Protocol Compressor). Ich glaube nicht, dass LBX jemals eine gute Traktion hatte, aber DXPC wurde die zugrunde liegende Technologie für ein Produkt namens NX . NX verwendet sowohl verlustbehaftete Komprimierung zur Verringerung der Bandbreitenanforderungen als auch einen Differenzialalgorithmus und Zwischenspeicherung, um die Anzahl der Hin- und Herbewegungen zu reduzieren, die die hohe Latenz erzeugen. Ich habe NX ziemlich oft verwendet und finde die Leistung fast so gut wie lokale Anwendungen. Wenn Sie sich danach fühlen, können Sie NX ausprobieren und sehen, ob es für Sie funktioniert. Der Nachteil ist, dass an beiden Enden der Verbindung Software installiert werden muss, während X11 im Allgemeinen bereits installiert ist.

An das Latenzthema gebunden wäre, dass X11 bei den meisten Streaming-Videos TCP und UDP ist. Es gibt einige andere Produkte, die bei der Remote-Arbeit helfen. Tony erwähnte RDP und VNC. Oracle verkauft immer noch Sun Global Desktop (SGD), was gut funktioniert. Citrix hatte etwas (XenApp?). Unser Eval fand, dass SGD eine bessere Option für unsere Bedürfnisse war, hatte aber zuvor zwei Citrix-Produkte verwendet. sleepyweasel vor 6 Jahren 3
x2go hat für mich sehr gut funktioniert, auch mit "Server" eines alten Laptops. in wenigen minuten betriebsbereit ... große leistungssteigerung von X11 fwd (mit meiner config unbrauchbar) comte vor 6 Jahren 0