Por que o encaminhamento do X11 é tão ineficiente?

97

Sempre que inicio remotamente GUIs grandes com encaminhamento X11, mesmo incluindo a opção -C, a experiência não responde. Minha pergunta é: o que isso causa no nível de conceito / protocolo?

Com minha conexão de 25 bits, posso transmitir vídeo em HD para o meu computador absolutamente sem problemas. Por outro lado, a falta de resposta das GUIs lançadas remotamente com o encaminhamento X11 ocorre mesmo em uma LAN de 100 bits, onde a latência deve estar próxima de zero.

Entendo que, ao contrário do streaming de vídeo, a latência será dobrada na melhor das hipóteses (pois a entrada precisa ser enviada para a máquina remota e somente depois disso a aplicação pode responder), mas internamente, existem outros fatores que aumentam a latência mais distante?

Em segundo lugar, a largura de banda. Por que ele come tanto? Quando se trata de formatos de imagem e vídeo, muitos métodos são usados ​​para reduzir drasticamente o tamanho.

No caso de .bmp vs .png, por exemplo, uma grande imagem quadrada preta terá muito menos representação em .png, porque as informações não são armazenadas para cada pixel, mas de uma maneira abrangente, até onde eu entendo.

No caso de vídeos, muitas informações podem ser salvas enviando a diferença entre os quadros e não os quadros inteiros.

Eu sei que isso é muito simplificado, mas o X11 não está usando esses métodos? Ele se comporta em um princípio de bitmap-ish ou não-diferencial em algum nível? E se não, por que ocupa tanta largura de banda?

user129186
fonte
9
Curiosidades: Xpra oferece uma abordagem interessante.
Kamil Maciorowski
12
BTW - usar "-C" diminuirá sua conexão se o seu link for rápido o suficiente, porque a compactação leva tempo. "-C" pode beneficiar 100Mb, mas provavelmente prejudica 1Gb e certamente prejudica 10Gb. Também é o caso de 'ssh' prejudicar sua taxa de transferência - assim como qualquer criptografia em links rápidos. Se você possui uma conexão direta entre computadores ou uma conexão interna segura, vá direto com sua conexão X pelo TCP: 6000. Você obterá uma melhoria notável na velocidade.
Astara
2
Parece que você está encaminhando através do SSH, que precisa criptografar / descriptografar todos os dados. Isso adicionará sobrecarga / latência. Processadores mais rápidos podem ajudar, mas há uma certa latência que isso adicionará, não importa o que você faça. X é muito "falador", então um ligeiro aumento na latência = queda significativa no desempenho. No passado, eu era capaz de usar o X, encapsulado em SSH por um modem 28,8; que estava usando o lbxproxy (agora descontinuado), que armazenava em cache / compactava muitos dados e reduzia a "chattiness" da conexão. O uso de -C pode adicionar apenas mais latência.
precisa saber é o seguinte
Use algo como ssh -Y -c blowfishpara minimizar a sobrecarga enquanto ainda criptografa. Se você tiver controle total de ambas as extremidades, ensine o ssh a usar a criptografia "none" para obter velocidade total de transferência na conexão.
Thorbjørn Ravn Andersen

Respostas:

116

O protocolo X11 nunca foi concebido para lidar com operações intensivas graficamente (em termos de bitmaps / texturas). No dia em que o X11 foi projetado pela primeira vez, a computação gráfica era muito mais simples do que é hoje.

Basicamente, o X11 não envia a tela para o seu computador, mas envia as instruções de exibição para que o servidor X no seu computador local possa recriar a tela no seu sistema local. E isso precisa ser feito em cada alteração / atualização da exibição.
Assim, o seu computador recebe um fluxo de instruções como "desenhar linha nesta cor das coordenadas x, y a (xx, aa), desenhar retângulo W pixels de largura, H pixels de altura com o canto superior esquerdo em (x, y) etc. "
O cliente local não está realmente ciente do que precisa ser atualizado e o sistema remoto tem muito poucas informações sobre o que o cliente realmente precisa; portanto, basicamente, o servidor deve enviar muitas informações redundantes que o cliente pode ou não precisar.
Isso é muito eficiente se a exibição a ser renderizada consistir em um número limitado de formas gráficas simples e apenas uma baixa frequência de atualização (nenhuma animação e tal) for necessária. Qual foi o caso nos dias em que o X11 foi desenvolvido pela primeira vez.

Porém, as GUIs modernas têm muito apetite e muito disso precisa ser enviado do sistema remoto para o cliente na forma de bitmaps / texturas / fontes que exigem muita largura de banda. E todo tipo de colírio para os olhos inclui efeitos animados que exigem atualizações frequentes. E as telas também aumentam, duas vezes mais largo / alto é 4x o número de pixels.

É claro que, com o tempo, foram feitos aprimoramentos no protocolo X11 para otimizar isso o máximo possível, mas o design básico subjacente é, em essência, simplesmente não adequado às demandas do tipo de pessoal da GUI atualmente.

Outros protocolos (como RDP e VNC) são mais projetados para permitir que o sistema remoto faça todo o trabalho árduo e que ele decida quais atualizações serão enviadas ao cliente (como bitmaps compactados) da maneira mais eficiente possível. Muitas vezes, isso acaba sendo mais eficiente para as GUIs modernas.

