Dlaczego przekazywanie X11 jest tak nieefektywne?

97

Ilekroć uruchamiam zdalnie duże GUI z przekazywaniem X11, nawet włączając przełącznik -C, wrażenia nie reagują. Moje pytanie brzmi: co to powoduje na poziomie koncepcji / protokołu?

Dzięki mojemu 25mbitowemu połączeniu mogę bez problemu przesyłać strumieniowo wideo HD do mojego komputera. Z drugiej strony brak reakcji na zdalnie uruchamiane GUI z przekazywaniem X11 zdarza się nawet w 100-bitowej sieci LAN, gdzie opóźnienie powinno być bliskie zeru.

Rozumiem, że w przeciwieństwie do przesyłania strumieniowego wideo opóźnienie będzie w najlepszym razie podwojone (ponieważ dane wejściowe muszą zostać przesłane do zdalnego komputera, a dopiero potem aplikacja może odpowiedzieć), ale wewnętrznie istnieją inne czynniki, które zwiększają opóźnienie nawet dalej?

Po drugie, przepustowość. Dlaczego tak dużo tego zjada? Jeśli chodzi o formaty zdjęć i filmów, stosuje się wiele metod drastycznego zmniejszenia rozmiaru.

Na przykład w przypadku .bmp vs .png duży czarny kwadrat będzie reprezentował znacznie mniej reprezentacji .png, ponieważ informacje nie są przechowywane dla każdego pojedynczego piksela, ale w zakresie, w jakim rozumiem.

W przypadku filmów można zapisać wiele informacji, wysyłając różnicę między klatkami, a nie całymi klatkami.

Wiem, że jest to bardzo uproszczone, ale czy X11 nie używa tych metod? Czy na pewnym poziomie zachowuje się w oparciu o mapę bitową lub zasadę nieróżnicową? A jeśli nie, dlaczego zajmuje tak dużo przepustowości?

użytkownik129186
źródło
9
Ciekawostki: Xpra oferuje ciekawe podejście.
Kamil Maciorowski
12
BTW - użycie „-C” spowolni twoje połączenie, jeśli twoje łącze jest wystarczająco szybkie, ponieważ kompresja wymaga czasu. „-C” może przynieść korzyści 100 Mb, ale prawdopodobnie zaszkodzi 1 Gb, a na pewno 10 Gb. Jest tak również w przypadku, gdy „ssh” zaszkodzi twojej przepustowości - podobnie jak każde szyfrowanie szybkich łączy. Jeśli masz bezpośrednie połączenie między komputerami lub bezpieczne połączenie wewnętrzne, przejdź bezpośrednio z połączeniem X przez TCP: 6000. Dostrzeżesz zauważalną poprawę prędkości.
Astara,
2
Wygląda na to, że przekazujesz dalej przez SSH, który musi szyfrować / deszyfrować wszystkie dane. To doda narzut / opóźnienie. Szybsze procesory mogą pomóc, ale spowoduje to pewne opóźnienie, niezależnie od tego, co zrobisz. X jest bardzo „gadatliwy”, więc niewielki wzrost opóźnienia = znaczny spadek wydajności. W przeszłości byłem w stanie używać X, tunelowanego przez SSH przez modem 28,8; korzystało z lbxproxy (obecnie przestarzałe), które buforowało / kompresowało wiele danych i zmniejszało „kruchość” połączenia. Użycie -C może jedynie zwiększyć opóźnienie.
Meower68
Użyj czegoś takiego, ssh -Y -c blowfishaby zminimalizować narzut przy jednoczesnym szyfrowaniu. Jeśli masz pełną kontrolę nad obydwoma końcami, naucz ssh, aby używało szyfrowania „none”, aby uzyskać pełną prędkość transferu w połączeniu.
Thorbjørn Ravn Andersen

Odpowiedzi:

116

Protokół X11 nigdy nie miał obsługiwać operacji graficznych (pod względem bitmap / tekstur). W czasach, gdy X11 zostało zaprojektowane, grafika komputerowa była o wiele prostsza niż obecnie.

