145 votes

Pourquoi la redirection X11 est-elle si inefficace ?

Chaque fois que je lance à distance de grandes interfaces graphiques avec la redirection X11, même en incluant le commutateur -C, l'expérience est très peu réactive. Ma question est la suivante : quelle est la cause de ce problème au niveau du concept/protocole ?

Avec ma connexion de 25 Mbits, je peux diffuser des vidéos HD sur mon ordinateur sans aucun problème. D'autre part, la non-réponse des interfaces graphiques lancées à distance avec le transfert X11 se produit même sur un réseau local de 100 mbits, où la latence devrait être proche de zéro.

Je comprends que, contrairement au streaming vidéo, la latence sera au mieux doublée (car l'entrée doit être envoyée à la machine distante et ce n'est qu'après que l'application peut répondre), mais en interne, y a-t-il d'autres facteurs qui augmentent encore la latence ?

Deuxièmement, la largeur de bande. Pourquoi en consomme-t-il autant ? Lorsqu'il s'agit de formats d'images et de vidéos, de nombreuses méthodes sont utilisées pour réduire considérablement leur taille.

Dans le cas du format .bmp par rapport au format .png, par exemple, une grande image carrée noire prendra beaucoup moins de place dans la représentation .png, car les informations ne sont pas stockées pour chaque pixel, mais de manière plus ou moins étendue, si j'ai bien compris.

Dans le cas des vidéos, on peut économiser beaucoup d'informations en envoyant la différence entre les images plutôt que les images entières.

Je sais que c'est très simplifié, mais est-ce que X11 n'utilise pas ces méthodes ? Est-ce qu'il se comporte à un certain niveau comme un bitmap ou un principe non différentiel ? Et si non, pourquoi prend-il autant de bande passante ?

160voto

Tonny Points 26909

Le protocole X11 n'a jamais été conçu pour gérer des opérations à forte intensité graphique (en termes de bitmaps/textures). À l'époque où X11 a été conçu, les graphiques informatiques étaient beaucoup plus simples qu'aujourd'hui.

En fait, X11 n'envoie pas l'écran à votre ordinateur, mais il envoie les instructions d'affichage pour que le serveur X de votre ordinateur local puisse recréer l'écran sur votre système local. Et cela doit être fait à chaque changement/rafraîchissement de l'affichage.
Votre ordinateur reçoit donc un flux d'instructions du type "Tracez une ligne de cette couleur à partir des coordonnées x,y jusqu'à (xx,yy), tracez un rectangle de W pixels de large, H pixels de haut avec un coin supérieur gauche à (x,y), etc.
Le client local n'est pas vraiment conscient de ce qui doit être mis à jour et le système distant dispose de très peu d'informations sur ce dont le client a réellement besoin. Le serveur doit donc envoyer un grand nombre d'informations redondantes dont le client n'a pas forcément besoin.
Ceci est très efficace si l'affichage à rendre est constitué d'un nombre limité de formes graphiques simples et que seule une faible fréquence de rafraîchissement (pas d'animations et autres) est nécessaire. C'était le cas à l'époque où X11 a été développé.

Mais les interfaces graphiques modernes comportent beaucoup d'éléments visuels et la plupart d'entre eux doivent être envoyés du système distant vers votre client sous la forme de bitmaps/textures/fontes de caractères qui prennent beaucoup de bande passante. Et toutes les sortes d'images comprennent des effets animés qui nécessitent des mises à jour fréquentes. Et les écrans ne cessent de grossir : deux fois plus large/haut, c'est quatre fois plus de pixels.

Bien sûr, au fil du temps, des améliorations ont été apportées au protocole X11 afin de l'optimiser autant que possible, mais la conception de base sous-jacente est, par essence, tout simplement inadaptée aux exigences du type d'interface graphique que les gens attendent aujourd'hui.

D'autres protocoles (comme RDP et VNC) sont davantage conçus pour laisser le système distant faire tout le travail difficile et laisser ce système décider des mises à jour à envoyer au client (sous forme de bitmaps compressés) aussi efficacement que possible. Cela s'avère souvent plus efficace pour les interfaces graphiques modernes.

Aucune des deux méthodes n'est parfaite et ne permet de faire face à toutes les situations de manière égale. Il n'existe pas de protocole d'affichage unique capable de répondre à tous les cas d'utilisation imaginables.
Dans la plupart des cas, il suffit donc d'essayer tous les protocoles pris en charge entre votre client local et le serveur distant et d'utiliser celui qui donne les meilleurs résultats. Dans certains cas, il n'y a pas de choix et vous devez vous contenter de ce qui est disponible.

La plupart des protocoles permettent d'ajuster les performances, mais nombre de ces paramètres ne sont disponibles que sur le serveur et ne sont pas accessibles à l'utilisateur moyen. (Et les configurer correctement est un peu un art obscur. Beaucoup de sys-admins ne seront pas prêts à s'occuper de cela).

Dans la plupart des cas, le moyen le plus simple d'améliorer les performances (parfois de façon spectaculaire) est de passer à un environnement de bureau plus simple, avec moins d'effets visuels, et de renoncer à l'utilisation d'images d'arrière-plan.

54voto

virtex Points 1229

Il y a principalement deux raisons pour lesquelles les connexions X11 sont lentes, que vous avez abordées dans votre question : la bande passante et la latence. Pour comprendre pourquoi les applications X11 sont lentes sur un réseau, abordons ces deux aspects.

Bande passante

Par défaut, X11 n'effectue aucune compression sur les données réseau transmises entre l'application et le serveur d'affichage. Comme vous l'avez mentionné, vous pouvez utiliser l'option -C sur SSH pour activer la compression, et bien que cela soit utile, ce n'est pas optimisé pour la compression des données graphiques. Comparé à des formats comme H.264 qui peuvent obtenir des taux de compression de 100 pour 1, la compression -C aura la chance d'atteindre une compression de 2 pour 1. Une meilleure solution consiste à utiliser un codec optimisé pour les graphiques ou la vidéo pour la vidéo X11, mais nous devons veiller à ce qu'il n'y ait pas trop de pertes, car les ordinateurs de bureau ont généralement besoin d'images plus nettes qu'un film pour que l'utilisateur puisse toujours lire clairement le texte et distinguer les détails.

Latence

X11 a tendance à avoir une latence élevée car la plupart des opérations nécessitent plusieurs allers-retours entre l'application et le serveur d'affichage. Lorsqu'il est exécuté sur un réseau local où les temps de ping mesurent moins d'une milliseconde, ces multiples allers-retours ne sont pas perceptibles, mais sur une connexion Internet, ils s'additionnent rapidement.

Solutions

Il y a quelques années, deux projets ont été créés pour résoudre les problèmes de bande passante et de latence inhérents au protocole X11. lbx (Low Bandwidth X) et dxpc (Differential X Protocol Compressor). Je ne pense pas que lbx ait eu beaucoup de succès, mais dxpc est devenu la technologie sous-jacente utilisée pour un produit appelé NX . NX utilise à la fois une compression avec perte pour réduire les besoins en bande passante et un algorithme différentiel et une mise en cache pour réduire le nombre d'allers-retours d'informations qui créent la latence élevée. J'ai utilisé NX assez souvent et je trouve que les performances sont presque aussi bonnes que celles des applications locales. Si vous vous sentez prêt, vous pouvez essayer NX et voir si cela vous convient. L'inconvénient est qu'il faut installer un logiciel aux deux extrémités de la connexion, alors que X11 est généralement déjà installé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X