Algumas palavras do nosso escritório de tradução: normalmente todos se esforçam para traduzir os materiais e publicações mais recentes, e nós não somos exceção. Mas os terminais não são atualizados uma vez por semana. Por isso, traduzimos para você um artigo de Antoine Beaupré, publicado na primavera de 2018: apesar de sua considerável “idade” para os padrões modernos, em nossa opinião, o material não perdeu em nada sua relevância. Além disso, originalmente esta era uma série de dois artigos, mas decidimos combiná-los em uma grande postagem.
Os terminais ocupam um lugar especial na história dos computadores, mas nas últimas décadas foram forçados a sobreviver ao lado da linha de comando à medida que as interfaces gráficas se tornaram onipresentes.
Alguns terminais apresentam falhas de segurança surpreendentes, e a maioria possui um conjunto de funções completamente diferente, desde suporte para interface com guias até scripts. Embora nós
Aqui estão os terminais que analisei:
Estas podem não ser as versões mais recentes, já que eu estava limitado a compilações estáveis no momento em que escrevi, que consegui implementar no Debian 9 ou Fedora 27. A única exceção é o Alacritty. É descendente de terminais acelerados por GPU e é escrito em uma linguagem nova e incomum para esta tarefa - Rust. Excluí terminais web da minha análise (incluindo aqueles em
Suporte Unicode
Comecei meus testes com suporte Unicode. O primeiro teste dos terminais foi exibir a string Unicode do
Por padrão, o xterm usa a fonte clássica "fixa", que, de acordo com
Essas capturas de tela foram tiradas no Fedora 27, pois deu melhores resultados que o Debian 9, onde algumas versões mais antigas de terminais (especificamente mlterm) não conseguiam lidar com fontes corretamente. Felizmente isso foi corrigido em versões posteriores.
Agora observe como a linha é exibida no xterm. Acontece que o símbolo Mem e o seguinte semítico
“Muitos programas de computador não conseguem exibir texto bidirecional corretamente. Por exemplo, o nome hebraico "Sarah" consiste nos caracteres sin (ש) (que aparece à direita), depois resh (ר) e finalmente he (ה) (que deve aparecer à esquerda)."
Muitos terminais falham neste teste: Alacritty, terminais Gnome e XFCE derivados de VTE, urxvt, st e xterm exibem "Sara" na ordem inversa, como se tivéssemos escrito o nome como "Aras".
Outro problema com textos bidirecionais é que eles precisam estar alinhados de alguma forma, especialmente quando se trata de misturar textos RTL e LTR. Os scripts RTL devem ser executados no lado direito da janela do terminal, mas o que deve acontecer com os terminais cujo padrão é o inglês LTR? A maioria deles não possui nenhum mecanismo especial e alinha todo o texto à esquerda (inclusive no Konsole). As exceções são pterm e mlterm, que aderem aos padrões e alinham essas linhas à direita.
Proteção de inserção
O próximo recurso crítico que identifiquei é a proteção anti-inserção. Embora seja amplamente conhecido que feitiços como:
$ curl http://example.com/ | sh
são comandos push de execução de código, poucas pessoas sabem que comandos ocultos podem entrar no console ao copiar e colar de um navegador da web, mesmo após uma inspeção cuidadosa.
git clone git: //git.kernel.org/pub/scm/utils/kup/kup.git
se torna um grande incômodo quando colado do site de Horn no terminal:
git clone /dev/null;
clear;
echo -n "Hello ";
whoami|tr -d 'n';
echo -e '!nThat was a bad idea. Don'"'"'t copy code from websites you don'"'"'t trust!
Here'"'"'s the first line of your /etc/passwd: ';
head -n1 /etc/passwd
git clone git://git.kernel.org/pub/scm/utils/kup/kup.git
Como funciona? Código malicioso está incluído no bloco , que é removido da visualização do usuário usando CSS.
set enable-bracketed-paste on
Infelizmente, o site de teste de Horn também mostra como contornar essa proteção por meio da própria formatação do texto e acabar prematuramente aplicando o modo entre colchetes a ele. Isso funciona porque alguns terminais não filtram corretamente as sequências de escape antes de adicionar as suas próprias. Por exemplo, no meu nunca consegui completar com sucesso os testes do Konsole mesmo com a configuração correta .inputrc arquivo. Isso significa que você pode facilmente corromper a configuração do sistema devido a um aplicativo não compatível ou a um shell configurado incorretamente. Isto é especialmente perigoso ao fazer login em servidores remotos, onde o trabalho cuidadoso de configuração é menos comum, especialmente se você tiver muitas dessas máquinas remotas.
Uma boa solução para este problema é o plugin de confirmação de colagem para o terminal urxvt, que simplesmente pede permissão para inserir qualquer texto que contenha novas linhas. Não encontrei uma opção mais segura para o ataque de texto descrito por Horn.
Guias e perfis
Um recurso popular no momento é o suporte para uma interface com guias, que definiremos como uma janela de terminal contendo vários outros terminais. Esta função difere para terminais diferentes e, embora os terminais xterm tradicionais não suportem guias, encarnações de terminais mais modernas, como Terminal Xfce, Terminal GNOME e Konsole, têm esta função. Urxvt também oferece suporte a guias, mas apenas se você usar um plugin. Mas em termos de suporte de guias em si, o Terminator é o líder indiscutível: ele não apenas suporta guias, mas também pode organizar os terminais em qualquer ordem (veja a imagem abaixo).
Outro recurso do Terminator é a capacidade de “agrupar” essas guias e enviar as mesmas teclas para vários terminais ao mesmo tempo, fornecendo uma ferramenta rudimentar para realizar operações em massa em vários servidores simultaneamente. Um recurso semelhante também está implementado no Konsole. Para usar este recurso em outros terminais, você deve usar software de terceiros, como
As guias funcionam especialmente bem quando combinadas com perfis: por exemplo, você pode ter uma guia para e-mail, outra para bate-papo e assim por diante. Isto é bem suportado pelo Terminal Konsole e Terminal GNOME. Ambos permitem que cada guia inicie automaticamente seu próprio perfil. O Terminator também oferece suporte a perfis, mas não consegui encontrar uma maneira de iniciar automaticamente determinados programas quando uma guia específica é aberta. Outros terminais não possuem nenhum conceito de “perfil”.
Babados
A última coisa que abordarei na primeira parte deste artigo é a aparência dos terminais. Por exemplo, GNOME, Xfce e urxvt suportam transparência, mas recentemente abandonaram o suporte para imagens de fundo, forçando alguns usuários a mudar para o terminal
Alguns terminais também analisam o texto em busca de padrões de URL para tornar os links clicáveis. Isso se aplica a todos os terminais derivados de VTE, enquanto o urxvt requer um plug-in especial que transformaria URLs com um clique ou usando um atalho de teclado. Outros terminais que testei URLs de exibição de outras maneiras.
Finalmente, uma nova tendência nos terminais é a opcionalidade do buffer de rolagem. Por exemplo, st não possui buffer de rolagem; presume-se que o usuário usará um multiplexador de terminal como tmux e
Alacritty também não possui buffers de retrocesso, mas
Subtotais
Na segunda parte do material (no original eram dois artigos diferentes - aprox. faixa) compararemos desempenho, uso de memória e latência. Mas já podemos constatar que alguns dos terminais em questão apresentam graves deficiências. Por exemplo, os usuários que trabalham regularmente com scripts RTL podem querer considerar mlterm e pterm, pois são melhores em lidar com tarefas semelhantes do que outros. O Konsole também teve um bom desempenho. Os usuários que não trabalham com scripts RTL podem escolher outra coisa.
Em termos de proteção contra inserção de código malicioso, o urxvt se destaca pela implementação especial de proteção contra esse tipo de ataque, o que me parece definitivamente conveniente. Para quem procura alguns recursos, vale a pena dar uma olhada no Konsole. Por fim, vale ressaltar que o VTE é uma excelente base para terminais, o que garante suporte a cores, reconhecimento de URL e assim por diante. À primeira vista, o terminal padrão que acompanha seu ambiente favorito pode atender a todos os requisitos, mas vamos deixar essa questão em aberto até entendermos o desempenho.
Nós continuamos a conversa
Em geral, o desempenho dos terminais em si pode parecer um problema absurdo, mas acontece que alguns deles apresentam latência surpreendentemente alta para software desse tipo fundamental. A seguir também veremos o que é tradicionalmente chamado de “velocidade” (na verdade, esta é a velocidade de rolagem) e o consumo de memória do terminal (com a ressalva de que isso não é tão crítico hoje como era décadas atrás).
O atraso
Após um estudo aprofundado do desempenho do terminal, cheguei à conclusão de que o parâmetro mais importante nesse sentido é a latência (ping). Em seu artigo
Mas o que é latência e por que é tão importante? Em seu artigo, Fatin definiu como “o atraso entre o pressionamento de uma tecla e a atualização da tela correspondente” e citou
Fatin explica que esse ping tem consequências mais profundas do que apenas satisfação: “a digitação fica mais lenta, ocorrem mais erros e a tensão ocular e muscular aumenta”. Em outras palavras, um grande atraso pode levar a erros de digitação e também diminuir a qualidade do código, pois leva a uma carga cognitiva adicional no cérebro. Mas o pior é que o ping “aumenta a tensão ocular e muscular”, o que parece implicar
Alguns destes efeitos são conhecidos há muito tempo e os resultados
Fatin conduziu seus testes em editores de texto; ele criou um instrumento portátil chamado
Aqui estão os resultados das minhas medições, bem como alguns dos resultados de Fatin, para mostrar que meu experimento está de acordo com seus testes:
A primeira coisa que me impressionou foi o melhor tempo de resposta de programas mais antigos, como xterm e mlterm. Com a pior latência de registro (2,4 ms), eles tiveram desempenho melhor que o terminal moderno mais rápido (10,6 ms para st). Nenhum terminal moderno fica abaixo do limite de 10 milissegundos. Em particular, o Alacritty não atende à reivindicação de “emulador de terminal mais rápido disponível”, embora suas pontuações tenham melhorado desde sua primeira análise em 2017. Na verdade, os autores do projeto
No entanto, as diferenças podem não ser perceptíveis a olho nu. Como explica Fatin, “você não precisa estar ciente do atraso para que isso tenha efeito sobre você”. Fatin também alerta sobre o desvio padrão: “quaisquer perturbações na latência (jitter) criam estresse adicional devido à sua imprevisibilidade”.
O gráfico acima foi obtido no Debian 9 puro (stretch) com
Velocidade de rolamento
O próximo teste é um teste tradicional de “velocidade” ou “largura de banda”, que mede a rapidez com que o terminal pode rolar uma página enquanto exibe grandes quantidades de texto na tela. A mecânica do teste varia; o teste original era simplesmente gerar a mesma string de texto usando o comando seq. Outros testes incluem o teste de Thomas E. Dickey (mantenedor do xterm), que repetidamente
Aqui vemos o rxvt e o st à frente da concorrência, seguidos pelo muito mais recente Alacritty, que foi projetado com foco no desempenho. Em seguida estão o Xfce (família VTE) e o Konsole, que são quase duas vezes mais rápidos. O último é o xterm, que é cinco vezes mais lento que o rxvt. Durante o teste, o xterm também ondulou bastante, dificultando a visualização da passagem do texto, mesmo que fosse a mesma linha. O Konsole era rápido, mas às vezes complicado: a tela congelava de vez em quando, exibindo texto parcial ou nem exibindo. Outros terminais exibiam strings claramente, incluindo st, Alacritty e rxvt.
Dickey explica que as diferenças de desempenho se devem ao design dos buffers de rolagem em diferentes terminais. Em particular, ele acusa o rxvt e outros terminais de “não seguirem as regras gerais”:
“Ao contrário do xterm, o rxvt não tentou exibir todas as atualizações. Se ficar para trás, recusará algumas atualizações para recuperar o atraso. Isso teve um impacto maior na velocidade aparente de rolagem do que na organização da memória interna. Uma desvantagem era que a animação ASCII era um tanto imprecisa."
Para corrigir essa lentidão percebida do xterm, Dickey sugere usar o recurso
Consumo de recursos
Independentemente de fazer sentido considerar a velocidade de rolagem como uma métrica de desempenho, este teste nos permite simular a carga nos terminais, o que por sua vez nos permite medir outros parâmetros como memória ou uso de disco. As métricas foram obtidas executando o teste especificado seq no monitoramento de processos Python. Ele coletou dados do medidor
Neste teste, o ST fica em primeiro lugar com o menor consumo médio de memória de 8 MB, o que não surpreende considerando que a ideia principal do design é a simplicidade. mlterm, xterm e rxvt consomem um pouco mais - cerca de 12 MB. Outro resultado notável é o Alacritty, que requer 30 MB para ser executado. Depois, há terminais da família VTE com cifras de 40 a 60 MB, o que é bastante. Este consumo pode ser explicado pelo fato de estes terminais utilizarem bibliotecas de nível superior, por exemplo, GTK. O Konsole vem em último lugar com um impressionante consumo de memória de 65 MB durante os testes, embora isso possa ser justificado pela sua ampla gama de recursos.
Em comparação com resultados anteriores obtidos há dez anos, todos os programas começaram a consumir visivelmente mais memória. O Xterm costumava exigir 4 MB, mas agora requer 15 MB apenas na inicialização. Há um aumento semelhante no consumo do rxvt, que agora requer 16 MB prontos para uso. O Terminal Xfce ocupa 34 MB, três vezes maior do que antes, mas o Terminal GNOME requer apenas 20 MB. Claro, todos os testes anteriores foram realizados na arquitetura de 32 bits. Na LCA 2012 Rusty Russell
No entanto, não posso deixar de sentir que alocar mais memória para algo tão fundamental como o terminal é um desperdício de recursos. Esses programas deveriam ser os menores dos menores, deveriam ser capazes de rodar em qualquer “caixa”, até mesmo uma caixa de sapatos, se algum dia chegarmos ao ponto em que eles precisem ser equipados com sistemas Linux (e você sabe que assim será). ). Mas com esses números, o uso de memória se tornará um problema no futuro em qualquer ambiente que execute vários terminais, exceto alguns dos mais leves e com capacidades mais limitadas. Para compensar isso, Terminal GNOME, Konsole, urxvt, Terminator e Terminal Xfce possuem um modo Daemon que permite controlar vários terminais através de um único processo, limitando seu consumo de memória.
Durante meus testes, cheguei a outro resultado inesperado em relação à leitura e gravação de disco: não esperava ver nada aqui, mas descobri que alguns terminais gravam os dados mais volumosos no disco. Portanto, a biblioteca VTE na verdade mantém um buffer de rolagem no disco (esse recurso
Conclusão
Na primeira parte do artigo, descobrimos que os terminais baseados em VTE possuem um bom conjunto de recursos, mas agora vemos que isso acarreta alguns custos de desempenho. Agora a memória não é um problema porque todos os terminais VTE podem ser controlados através de um processo Daemon, o que limita o seu apetite. No entanto, sistemas mais antigos que possuem limitações físicas na quantidade de RAM e buffers de kernel ainda podem precisar de versões anteriores de terminais, pois consomem significativamente menos recursos. Embora os terminais VTE tenham tido um bom desempenho em testes de rendimento (rolagem), sua latência de exibição está acima do limite definido no Guia do Usuário do GNOME. Os desenvolvedores de VTE provavelmente deveriam levar isso em consideração. Se levarmos em conta que mesmo para usuários novatos do Linux encontrar um terminal é inevitável, eles podem torná-lo mais amigável. Para geeks experientes, mudar do terminal padrão pode até significar menos cansaço visual e a capacidade de evitar futuras lesões e doenças relacionadas ao trabalho devido a longas sessões de trabalho. Infelizmente, apenas os antigos xterm e mlterm nos levam ao limite mágico do ping de 10 milissegundos, o que é inaceitável para muitos.
As medições de benchmark também mostraram que, devido ao desenvolvimento dos ambientes gráficos Linux, os desenvolvedores tiveram que fazer uma série de concessões. Alguns usuários podem querer consultar gerenciadores de janelas regulares, pois eles fornecem uma redução significativa de ping. Infelizmente, não foi possível medir a latência do Wayland: o programa Typometer que usei foi criado para o que o Wayland foi projetado para evitar: espionar outras janelas. Espero que a composição do Wayland tenha um desempenho melhor do que o X.org e também espero que no futuro alguém encontre uma maneira de medir a latência neste ambiente.
Fonte: habr.com