Zasadniczo X11 nie wysyła ekranu do twojego komputera, ale wysyła instrukcje wyświetlania, dzięki czemu serwer X na twoim komputerze lokalnym może odtworzyć ekran w twoim systemie lokalnym. I należy to zrobić przy każdej zmianie / odświeżeniu wyświetlacza.
Tak więc komputer otrzymuje strumień instrukcji takich jak: „narysuj linię w tym kolorze ze współrzędnych x, y do (xx, yy), narysuj prostokąt W szerokości szerokości, wysokość H pikseli z lewym górnym rogiem w (x, y) itp. „
Lokalny klient tak naprawdę nie wie, co należy zaktualizować, a system zdalny ma bardzo mało informacji na temat tego, czego tak naprawdę potrzebuje klient, więc w zasadzie serwer musi wysłać wiele zbędnych informacji, których klient może potrzebować lub nie.
Jest to bardzo wydajne, jeśli renderowany ekran składa się z ograniczonej liczby prostych kształtów graficznych i potrzebna jest tylko niska częstotliwość odświeżania (bez animacji itp.). Tak było w czasach, gdy X11 został opracowany po raz pierwszy.

Ale współczesne GUI mają wiele uroku i wiele z nich należy przesłać ze zdalnego systemu do klienta w postaci bitmap / tekstur / czcionek, które wymagają dość dużej przepustowości. I wszystkie rodzaje cukierków obejmują animowane efekty wymagające częstych aktualizacji. Wyświetlacze też stają się coraz większe, dwa razy szerszy / wysoki to 4x liczba pikseli.

Oczywiście z biegiem czasu wprowadzono ulepszenia do protokołu X11, aby zoptymalizować to w jak największym stopniu, ale podstawowy projekt podstawowy w zasadzie po prostu nie jest dobrze dostosowany do wymagań ludzi, których obecnie oczekują użytkownicy GUI.

Inne protokoły (takie jak RDP i VNC) są bardziej zaprojektowane, aby pozwolić zdalnemu systemowi wykonać całą ciężką pracę i pozwolić temu systemowi zdecydować, które aktualizacje wysłać do klienta (tak skompresowane mapy bitowe), jak najskuteczniej. Często okazuje się to bardziej wydajne w przypadku nowoczesnych GUI.

Żadna z metod nie jest idealna i nie poradzi sobie równie dobrze z każdą sytuacją. Nie ma czegoś takiego jak pojedynczy protokół wyświetlania, który mógłby poradzić sobie w każdym możliwym przypadku użycia.
W większości przypadków wystarczy wypróbować wszystkie protokoły obsługiwane między lokalnym klientem a serwerem zdalnym i użyć tego, który daje najlepsze wyniki. A w niektórych przypadkach nie ma wyboru i musisz tylko zadowolić się tym, co jest dostępne.

Większość protokołów pozwala na dostrajanie wydajności, ale wiele z tych ustawień dotyczy tylko serwera i nie jest dostępnych dla przeciętnego użytkownika. (A ich prawidłowe skonfigurowanie to trochę tajemnicza sztuka. Wielu administratorów sys-adminów nie będzie chciało z tym zadzierać.)

W większości przypadków najprostszym sposobem na poprawienie wydajności (czasami dość radykalnie) jest przejście na prostsze środowisko komputerowe z mniejszym zainteresowaniem i rezygnację z używania obrazów tła.

Tonny
źródło
15
+1 Ponieważ wspomniano o RDP i VNC, powinienem również wspomnieć o x2go, które jest rozwiązaniem buforowania / przesyłania X11, które naprawdę przyspiesza przekazywanie X11. Używałem go z powodzeniem w przeszłości.
rath
7
Jeśli chodzi o „ustawienia tylko po stronie serwera” pod koniec, pamiętaj, że serwer X działa na komputerze podłączonym do fizycznego wyświetlacza, a klient X to oprogramowanie służące do wykonywania niektórych zadań (na przykład przeglądarka internetowa lub edytor tekstu ). Tak więc ustawienia serwera X byłyby dostępne dla użytkownika łączącego się ze zdalnym systemem w celu uruchomienia aplikacji graficznej. Nie wpływa to jednak znacząco na wartość Twojej odpowiedzi.
CVn
2
Technicznie protokołem jest RFB, a nie VNC.
OrangeDog,
6
Czy się mylę, czy mylisz klienta i serwer w swoim drugim akapicie? Klient to program działający zdalnie, serwer to komputer lokalny.
Jonas Schäfer
2
To, co omówiłeś w trzecim akapicie, zostało w dużej mierze złagodzone w latach 90., gdy maszyny z serwerami X zaczęły mieć wystarczającą ilość pamięci, więc umożliwienie przechowywania kopii zapasowych stało się praktyczną rzeczą.
Blrfl,
45

