Een paar woorden van ons vertaalbureau: normaal gesproken streeft iedereen ernaar de nieuwste materialen en publicaties te vertalen, en wij zijn daarop geen uitzondering. Maar terminals zijn niet iets dat één keer per week wordt bijgewerkt. Daarom hebben we voor u een artikel van Antoine Beaupré vertaald, gepubliceerd in het voorjaar van 2018: ondanks zijn aanzienlijke “leeftijd” naar moderne maatstaven, heeft het materiaal naar onze mening zijn relevantie helemaal niet verloren. Bovendien was dit oorspronkelijk een serie van twee artikelen, maar we hebben besloten deze te combineren tot één grote post.
Terminals nemen een speciale plaats in de computergeschiedenis in, maar zijn de afgelopen decennia gedwongen om naast de opdrachtregel te overleven, omdat grafische interfaces alomtegenwoordig zijn geworden.
Sommige terminals hebben ronduit verrassende beveiligingslekken, en de meeste hebben een compleet andere reeks functies, van ondersteuning voor een interface met tabbladen tot scripting. Hoewel wij
Dit zijn de terminals die ik heb beoordeeld:
Dit zijn misschien niet de nieuwste versies, aangezien ik op het moment van schrijven beperkt was tot stabiele builds, die ik kon uitrollen op Debian 9 of Fedora 27. De enige uitzondering is Alacritty. Het is een afstammeling van GPU-versnelde terminals en is voor deze taak geschreven in een ongebruikelijke en nieuwe taal: Rust. Ik heb webterminals uitgesloten van mijn beoordeling (inclusief die op
Unicode-ondersteuning
Ik begon mijn tests met Unicode-ondersteuning. De eerste test van de terminals was het weergeven van de Unicode-reeks van
Standaard gebruikt xterm het klassieke "vaste" lettertype, dat volgens
Deze schermafbeeldingen zijn gemaakt in Fedora 27, omdat het betere resultaten opleverde dan Debian 9, waar sommige oudere versies van terminals (met name mlterm) lettertypen niet goed konden verwerken. Gelukkig is dit in latere versies opgelost.
Merk nu op hoe de regel wordt weergegeven in xterm. Het blijkt dat het symbool Mem en het volgende Semitisch is
“Veel computerprogramma's kunnen bidirectionele tekst niet correct weergeven. De Hebreeuwse naam "Sarah" bestaat bijvoorbeeld uit de letters sin (ש) (die aan de rechterkant verschijnt), vervolgens resh (ר) en tenslotte hij (ה) (die aan de linkerkant zou moeten verschijnen).
Veel terminals slagen niet voor deze test: Alacritty, VTE-afgeleide Gnome- en XFCE-terminals, urxvt, st en xterm geven "Sara" in omgekeerde volgorde weer, alsof we de naam als "Aras" hadden geschreven.
Een ander probleem met bidirectionele teksten is dat ze op de een of andere manier moeten worden uitgelijnd, vooral als het gaat om het mixen van RTL- en LTR-teksten. RTL-scripts moeten vanaf de rechterkant van het terminalvenster worden uitgevoerd, maar wat moet er gebeuren met terminals die standaard LTR English gebruiken? De meeste hebben geen speciale mechanismen en lijnen alle tekst links uit (ook in Konsole). De uitzonderingen zijn pterm en mlterm, die zich aan de normen houden en dergelijke lijnen rechts uitlijnen.
Bescherming tegen inbrengen
Het volgende cruciale kenmerk dat ik heb geïdentificeerd, is bescherming tegen inbrengen. Hoewel het algemeen bekend is dat spreuken als:
$ curl http://example.com/ | sh
zijn push-opdrachten voor het uitvoeren van code. Weinig mensen weten dat verborgen opdrachten de console kunnen binnensluipen bij het kopiëren en plakken vanuit een webbrowser, zelfs na zorgvuldige inspectie.
git clone git: //git.kernel.org/pub/scm/utils/kup/kup.git
wordt zo hinderlijk als het van de website van Horn in de terminal wordt geplakt:
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
Hoe het werkt? Schadelijke code is in het blok opgenomen , dat met CSS uit de weergave van de gebruiker wordt verplaatst.
set enable-bracketed-paste on
Helaas laat de testsite van Horn ook zien hoe je deze bescherming kunt omzeilen via de tekstopmaak zelf en er voortijdig de Bracketed-modus op kunt toepassen. Dit werkt omdat sommige terminals escape-reeksen niet correct filteren voordat ze hun eigen reeksen toevoegen. In de mijne kon ik bijvoorbeeld nooit de Konsole-tests met succes voltooien, zelfs niet met de juiste configuratie .invoerrc bestand. Dit betekent dat uw systeemconfiguratie gemakkelijk beschadigd kan raken als gevolg van een niet-ondersteunde applicatie of een onjuist geconfigureerde shell. Dit is vooral gevaarlijk bij het inloggen op externe servers, waar zorgvuldig configuratiewerk minder gebruikelijk is, vooral als u veel van dergelijke externe machines heeft.
Een goede oplossing voor dit probleem is de plakbevestigingsplug-in voor de terminal uxvt, dat eenvoudigweg toestemming vraagt om tekst in te voegen die nieuwe regels bevat. Ik heb geen veiliger optie gevonden voor de tekstaanval beschreven door Horn.
Tabbladen en profielen
Een populaire functie op dit moment is ondersteuning voor een interface met tabbladen, die we zullen definiëren als één terminalvenster met daarin verschillende andere terminals. Deze functie verschilt per terminal, en hoewel traditionele xterm-terminals helemaal geen tabbladen ondersteunen, hebben modernere terminal-incarnaties zoals Xfce Terminal, GNOME Terminal en Konsole deze functie wel. Urxvt ondersteunt ook tabbladen, maar alleen als u een plug-in gebruikt. Maar wat betreft tabbladondersteuning zelf is Terminator de onbetwiste leider: het ondersteunt niet alleen tabbladen, maar kan ook terminals in willekeurige volgorde rangschikken (zie onderstaande afbeelding).
Een ander kenmerk van Terminator is de mogelijkheid om deze tabbladen te "groeperen" en dezelfde toetsaanslagen tegelijkertijd naar meerdere terminals te sturen, wat een ruw hulpmiddel biedt voor het tegelijkertijd uitvoeren van bulkbewerkingen op meerdere servers. Een soortgelijke functie is ook geïmplementeerd in Konsole. Om deze functie in andere terminals te gebruiken, moet u software van derden gebruiken, zoals
Tabbladen werken vooral goed in combinatie met profielen: u kunt bijvoorbeeld één tabblad hebben voor e-mail, een ander voor chatten, enzovoort. Dit wordt goed ondersteund door Konsole Terminal en GNOME Terminal. Beide zorgen ervoor dat elk tabblad automatisch een eigen profiel kan starten. Terminator ondersteunt ook profielen, maar ik kon geen manier vinden om bepaalde programma's automatisch te starten wanneer een specifiek tabblad wordt geopend. Andere terminals kennen het concept ‘profiel’ helemaal niet.
Ruches
Het laatste dat ik in het eerste deel van dit artikel zal behandelen, is het uiterlijk van de terminals. GNOME, Xfce en urxvt ondersteunen bijvoorbeeld transparantie, maar hebben onlangs de ondersteuning voor achtergrondafbeeldingen stopgezet, waardoor sommige gebruikers gedwongen zijn over te schakelen naar de terminal
Sommige terminals analyseren ook tekst op URL-patronen om links klikbaar te maken. Dit geldt voor alle van VTE afgeleide terminals, terwijl urxvt een speciale plug-in vereist die URL's met één klik of met behulp van een sneltoets zou transformeren. Andere terminals Ik heb zichtbare URL's op andere manieren getest.
Een nieuwe trend op het gebied van terminals ten slotte is de optionele scrollbuffer. st heeft bijvoorbeeld geen scrollbuffer; Er wordt aangenomen dat de gebruiker een terminalmultiplexer zoals tmux en zal gebruiken
Alacritty mist ook backscroll-buffers, maar
subtotalen
In het tweede deel van het materiaal (in het origineel waren dit twee verschillende artikelen - ca. rijbaan) vergelijken we de prestaties, het geheugengebruik en de latentie. Maar we kunnen nu al zien dat sommige terminals in kwestie ernstige tekortkomingen vertonen. Gebruikers die regelmatig met RTL-scripts werken, willen bijvoorbeeld mlterm en pterm overwegen, omdat zij soortgelijke taken beter kunnen uitvoeren dan anderen. Konsole presteerde ook goed. Gebruikers die niet met RTL-scripts werken, kunnen voor iets anders kiezen.
In termen van bescherming tegen het invoegen van kwaadaardige code onderscheidt urxvt zich door de speciale implementatie van bescherming tegen dit soort aanvallen, wat mij zeker handig lijkt. Voor wie op zoek is naar wat toeters en bellen, is Konsole een kijkje waard. Ten slotte is het vermeldenswaard dat VTE een uitstekende basis is voor terminals, die kleurondersteuning, URL-herkenning, enzovoort garandeert. Op het eerste gezicht voldoet de standaardterminal die bij uw favoriete omgeving wordt geleverd aan alle vereisten, maar laten we deze vraag open laten totdat we de prestaties begrijpen.
We zetten het gesprek voort
Over het algemeen lijken de prestaties van terminals op zichzelf misschien een vergezocht probleem, maar het blijkt dat sommige ervan een verrassend hoge latentie vertonen voor software van een dergelijk fundamenteel type. Vervolgens zullen we ook kijken naar wat traditioneel “snelheid” wordt genoemd (in feite is dit de scrollsnelheid) en het geheugenverbruik van de terminal (met het voorbehoud dat dit vandaag de dag niet zo kritisch is als tientallen jaren geleden).
Vertraging
Na een grondige studie van de terminalprestaties kwam ik tot de conclusie dat de belangrijkste parameter in dit opzicht de latentie (ping) is. In zijn artikel
Maar wat is latentie en waarom is het zo belangrijk? In zijn artikel definieerde Fatin het als “de vertraging tussen het indrukken van een toets en de bijbehorende schermupdate” en citeerde hij dit
Fatin legt uit dat deze ping diepere gevolgen heeft dan alleen bevrediging: “het typen wordt langzamer, er treden meer fouten op en de oog- en spierspanning neemt toe.” Met andere woorden: een grote vertraging kan leiden tot typefouten en ook tot een lagere codekwaliteit, omdat dit leidt tot extra cognitieve belasting van de hersenen. Maar wat nog erger is, is dat ping ‘de oog- en spierspanning verhoogt’, wat lijkt te impliceren
Sommige van deze effecten zijn al lang bekend, en de resultaten ervan
Fatin voerde zijn tests uit op teksteditors; hij creëerde een draagbaar instrument genaamd
Hier zijn de resultaten van mijn metingen, evenals enkele resultaten van Fatin, om aan te tonen dat mijn experiment overeenkomt met zijn tests:
Het eerste dat mij opviel was de betere responstijd van oudere programma's zoals xterm en mlterm. Met de slechtste registerlatentie (2,4 ms) presteerden ze beter dan de snelste moderne terminal (10,6 ms voor st). Geen enkele moderne terminal komt onder de drempel van 10 milliseconden. In het bijzonder slaagt Alacritty er niet in om te voldoen aan de claim van "snelste beschikbare terminalemulator", hoewel de scores zijn verbeterd sinds de eerste beoordeling in 2017. Inderdaad, de auteurs van het project
De verschillen zijn echter mogelijk niet waarneembaar voor het oog. Zoals Fatin uitlegt: “Je hoeft je niet bewust te zijn van de vertraging om effect op je te hebben.” Fatin waarschuwt ook voor de standaarddeviatie: “elke verstoring van de latentie (jitter) zorgt vanwege hun onvoorspelbaarheid voor extra stress.”
De bovenstaande grafiek is genomen op pure Debian 9 (stretch).
Scrollsnelheid
De volgende test is een traditionele "snelheids"- of "bandbreedte"-test, die meet hoe snel de terminal door een pagina kan scrollen terwijl er grote hoeveelheden tekst op het scherm worden weergegeven. De werking van de test varieert; de oorspronkelijke test was om eenvoudigweg dezelfde tekstreeks te genereren met behulp van de opdracht seq. Andere tests zijn onder meer de test van Thomas E. Dickey (xterm-onderhouder), die herhaaldelijk wordt uitgevoerd
Hier zien we de rxvt en st een voorsprong nemen op de concurrentie, gevolgd door de veel nieuwere Alacritty, die is ontworpen met de nadruk op prestaties. De volgende zijn Xfce (VTE-familie) en Konsole, die bijna twee keer zo snel zijn. Als laatste is xterm, dat vijf keer langzamer is dan rxvt. Tijdens de test golfde xterm ook veel, waardoor passerende tekst moeilijk te zien was, zelfs als het dezelfde regel was. Konsole was snel, maar soms was het lastig: het scherm liep af en toe vast, waardoor gedeeltelijke tekst werd weergegeven of helemaal niet. Andere terminals gaven strings duidelijk weer, waaronder st, Alacritty en rxvt.
Dickey legt uit dat de prestatieverschillen te wijten zijn aan het ontwerp van scrollbuffers in verschillende terminals. In het bijzonder beschuldigt hij rxvt en andere terminals ervan "de algemene regels niet te volgen":
“In tegenstelling tot xterm heeft rxvt niet geprobeerd alle updates weer te geven. Als het achterop raakt, zal het enkele updates weigeren om de achterstand in te halen. Dit had een grotere impact op de schijnbare scrollsnelheid dan op de interne geheugenorganisatie. Een nadeel was dat de ASCII-animatie enigszins onnauwkeurig was."
Om deze waargenomen xterm-traagheid op te lossen, stelt Dickey voor om de bron te gebruiken
Het verbruik van hulpbronnen
Ongeacht of het zinvol is om de scrollsnelheid als prestatiemaatstaf te beschouwen, deze test stelt ons in staat de belasting van de terminals te simuleren, waardoor we op zijn beurt andere parameters zoals geheugen- of schijfgebruik kunnen meten. De statistieken zijn verkregen door de opgegeven test uit te voeren seq onder Python-procesbewaking. Hij verzamelde metergegevens
In deze test staat de ST op de eerste plaats met het laagste gemiddelde geheugenverbruik van 8 MB, wat niet verrassend is gezien het feit dat het hoofdidee van het ontwerp eenvoud is. mlterm, xterm en rxvt verbruiken iets meer - ongeveer 12 MB. Een ander opmerkelijk resultaat is Alacritty, waarvoor 30 MB nodig is om te kunnen werken. Dan zijn er terminals van de VTE-familie met cijfers van 40 tot 60 MB, wat behoorlijk veel is. Dit verbruik kan worden verklaard door het feit dat deze terminals bibliotheken van een hoger niveau gebruiken, bijvoorbeeld GTK. Konsole komt op de laatste plaats met maar liefst 65 MB geheugengebruik tijdens tests, hoewel dit kan worden gerechtvaardigd door het zeer brede scala aan functies.
Vergeleken met eerdere resultaten van tien jaar geleden begonnen alle programma's merkbaar meer geheugen te verbruiken. Xterm had vroeger 4 MB nodig, maar nu is er al bij het opstarten 15 MB nodig. Er is een vergelijkbare toename in het verbruik voor rxvt, waarvoor nu kant-en-klaar 16 MB nodig is. Xfce Terminal neemt 34 MB in beslag, wat drie keer groter is dan voorheen, maar GNOME Terminal heeft slechts 20 MB nodig. Uiteraard zijn alle eerdere tests uitgevoerd op 32-bits architectuur. Op LCA 2012 Rusty Russell
Ik kan echter niet anders dan het gevoel hebben dat het toewijzen van meer geheugen aan zoiets fundamenteels als de terminal een verspilling van middelen is. Deze programma's zouden de kleinste van de kleinste moeten zijn, zouden op elke “doos” moeten kunnen draaien, zelfs een schoenendoos, als we ooit op het punt komen waarop ze moeten worden uitgerust met Linux-systemen (en je weet dat dat zo zal zijn). ). Maar met deze cijfers zal geheugengebruik in de toekomst een probleem worden in elke omgeving met meerdere terminals, afgezien van enkele van de lichtste en meest beperkte mogelijkheden. Om dit te compenseren hebben GNOME Terminal, Konsole, urxvt, Terminator en Xfce Terminal een Daemon-modus waarmee u meerdere terminals via één enkel proces kunt besturen, waardoor hun geheugengebruik wordt beperkt.
Tijdens mijn tests kwam ik tot een ander onverwacht resultaat met betrekking tot het lezen en schrijven van schijven: ik had verwacht hier helemaal niets te zien, maar het bleek dat sommige terminals de meest omvangrijke gegevens naar schijf schrijven. De VTE-bibliotheek houdt dus feitelijk een scrollbuffer op schijf bij (deze functie
Conclusie
In het eerste deel van het artikel ontdekten we dat op VTE gebaseerde terminals over een goede reeks functies beschikken, maar nu zien we dat dit gepaard gaat met prestatiekosten. Nu is geheugen geen probleem meer, omdat alle VTE-terminals kunnen worden bestuurd via een Daemon-proces, wat hun eetlust beperkt. Oudere systemen met fysieke beperkingen op de hoeveelheid RAM en kernelbuffers hebben echter mogelijk nog steeds eerdere versies van terminals nodig, omdat deze aanzienlijk minder bronnen verbruiken. Hoewel VTE-terminals goed presteerden in doorvoertests (scrolltests), ligt hun weergavelatentie boven de drempel die is ingesteld in de GNOME-gebruikershandleiding. VTE-ontwikkelaars moeten hier waarschijnlijk rekening mee houden. Als we er rekening mee houden dat zelfs voor beginnende Linux-gebruikers het tegenkomen van een terminal onvermijdelijk is, kunnen ze deze gebruiksvriendelijker maken. Voor ervaren nerds kan het overstappen van de standaardterminal zelfs minder vermoeide ogen betekenen en de mogelijkheid om toekomstige werkgerelateerde verwondingen en ziektes als gevolg van lange werksessies te voorkomen. Helaas brengen alleen de oude xterm en mlterm ons naar de magische ping-drempel van 10 milliseconden, wat voor velen onaanvaardbaar is.
Uit benchmarkmetingen bleek ook dat ontwikkelaars door de ontwikkeling van grafische Linux-omgevingen een aantal compromissen moesten sluiten. Sommige gebruikers willen misschien naar gewone vensterbeheerders kijken, omdat deze een aanzienlijke pingreductie bieden. Helaas was het niet mogelijk om de latentie voor Wayland te meten: het Typometer-programma dat ik gebruikte, is gemaakt voor wat Wayland is ontworpen om te voorkomen: het bespioneren van andere vensters. Ik hoop dat Wayland-compositing beter presteert dan X.org, en ik hoop ook dat iemand in de toekomst een manier zal vinden om de latentie in deze omgeving te meten.
Bron: www.habr.com