Perché l'inoltro X11 è così inefficiente?


97

Ogni volta che lancio in remoto grandi GUI con l'inoltro X11, incluso lo switch -C, l'esperienza non risponde. La mia domanda è: cosa causa questo a livello di concetto / protocollo?

Con la mia connessione a 25 mbit, posso trasmettere in streaming video HD sul mio computer senza problemi. D'altra parte, la mancanza di risposta delle GUI lanciate in remoto con l'inoltro X11 si verifica anche su una LAN da 100 mbit, dove la latenza dovrebbe essere vicina allo zero.

Comprendo che, a differenza dello streaming video, la latenza sarà raddoppiata al meglio (poiché l'input deve essere inviato al computer remoto e solo successivamente l'applicazione può rispondere), ma internamente ci sono altri fattori che aumentano la latenza anche ulteriore?

In secondo luogo, la larghezza di banda. Perché ne mangia così tanto? Quando si tratta di formati di immagini e video, vengono utilizzati molti metodi per ridurre drasticamente le dimensioni.

Nel caso di .bmp vs .png, ad esempio, un'immagine quadrata nera di grandi dimensioni impiegherà molto meno nella rappresentazione .png perché le informazioni non sono memorizzate per ogni singolo pixel, ma per quanto io possa capire.

Nel caso dei video, è possibile salvare molte informazioni inviando la differenza tra i frame anziché i frame interi.

So che questo è molto semplificato, ma X11 non sta usando questi metodi? Si comporta in un bitmap-ish o in un principio non differenziale ad un certo livello? E se no, perché occupa così tanta larghezza di banda?


9
Curiosità: Xpra offre un approccio interessante.
Kamil Maciorowski l'

12
A proposito: l'uso di "-C" rallenterà la connessione se il collegamento è abbastanza veloce perché la compressione richiede tempo. "-C" potrebbe trarre vantaggio da 100 Mb, ma probabilmente danneggiare 1Gb e certamente danneggiare 10Gb. È anche il caso che "ssh" danneggi il throughput, così come qualsiasi crittografia su collegamenti veloci. Se hai una connessione diretta tra computer o un collegamento interno sicuro, vai direttamente con la tua connessione X su TCP: 6000. Otterrai un notevole miglioramento della velocità.
Astara,

2
Sembra che tu stia inoltrando tramite SSH, che deve crittografare / decrittografare tutti i dati. Aggiungerà sovraccarico / latenza. Processori più veloci potrebbero aiutare, ma c'è una certa latenza che questo aggiungerà, qualunque cosa tu faccia. X è molto "loquace", quindi un leggero aumento della latenza = calo significativo delle prestazioni. In passato, sono stato in grado di utilizzare X, tunneling attraverso SSH su un modem 28,8; che utilizzava lbxproxy (ora obsoleto) che memorizzava nella cache / comprimeva molti dati e riduceva la "confusione" della connessione. L'uso di -C può solo aggiungere più latenza.
Meower68,

Usa qualcosa di simile ssh -Y -c blowfishper ridurre al minimo l'overhead mentre stai ancora crittografando. Se si ha il pieno controllo di entrambe le estremità, insegnare a ssh di utilizzare la crittografia "nessuna" per ottenere la massima velocità di trasferimento sulla connessione.
Thorbjørn Ravn Andersen,

Risposte:


116

Il protocollo X11 non ha mai avuto lo scopo di gestire graficamente (in termini di bitmap / trame) operazioni intensive. Ai tempi in cui X11 fu progettato per la prima volta, la grafica per computer era molto più semplice di oggi.

Fondamentalmente X11 non invia lo schermo al tuo computer, ma invia le istruzioni di visualizzazione in modo che l'X-server sul tuo computer locale possa ricreare lo schermo sul tuo sistema locale. E questo deve essere fatto ad ogni cambio / aggiornamento del display.
Quindi il tuo computer riceve un flusso di istruzioni come "disegna una linea di questo colore dalle coordinate x, y a (xx, yy), disegna un rettangolo largo W pixel, alto H pixel con l'angolo superiore sinistro a (x, y), ecc. "
Il client locale non è realmente consapevole di ciò che deve essere aggiornato e il sistema remoto ha pochissime informazioni su ciò di cui il client ha effettivamente bisogno, quindi in pratica il server deve inviare molte informazioni ridondanti di cui il client potrebbe o meno aver bisogno.
Ciò è molto efficace se il display da rendere è costituito da un numero limitato di semplici forme grafiche e è necessaria solo una bassa frequenza di aggiornamento (nessuna animazione e simili). Qual era il caso ai tempi in cui X11 fu sviluppato per la prima volta.

Ma le moderne GUI hanno un sacco di piacere e molte di queste devono essere inviate dal sistema remoto al tuo client sotto forma di bitmap / trame / caratteri che richiedono molta larghezza di banda. E ogni sorta di eye-candy include effetti animati che richiedono aggiornamenti frequenti. E anche i display diventano sempre più grandi, il doppio della larghezza / altezza è il doppio del numero di pixel.

Naturalmente, nel tempo, sono stati apportati miglioramenti al protocollo X11 per ottimizzarlo il più possibile, ma il progetto di base di base non è, in sostanza, semplicemente adatto alle esigenze del tipo di persone che la GUI si aspetta oggi.

Altri protocolli (come RDP e VNC) sono più progettati per consentire al sistema remoto di fare tutto il duro lavoro e lasciare che quel sistema decida quali aggiornamenti inviare al client (come bitmap compresse) nel modo più efficiente possibile. Spesso questo risulta essere più efficiente per le moderne GUI.