Istnieją przede wszystkim dwa powody, dla których połączenia X11 są powolne, a oba z nich poruszono w pytaniu: przepustowość i opóźnienie. Aby zrozumieć, dlaczego aplikacje X11 działają wolno w sieci, omówmy oba z nich.

Pasmo

X11 domyślnie nie kompresuje danych sieciowych przekazywanych między aplikacją a serwerem wyświetlania. Jak już wspomniałeś, możesz użyć opcji -C w SSH, aby włączyć kompresję, a chociaż to pomaga, nie jest zoptymalizowane do kompresji danych graficznych. W porównaniu do formatów takich jak H.264, które mogą uzyskiwać współczynniki kompresji od 100 do 1, kompresja -C będzie mieć szczęście, jeśli uda się osiągnąć kompresję 2 do 1. Lepszym rozwiązaniem jest użycie kodeka zoptymalizowanego pod kątem grafiki lub wideo dla wideo X11, ale musimy uważać, aby nie spowodować zbyt dużej straty, ponieważ komputery stacjonarne zwykle muszą mieć ostrzejsze obrazy niż film, aby użytkownik mógł nadal wyraźnie czytać tekst i dostrzegaj drobne szczegóły.

Czas oczekiwania

X11 ma zwykle duże opóźnienia, ponieważ większość operacji wymaga wielu podróży w obie strony między aplikacją a serwerem wyświetlania. Po uruchomieniu w sieci LAN, gdzie czasy pingów mierzą mniej niż milisekundę, te wielokrotne podróże w obie strony nie są zauważalne, ale przez połączenie internetowe szybko się sumują.

Rozwiązania

Wiele lat temu powstało kilka projektów mających rozwiązać problemy z przepustowością i opóźnieniami związane z protokołem X11. lbx (Low Bandwidth X) i dxpc (Differential X Protocol Compressor). Nie sądzę, aby lbx kiedykolwiek miał dużą przyczepność, ale dxpc stało się technologią bazową stosowaną w produkcie o nazwie NX . NX stosuje zarówno kompresję stratną, aby zmniejszyć wymagania dotyczące przepustowości, jak i algorytm różnicowy oraz buforowanie w celu zmniejszenia liczby przekazywanych informacji w przód iw tył, co powoduje duże opóźnienia. Używam NX dość często i uważam, że wydajność jest prawie tak dobra jak aplikacje lokalne. Jeśli masz na to ochotę, możesz wypróbować NX i sprawdzić, czy to działa. Minusem jest to, że wymaga zainstalowania oprogramowania na obu końcach połączenia, podczas gdy X11 jest zwykle już zainstalowany.

virtex
źródło
3
Związane z tematem opóźnienia byłoby to, że X11 będzie TCP, a UDP dla większości strumieniowych filmów. Istnieje kilka innych produktów, które mogą pomóc w pracy zdalnej. Tony wspomniał o RDP i VNC. Oracle nadal sprzedaje Sun Global Desktop (SGD), który działa dobrze. Citrix miał coś (XenApp?). Nasz ewaluator stwierdził, że SGD jest lepszą opcją dla naszych potrzeb, ale wcześniej używał dwóch produktów Citrix.
sleepyweasel
x2go działało dla mnie bardzo dobrze, nawet z „serwerem” starego laptopa. uruchomienie i uruchomienie za kilka minut ... duży wzrost wydajności od X11 fwd (nieużywany z moją konfiguracją)
comte
Opóźnienia, na maszynach * ix, sesje X11 na lokalnych wyświetlaczach zwykle używają gniazd domeny Unix zamiast TCP; Gniazda domen unixowych są wielokrotnie szybsze niż TCP podczas podróży w obie strony, nawet na localhost stackoverflow.com/questions/14973942/… . W przypadku aplikacji X11 z naprawdę patologicznie dużą liczbą podróży w obie strony może to być różnica między dobrą a zauważalnie niską wydajnością.
rakslice