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?
fonte
ssh -Y -c blowfish
para 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.Respostas:
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.
fonte
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.
fonte