Noen få ord fra vårt oversettelsesbyrå: vanligvis streber alle etter å oversette det siste materialet og publikasjonene, og vi er intet unntak. Men terminaler er ikke noe som oppdateres en gang i uken. Derfor har vi oversatt for deg en artikkel av Antoine Beaupré, publisert våren 2018: til tross for sin betydelige "alder" etter moderne standarder, har materialet etter vår mening ikke mistet sin relevans i det hele tatt. I tillegg var dette opprinnelig en serie på to artikler, men vi bestemte oss for å slå dem sammen til ett stort innlegg.
Terminaler har en spesiell plass i datahistorien, men de siste tiårene har de blitt tvunget til å overleve ved siden av kommandolinjen ettersom grafiske grensesnitt blir allestedsnærværende.
Noen terminaler har direkte overraskende sikkerhetshull, pluss at de fleste har et helt annet sett med funksjoner, fra støtte for et fanebasert grensesnitt til skripting. Selv om vi
Her er terminalene jeg har vurdert:
Dette er kanskje ikke de nyeste versjonene, siden jeg var begrenset til stabile bygg i skrivende stund, som jeg var i stand til å rulle ut på Debian 9 eller Fedora 27. Det eneste unntaket er Alacritty. Det er en etterkommer av GPU-akselererte terminaler og er skrevet på et uvanlig og nytt språk for denne oppgaven - Rust. Jeg ekskluderte nettterminaler fra anmeldelsen min (inkludert de på
Unicode-støtte
Jeg startet testene mine med Unicode-støtte. Den første testen av terminalene var å vise Unicode-strengen fra
Som standard bruker xterm den klassiske «faste» fonten, som iht
Disse skjermbildene ble tatt i Fedora 27, da det ga bedre resultater enn Debian 9, der noen eldre versjoner av terminaler (spesielt mlterm) ikke kunne håndtere fonter ordentlig. Heldigvis ble dette fikset i senere versjoner.
Legg nå merke til hvordan linjen vises i xterm. Det viser seg at symbolet Mem og følgende semittiske
"Mange dataprogrammer kan ikke vise toveis tekst på riktig måte. For eksempel består det hebraiske navnet "Sarah" av tegnene sin (ש) (som vises til høyre), deretter resh (ר) og til slutt han (ה) (som skal vises til venstre)."
Mange terminaler mislykkes i denne testen: Alacritty, VTE-avledede Gnome og XFCE terminaler, urxvt, st og xterm viser "Sara" i omvendt rekkefølge, som om vi hadde skrevet navnet som "Aras".
Et annet problem med toveis tekster er at de må justeres på en eller annen måte, spesielt når det gjelder å blande RTL- og LTR-tekster. RTL-skript skal kjøres fra høyre side av terminalvinduet, men hva skal skje for terminaler som har LTR-engelsk som standard? De fleste av dem har ingen spesielle mekanismer og justerer all tekst til venstre (inkludert i Konsole). Unntakene er pterm og mlterm, som følger standardene og høyrejusterer slike linjer.
Innsettingsbeskyttelse
Den neste kritiske funksjonen jeg har identifisert er anti-innsettingsbeskyttelse. Selv om det er allment kjent at staver som:
$ curl http://example.com/ | sh
er push-kommandoer for kjøring av kode, er det få som vet at skjulte kommandoer kan snike seg inn i konsollen når du kopierer og limer inn fra en nettleser, selv etter nøye inspeksjon.
git clone git: //git.kernel.org/pub/scm/utils/kup/kup.git
blir til en slik plage når den limes inn fra Horns nettside inn i terminalen:
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
Hvordan det fungerer? Skadelig kode er inkludert i blokken , som flyttes ut av brukerens visning ved hjelp av CSS.
set enable-bracketed-paste on
Dessverre viser Horns testside også hvordan man kan omgå denne beskyttelsen gjennom selve tekstformateringen og for tidlig ender opp med å bruke bracketed-modus på den. Dette fungerer fordi noen terminaler ikke filtrerer escape-sekvenser riktig før de legger til sine egne. For eksempel, i min klarte jeg aldri å fullføre Konsole-testene selv med riktig konfigurasjon .inputrc fil. Dette betyr at du enkelt kan få systemkonfigurasjonen ødelagt på grunn av en applikasjon som ikke støttes eller et feilkonfigurert skall. Dette er spesielt farlig når du logger på eksterne servere, hvor nøye konfigurasjonsarbeid er mindre vanlig, spesielt hvis du har mange slike eksterne maskiner.
En god løsning på dette problemet er innlimingsbekreftelsesplugin for terminalen urxvt, som ganske enkelt ber om tillatelse til å sette inn tekst som inneholder nye linjer. Jeg har ikke funnet et sikrere alternativ for tekstangrepet beskrevet av Horn.
Faner og profiler
En populær funksjon nå er støtte for et fanebasert grensesnitt, som vi vil definere som ett terminalvindu som inneholder flere terminaler. Denne funksjonen er forskjellig for forskjellige terminaler, og selv om tradisjonelle xterm-terminaler ikke støtter faner i det hele tatt, har mer moderne terminalinkarnasjoner som Xfce Terminal, GNOME Terminal og Konsole denne funksjonen. Urxvt støtter også faner, men bare hvis du bruker en plugin. Men når det gjelder fanestøtte i seg selv, er Terminator den ubestridte lederen: den støtter ikke bare faner, men kan også arrangere terminaler i hvilken som helst rekkefølge (se bildet nedenfor).
En annen funksjon ved Terminator er muligheten til å "gruppere" disse fanene sammen og sende de samme tastetrykkene til flere terminaler samtidig, noe som gir et grovt verktøy for å utføre bulkoperasjoner på flere servere samtidig. En lignende funksjon er også implementert i Konsole. For å bruke denne funksjonen i andre terminaler må du bruke tredjepartsprogramvare som f.eks
Faner fungerer spesielt godt når de er sammenkoblet med profiler: du kan for eksempel ha én fane for e-post, en annen for chat, og så videre. Dette støttes godt av Konsole Terminal og GNOME Terminal. Begge lar hver fane automatisk starte sin egen profil. Terminator støtter også profiler, men jeg kunne ikke finne en måte å automatisk starte visse programmer når du åpner en bestemt fane. Andre terminaler har ikke konseptet "profil" i det hele tatt.
Volanger
Det siste jeg skal dekke i den første delen av denne artikkelen er utseendet til terminalene. For eksempel støtter GNOME, Xfce og urxvt åpenhet, men har nylig droppet støtte for bakgrunnsbilder, noe som tvinger noen brukere til å bytte til terminalen
Noen terminaler analyserer også tekst for URL-mønstre for å gjøre koblinger klikkbare. Dette gjelder alle VTE-avledede terminaler, mens urxvt krever en spesiell plugin som vil transformere URL-er ved et klikk eller ved å bruke en hurtigtast. Andre terminaler jeg har testet visningsadresser på andre måter.
Til slutt, en ny trend innen terminaler er valgmuligheten til rullebufferen. For eksempel har st ingen rullebuffer; det antas at brukeren vil bruke en terminal multiplekser som tmux og
Alacritty mangler også backscroll-buffere, men
delsummer
I den andre delen av materialet (i originalen var dette to forskjellige artikler - ca. kjørefelt) vil vi sammenligne ytelse, minnebruk og ventetid. Men vi kan allerede nå se at noen av de aktuelle terminalene har alvorlige mangler. For eksempel kan brukere som regelmessig jobber med RTL-skript vurdere mlterm og pterm, da de er flinkere til å håndtere lignende oppgaver enn andre. Konsole presterte også bra. Brukere som ikke jobber med RTL-skript kan velge noe annet.
Når det gjelder beskyttelse mot ondsinnet kodeinnsetting, skiller urxvt seg ut på grunn av sin spesielle implementering av beskyttelse mot denne typen angrep, noe som virker definitivt praktisk for meg. For de som leter etter noen bjeller og fløyter, er Konsole verdt en titt. Til slutt er det verdt å merke seg at VTE er en utmerket base for terminaler, som garanterer fargestøtte, URL-gjenkjenning og så videre. Ved første øyekast kan standardterminalen som følger med favorittmiljøet ditt oppfylle alle kravene, men la oss la dette spørsmålet stå åpent til vi forstår ytelsen.
La oss fortsette samtalen
Generelt kan ytelsen til terminaler i seg selv virke som et langsøkt problem, men som det viser seg, viser noen av dem overraskende høy latenstid for programvare av en så grunnleggende type. Deretter vil vi også se på det som tradisjonelt kalles "hastighet" (faktisk er dette rullehastigheten) og minneforbruket til terminalen (med forbehold om at dette ikke er like kritisk i dag som det var for tiår siden).
Forsinkelse
Etter en grundig studie av terminalytelse, kom jeg til den konklusjonen at den viktigste parameteren i denne forbindelse er latensen (ping). I artikkelen hans
Men hva er latens, og hvorfor er det så viktig? I artikkelen sin definerte Fatin det som "forsinkelsen mellom å trykke på en tast og den tilsvarende skjermoppdateringen" og siterte
Fatin forklarer at denne pingen har dypere konsekvenser enn bare tilfredsstillelse: "skrivingen blir tregere, flere feil oppstår, og øye- og muskelspenningene øker." Med andre ord kan en stor forsinkelse føre til skrivefeil og også lavere kodekvalitet, da det fører til ytterligere kognitiv belastning på hjernen. Men det som er verre er at ping «øker belastning på øyne og muskler», noe som ser ut til å antyde
Noen av disse effektene har vært kjent i lang tid, og resultatene
Fatin gjennomførte sine tester på tekstredigerere; han laget et bærbart instrument kalt
Her er resultatene av målingene mine, samt noen av Fatins resultater, for å vise at eksperimentet mitt stemmer overens med testene hans:
Det første som slo meg var den bedre responstiden til eldre programmer som xterm og mlterm. Med dårligst registerlatens (2,4 ms) presterte de bedre enn den raskeste moderne terminalen (10,6 ms for st). Ingen moderne terminal faller under terskelen på 10 millisekunder. Spesielt klarer ikke Alacritty å oppfylle kravet om "raskeste terminalemulator som er tilgjengelig", selv om poengsummen har forbedret seg siden den første gjennomgangen i 2017. Faktisk forfatterne av prosjektet
Det kan imidlertid hende at forskjellene ikke er merkbare for øyet. Som Fatin forklarer, "du trenger ikke å være klar over forsinkelsen for at det skal ha en effekt på deg." Fatin advarer også om standardavvik: "enhver forstyrrelse i latens (jitter) skaper ekstra stress på grunn av deres uforutsigbarhet."
Grafen over er tatt på ren Debian 9 (strekk) med
Rullehastighet
Neste test er en tradisjonell "hastighet" eller "båndbredde"-test, som måler hvor raskt terminalen kan rulle en side mens den viser store mengder tekst på skjermen. Mekanikken i testen varierer; den opprinnelige testen var å ganske enkelt generere den samme tekststrengen ved å bruke seq-kommandoen. Andre tester inkluderer Thomas E. Dickeys (xterm vedlikeholder) test, som gjentatte ganger
Her ser vi rxvt og st trekke foran konkurrentene, etterfulgt av den mye nyere Alacritty, som er designet med fokus på ytelse. Neste er Xfce (VTE-familie) og Konsole, som er nesten dobbelt så raske. Sist er xterm, som er fem ganger langsommere enn rxvt. Under testen bølget xterm også mye, noe som gjorde det vanskelig å se å sende tekst selv om det var samme linje. Konsole var rask, men det var vanskelig til tider: skjermen fryser fra tid til annen, viser delvis tekst eller viser den ikke i det hele tatt. Andre terminaler viste strenger tydelig, inkludert st, Alacritty og rxvt.
Dickey forklarer at ytelsesforskjellene skyldes utformingen av rullebuffere i forskjellige terminaler. Spesielt anklager han rxvt og andre terminaler for å "ikke følge de generelle reglene":
"I motsetning til xterm, forsøkte ikke rxvt å vise alle oppdateringer. Hvis den faller bak, vil den nekte noen oppdateringer å ta igjen. Dette hadde større innvirkning på den tilsynelatende rullehastigheten enn på organiseringen av internminnet. En ulempe var at ASCII-animasjonen var noe upresis."
For å fikse denne oppfattede tregheten, foreslår Dickey å bruke ressursen
Ressursforbruk
Uansett om det er fornuftig å vurdere rullehastighet som en ytelsesmåling, lar denne testen oss simulere belastningen på terminalene, som igjen lar oss måle andre parametere som minne eller diskbruk. Beregningene ble oppnådd ved å kjøre den spesifiserte testen seq under Python-prosessovervåking. Han samlet målerdata
I denne testen tar ST førsteplassen med det laveste gjennomsnittlige minneforbruket på 8 MB, noe som ikke er overraskende med tanke på at hovedideen med designet er enkelhet. mlterm, xterm og rxvt bruker litt mer - ca 12 MB. Et annet bemerkelsesverdig resultat er Alacritty, som krever 30 MB for å kjøre. Så er det terminaler i VTE-familien med tall fra 40 til 60 MB, som er ganske mye. Dette forbruket kan forklares med det faktum at disse terminalene bruker biblioteker på høyere nivå, for eksempel GTK. Konsole kommer sist med hele 65 MB minneforbruk under tester, selv om dette kan rettferdiggjøres av dets svært brede spekter av funksjoner.
Sammenlignet med tidligere resultater oppnådd for ti år siden, begynte alle programmer å bruke merkbart mer minne. Xterm pleide å kreve 4 MB, men nå krever det 15 MB bare ved oppstart. Det er en tilsvarende økning i forbruket for rxvt, som nå krever 16 MB ut av esken. Xfce Terminal tar opp 34 MB, som er tre ganger større enn før, men GNOME Terminal krever bare 20 MB. Selvfølgelig ble alle tidligere tester utført på 32-bits arkitektur. På LCA 2012 Rusty Russell
Jeg kan imidlertid ikke unngå å føle at det å tildele mer minne til noe så grunnleggende som terminalen er bortkastet ressurser. Disse programmene bør være de minste av de minste, bør kunne kjøres på hvilken som helst "boks", til og med en skoeske, hvis vi noen gang kommer til det punktet hvor de må utstyres med Linux-systemer (og du vet at det vil være slik ). Men med disse tallene vil minnebruk bli et problem i fremtiden i ethvert miljø som kjører flere terminaler bortsett fra noen få av de letteste og mest begrensede mulighetene. For å kompensere for dette har GNOME Terminal, Konsole, urxvt, Terminator og Xfce Terminal en Daemon-modus som lar deg kontrollere flere terminaler gjennom en enkelt prosess, noe som begrenser minneforbruket deres.
Under testene mine kom jeg til et annet uventet resultat angående disk lese-skriving: Jeg forventet ikke å se noe i det hele tatt her, men det viste seg at noen terminaler skriver de mest omfangsrike dataene til disken. Så VTE-biblioteket holder faktisk en rullebuffer på disken (denne funksjonen
Konklusjon
I den første delen av artikkelen fant vi ut at VTE-baserte terminaler har et godt sett med funksjoner, men nå ser vi at dette kommer med noen ytelseskostnader. Nå er ikke minne et problem fordi alle VTE-terminaler kan kontrolleres gjennom en Daemon-prosess, som begrenser appetitten deres. Imidlertid kan eldre systemer som har fysiske begrensninger på mengden RAM og kjernebuffere fortsatt trenge tidligere versjoner av terminaler, siden de bruker betydelig færre ressurser. Selv om VTE-terminaler presterte bra i gjennomstrømnings- (rulling)-tester, er visningsforsinkelsen deres over terskelen angitt i GNOME-brukerveiledningen. VTE-utviklere bør nok ta hensyn til dette. Hvis vi tar i betraktning at selv for nybegynnere av Linux-brukere å møte en terminal er uunngåelig, kan de gjøre den mer brukervennlig. For erfarne nerder kan bytte fra standardterminalen til og med bety mindre belastning på øynene og muligheten til å unngå fremtidige arbeidsrelaterte skader og sykdommer på grunn av lange arbeidsøkter. Dessverre er det bare de gamle xterm og mlterm som bringer oss til den magiske ping-terskelen på 10 millisekunder, noe som er uakseptabelt for mange.
Benchmark-målinger viste også at på grunn av utviklingen av Linux grafiske miljøer, måtte utviklere inngå en rekke kompromisser. Noen brukere vil kanskje se på vanlige vindusbehandlere da de gir betydelig ping-reduksjon. Dessverre var det ikke mulig å måle latens for Wayland: Typometer-programmet jeg brukte ble laget for det Wayland er designet for å forhindre: spionere på andre vinduer. Jeg håper at Wayland compositing yter bedre enn X.org, og jeg håper også at noen i fremtiden vil finne en måte å måle latens i dette miljøet.
Kilde: www.habr.com