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

80

Sempre que eu remotamente lanço grandes GUIs com o encaminhamento do X11, incluindo até mesmo o switch -C, a experiência não responde muito. Minha pergunta é, o que faz, no nível de conceito / protocolo, causar isso?

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

Eu entendo que ao contrário do streaming de vídeo, a latência será na melhor das hipóteses dobrada (como a entrada precisa ser enviada para a máquina remota e somente depois disso a resposta pode responder), mas internamente, existem outros fatores que aumentam a latência ainda mais longe?

Em segundo lugar, a largura de banda. Por que isso consome 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 imagem grande de quadrado preto terá uma redução menor na representação .png, porque as informações não são armazenadas para cada pixel, mas de uma maneira simples, até onde eu Compreendo.

No caso de vídeos, muitas informações podem ser salvas, enviando a diferença entre quadros, em vez de quadros inteiros.

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

    
por user129186 08.06.2017 / 15:26

2 respostas

104

O protocolo X11 nunca foi concebido para manipular operações intensivas gráficas (em termos de bitmaps / texturas). No passado, quando o X11 foi projetado pela primeira vez, os gráficos de computador eram muito mais simples do que são hoje.

Basicamente, o X11 não envia a tela para o seu computador, mas envia as instruções de exibição para que o X-server em seu computador local possa recriar a tela em seu sistema local. E isso precisa ser feito em cada alteração / atualização da exibição.
Portanto, seu computador recebe um fluxo de instruções como "desenhe linha nesta cor das coordenadas x, y para (xx, yy), desenhe retângulo W pixels de largura, H pixels de altura com 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 pouca informação sobre o que o cliente realmente precisa, então 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 (sem animações e outras) for necessária. Qual foi o caso nos dias em que o X11 foi desenvolvido pela primeira vez.

Mas as GUIs modernas têm muitos efeitos visuais, e muito disso precisa ser enviado do sistema remoto para o seu cliente na forma de bitmaps / textures / fonts que consomem muita largura de banda. E todos os tipos de colírio incluem efeitos animados que exigem atualizações frequentes. E os monitores continuam a ficar maiores também, duas vezes mais largo / alto é 4x o número de pixels.

Claro, com o tempo, melhorias no protocolo X11 foram feitas para otimizar isso o máximo possível, mas o design subjacente básico, em essência, simplesmente não é adequado às demandas do tipo de interface gráfica que as pessoas esperam hoje.

Outros protocolos (como RDP e VNC) são mais projetados para permitir que o sistema remoto faça todo o trabalho pesado e deixe que o sistema decida quais atualizações enviar ao cliente (como bitmaps compactados) da forma mais eficiente possível. Muitas vezes, isso acaba sendo mais eficiente para interfaces gráficas modernas.

Nenhum método é perfeito e pode lidar com todas as situações igualmente bem. Não existe um único protocolo de exibição que possa se dar bem sob qualquer caso de uso concebível.
Portanto, na maioria dos casos, você tenta todos os protocolos suportados entre o seu cliente local e o servidor remoto e usa aquele que oferece os melhores resultados. E, em alguns casos, não há escolha e você só 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 arte arcana. Muitos administradores de sistemas não estarão dispostos a mexer com isso.)

Na maioria dos casos, a maneira mais fácil de melhorar o desempenho (às vezes de maneira bastante dramática) é alternar para um ambiente de área de trabalho mais simples, com menos brilho e sem o uso de imagens de plano de fundo.

    
por 08.06.2017 / 16:31
36

Existem basicamente duas razões para as conexões X11 serem lentas, as quais você mencionou em 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, ela não é otimizada para compactar dados gráficos. Em comparação com formatos como o H.264, que pode obter taxas de compressão de 100 a 1, a compactação -C terá sorte de atingir a compactação de 2 para 1. Uma solução melhor é usar um codec otimizado para vídeo ou vídeo para o vídeo X11, mas temos que ter cuidado para não torná-lo muito com perdas, pois os desktops geralmente precisam ter imagens mais nítidas do que um filme para que o usuário possa ler claramente o texto e 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 executado em uma LAN, em que os tempos de ping medem menos que um milissegundo, essas várias viagens de ida e volta não são perceptíveis, mas, em uma conexão com a Internet, elas são adicionadas rapidamente.

Soluções

Há alguns anos, alguns projetos foram desenvolvidos para abordar os problemas de largura de banda e latência inerentes ao protocolo X11. lbx (Low Bandwidth X) e dxpc (Differential X Protocol Compressor). Eu não acho que a lbx tenha conseguido muita tração, mas a dxpc se tornou a tecnologia subjacente usada para um produto chamado NX . O NX usa compactação com perdas para reduzir os requisitos de largura de banda e um algoritmo diferencial e armazenamento em cache para reduzir o número de transições de informações de ida e volta que criam a alta latência. Eu usei o NX com bastante frequência e acho que o desempenho é quase tão bom quanto os aplicativos locais. Se você está se sentindo bem, você pode tentar o NX e ver se funciona para você. A desvantagem é que é necessário instalar o software em ambas as extremidades da conexão, enquanto o X11 geralmente já está instalado.

    
por 08.06.2017 / 18:04