Nenhum dos métodos é perfeito e pode lidar com todas as situações igualmente bem. Não existe um único protocolo de exibição que possa funcionar bem em todos os casos de uso concebíveis.
Portanto, na maioria dos casos, você apenas tenta todos os protocolos suportados entre o cliente local e o servidor remoto e usa o que fornece os melhores resultados. E, em alguns casos, não há escolha e você apenas precisa se contentar com o que estiver disponível.

A maioria dos protocolos permite algum ajuste de desempenho, mas muitas dessas configurações são apenas do lado do servidor e não estão disponíveis para o usuário médio. (E configurá-los corretamente é um pouco de uma arte misteriosa. Muitos administradores de sistemas não querem mexer nisso.)

Na maioria dos casos, a maneira mais fácil de melhorar o desempenho (às vezes de maneira bastante dramática) é mudar para um ambiente de área de trabalho mais simples, com menos apelo visual e abrir mão do uso de imagens de fundo.

Tonny
fonte
15
+1 Como RDP e VNC são mencionados, também devo mencionar o x2go, que é uma solução de cache / encaminhamento do X11 que realmente acelera o encaminhamento do X11. Eu usei com sucesso no passado.
Rath
7
Em relação às "configurações somente do lado do servidor" perto do final, lembre-se de que o servidor X roda no computador conectado ao monitor físico e o cliente X é o software usado para executar alguma tarefa (por exemplo, um navegador da web ou processador de texto). ) Portanto, as configurações do servidor X seriam acessíveis ao usuário que se conectasse ao sistema remoto para executar um aplicativo gráfico. No entanto, isso não diminui significativamente o valor da sua resposta.
a CVn
2
Tecnicamente, o protocolo é RFB, não VNC.
precisa saber é
6
Estou errado ou você está confundindo cliente e servidor em seu segundo parágrafo? O cliente é o programa em execução remota, o servidor é a máquina local.
Jonas Schäfer
2
O que você abordou no terceiro parágrafo foi amplamente mitigado na década de 1990, quando as máquinas que rodavam servidores X começaram a ter memória suficiente para permitir que o armazenamento de backup se tornasse algo prático.
Blrfl
45

Existem basicamente dois motivos para as conexões X11 serem lentas, e você mencionou na sua pergunta: largura de banda e latência. Para entender por que os aplicativos X11 são lentos em uma rede, vamos discutir os dois.

Largura de banda

O X11, por padrão, não faz nenhuma compactação nos dados da rede que são transmitidos entre o aplicativo e o servidor de exibição. Como você mencionou, você pode usar a opção -C no SSH para ativar a compactação e, embora isso ajude, não é otimizado para compactar dados gráficos. Comparado a formatos como o H.264, que pode obter taxas de compressão de 100 a 1, a compressão -C terá a sorte de obter a compressão 2 a 1. Uma solução melhor é usar um codec otimizado para gráficos ou vídeos para o vídeo X11, mas precisamos ter cuidado para não deixá-lo com perdas, pois os desktops geralmente precisam ter imagens mais nítidas do que um filme para que o usuário ainda possa ler claramente o texto e decifrar detalhes finos.

Latência

O X11 tende a ter alta latência porque a maioria das operações exige várias viagens de ida e volta entre o aplicativo e o servidor de exibição. Quando executados em uma LAN onde os tempos de ping medem menos de um milissegundo, essas múltiplas viagens de ida e volta não são perceptíveis, mas em uma conexão com a Internet elas aumentam rapidamente.

Soluções

Alguns anos atrás, havia alguns projetos criados para resolver os problemas de largura de banda e latência inerentes ao protocolo X11. lbx (largura de banda baixa X) e dxpc (compressor de protocolo X diferencial). Acho que o lbx nunca teve muita tração, mas o dxpc se tornou a tecnologia subjacente usada para um produto chamado NX . O NX usa a compactação com perdas para reduzir os requisitos de largura de banda e um algoritmo diferencial e cache para reduzir o número de informações que vão e voltam que criam a alta latência. Eu usei o NX com bastante frequência e considero o desempenho quase tão bom quanto os aplicativos locais. Se você estiver com vontade de experimentar, tente o NX e veja se funciona para você. A desvantagem é que ele requer a instalação de software nas duas extremidades da conexão, enquanto o X11 geralmente já está instalado.

virtex
fonte
3
Ligado ao tópico da latência, o X11 será TCP, vs UDP, para a maioria dos vídeos de streaming. Existem alguns outros produtos para ajudar no trabalho remotamente. Tony mencionou o RDP e o VNC. A Oracle ainda vende o Sun Global Desktop (SGD), que funciona bem. A Citrix tinha alguma coisa (XenApp?). Nossa avaliação considerou o SGD a melhor opção para nossas necessidades, mas já havia usado dois produtos Citrix anteriormente.
sleepyweasel 8/17/17
O x2go funcionou muito bem para mim, mesmo com o "servidor" de um laptop antigo. instalado e funcionando em poucos minutos ... grande aumento no desempenho do X11 fwd (inutilizável com minha configuração) #
1515 de
Em termos de latência, em máquinas * ix, as sessões X11 para monitores locais geralmente usam soquetes de domínio Unix em vez de TCP; Soquetes de domínio Unix são muitas vezes mais rápidos que o TCP em viagens de ida e volta, mesmo para o host local stackoverflow.com/questions/14973942/… . Para aplicativos X11 com um número realmente grande de patologias de ida e volta, essa pode ser a diferença entre desempenho aceitável e notavelmente lento.
rakslice