Nessuno dei due metodi è perfetto e può affrontare ogni situazione ugualmente bene. Non esiste un unico protocollo di visualizzazione in grado di funzionare bene in ogni caso d'uso immaginabile.
Quindi, nella maggior parte dei casi, basta provare tutti i protocolli supportati tra il client locale e il server remoto e utilizzare quello che fornisce i risultati migliori. E in alcuni casi non c'è scelta e devi solo accontentarti di tutto ciò che è disponibile.

La maggior parte dei protocolli consente l'ottimizzazione delle prestazioni, ma molte di queste impostazioni sono solo lato server e non disponibili per l'utente medio. (E configurarli correttamente è un po 'un'arte arcana. Molti amministratori di sistema non saranno disposti a rovinarlo.)

Nella maggior parte dei casi, il modo più semplice per migliorare le prestazioni (a volte in modo piuttosto drammatico) è passare a un ambiente desktop più semplice con meno attenzione e rinunciare all'uso delle immagini di sfondo.


15
+1 Dato che sono menzionati RDP e VNC, dovrei menzionare anche x2go che è una soluzione di caching / forwarding X11 che accelera davvero l'X11 forwarding. L'ho usato con successo in passato.
rath

7
Per quanto riguarda le "impostazioni solo lato server" verso la fine, ricorda che il server X è in esecuzione sul computer collegato allo schermo fisico e il client X è il software utilizzato per eseguire alcune attività (ad esempio un browser Web o un elaboratore di testi ). Quindi le impostazioni del server X sarebbero accessibili all'utente che si collega al sistema remoto per eseguire un'applicazione grafica. Ciò, tuttavia, non toglie in modo significativo il valore della tua risposta.
un CVn

2
Tecnicamente il protocollo è RFB, non VNC.
OrangeDog,

6
Sbaglio o confondi client e server nel tuo secondo paragrafo? Il client è il programma in esecuzione in remoto, il server è il computer locale.
Jonas Schäfer,

2
Ciò che è stato trattato nel terzo paragrafo è stato ampiamente mitigato negli anni '90 quando le macchine che eseguivano server X hanno iniziato a disporre di memoria sufficiente per consentire all'archivio di backup di diventare una cosa pratica da fare.
Blrfl,

45

Esistono principalmente due motivi per cui le connessioni X11 sono lente, entrambe toccate nella domanda: larghezza di banda e latenza. Per capire perché le app X11 sono lente su una rete, discutiamo di entrambi.

Larghezza di banda

X11, per impostazione predefinita, non esegue alcuna compressione sui dati di rete che vengono passati tra l'applicazione e il server di visualizzazione. Come accennato, è possibile utilizzare l'opzione -C su SSH per abilitare la compressione e, sebbene ciò aiuti, non è ottimizzato per la compressione di dati grafici. Rispetto ai formati come H.264 che possono ottenere tassi di compressione da 100 a 1, la compressione -C sarà fortunata ad ottenere una compressione da 2 a 1. Una soluzione migliore consiste nell'utilizzare un codec grafico o video ottimizzato per il video X11, ma dobbiamo fare attenzione a non renderlo troppo smarrito poiché i desktop generalmente devono avere immagini più nitide di un film in modo che l'utente possa ancora leggere chiaramente il testo e distinguere i dettagli.

Latenza

X11 tende ad avere una latenza elevata perché la maggior parte delle operazioni richiede più round trip tra l'applicazione e il server di visualizzazione. Quando vengono eseguiti su una LAN in cui i tempi di ping misurano meno di un millisecondo, questi viaggi di andata e ritorno multipli non sono evidenti, ma attraverso una connessione Internet si sommano rapidamente.

soluzioni

Un certo numero di anni fa c'erano un paio di progetti realizzati per affrontare i problemi di larghezza di banda e latenza inerenti al protocollo X11. lbx (Low Bandwidth X) e dxpc (Differential X Protocol Compressor). Non credo che lbx abbia mai avuto molta trazione, ma dxpc è diventata la tecnologia di base utilizzata per un prodotto chiamato NX . NX utilizza sia la compressione con perdita di dati per ridurre i requisiti di larghezza di banda sia un algoritmo differenziale e la memorizzazione nella cache per ridurre il numero di passaggi di informazioni avanti e indietro che creano l'alta latenza. Ho usato NX abbastanza spesso e trovo che le prestazioni siano quasi buone come le applicazioni locali. Se ti senti all'altezza, potresti provare NX e vedere se funziona per te. L'aspetto negativo è che richiede l'installazione di software su entrambe le estremità della connessione, mentre X11 è generalmente già installato.


3
Legato all'argomento della latenza sarebbe che X11 sarà TCP, rispetto a UDP per la maggior parte dei video in streaming. Ci sono alcuni altri prodotti per aiutarti a lavorare in remoto. Tony ha menzionato RDP e VNC. Oracle vende ancora Sun Global Desktop (SGD) che funziona bene. Citrix aveva qualcosa (XenApp?). Il nostro eval ha trovato SGD un'opzione migliore per le nostre esigenze, ma in precedenza aveva utilizzato due prodotti Citrix.
sleepyweasel,

x2go ha funzionato molto bene per me, anche con "server" un vecchio laptop. attivo e funzionante in pochi minuti ... grande aumento delle prestazioni da X11 fwd (inutilizzabile con la mia configurazione)
comte

Per quanto riguarda la latenza, sulle macchine * ix, le sessioni X11 sui display locali di solito usano socket di dominio Unix anziché TCP; I socket di dominio Unix sono molte volte più veloci del TCP nei round trip anche su localhost stackoverflow.com/questions/14973942/… . Per le app X11 con un numero veramente elevato di patologie di round trip, questa potrebbe essere la differenza tra prestazioni ok e prestazioni notevolmente lente.
rakslice,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.