Kuidas kasutasime WebAssemblyt veebirakenduse 20-kordseks kiirendamiseks
Selles artiklis käsitletakse brauserirakenduse kiirendamise juhtumit, asendades JavaScripti arvutused WebAssemblyga.
WebAssembly - mis see on?
Lühidalt öeldes on see pinupõhise virtuaalmasina binaarne käsuvorming. Wasmi (lühike nimi) nimetatakse sageli programmeerimiskeeleks, kuid see pole nii. Käskude vorming käivitatakse brauseris koos JavaScriptiga.
On oluline, et WebAssemblyt saaks hankida, kompileerides allikaid sellistes keeltes nagu C/C++, Rust, Go. Siin kasutatakse statistilist tippimist ja nn lamemälu mudelit. Kood, nagu eespool mainitud, salvestatakse kompaktses binaarvormingus, mis muudab selle peaaegu sama kiireks kui rakenduse käivitamine käsurealt kasutades. Need võimalused on toonud kaasa WebAssembly populaarsuse kasvu.
Tuletame meelde:kõigile "Habr" lugejatele - allahindlus 10 000 rubla, kui registreerute mis tahes Skillboxi kursusele, kasutades sooduskoodi "Habr".
Praegu kasutatakse Wasmi paljudes rakendustes, alates mängudest nagu Doom 3 kuni veebiportitud rakendusteni, nagu Autocad ja Figma. Wasmi kasutatakse ka sellistes valdkondades nagu serverita andmetöötlus.
Selles artiklis on näide Wasmi kasutamisest analüütika veebiteenuse kiirendamiseks. Selguse huvides võtsime C-keeles kirjutatud töötava rakenduse, mis on kompileeritud WebAssemblysse. Tulemust kasutatakse JS-i kehvasti toimivate osade asendamiseks.
Rakenduse ümberkujundamine
Näidis kasutab brauseriteenust fastq.bio, mis on mõeldud geneetikutele. Tööriist võimaldab teil hinnata DNA sekveneerimise (dešifreerimise) kvaliteeti.
Siin on näide rakendusest töös:
Protsessi üksikasjadesse ei tasu laskuda, kuna need on mittespetsialistide jaoks üsna keerulised, kuid kokkuvõttes saavad teadlased ülaltoodud infograafiku abil aru saada, kas DNA sekveneerimisprotsess läks tõrgeteta ja millised probleemid tekkisid.
Sellel teenusel on alternatiivid, töölauaprogrammid. Kuid fastq.bio võimaldab teil oma tööd kiirendada, visualiseerides andmeid. Enamikul muudel juhtudel peate suutma töötada käsureaga, kuid kõigil geneetikutel pole vajalikku kogemust.
Kõik toimib lihtsalt. Sisend on tekstifailina esitatud andmed. See fail on loodud spetsiaalsete järjestustööriistade abil. Fail sisaldab DNA järjestuste loendit ja iga nukleotiidi kvaliteediskoori. Failivorming on .fastq, mistõttu sai teenus oma nime.
Rakendamine JavaScriptis
Kasutaja esimene samm fastq.bioga töötamisel on valida sobiv fail. Objekti Fail abil loeb rakendus failist juhusliku valimi andmetest ja töötleb selle partii. JavaScripti ülesanne on siin teha lihtsaid stringoperatsioone ja arvutada mõõdikuid. Üks neist on nukleotiidide A, C, G ja T arv erinevatel DNA fragmentidel.
Pärast vajalike näitajate arvutamist visualiseeritakse need Plotly.js abil ja teenus hakkab töötama uue andmenäidisega. Tükeldamine toimub UX-i kvaliteedi parandamiseks. Kui töötate kõigi andmetega korraga, siis protsess hangub mõneks ajaks, kuna järjestustulemustega failid võtavad sadu gigabaite failiruumi. Teenus võtab 0,5–1 MB suurusi andmetükke ja töötab nendega samm-sammult, luues graafilisi andmeid.
See töötab nii:
Punane ristkülik sisaldab stringi teisendusalgoritmi visualiseerimise saamiseks. See on teenuse kõige arvutusmahukam osa. Tasub proovida asendada see Wasmiga.
WebAssembly testimine
Wasmi kasutamise võimaluse hindamiseks asus projektimeeskond otsima valmislahendusi QC mõõdikute (QC – kvaliteedikontroll) loomiseks fastq-failide põhjal. Otsing viidi läbi C, C++ või Rust keeles kirjutatud tööriistade hulgast, et oleks võimalik kood WebAssemblysse portida. Lisaks ei tohiks tööriist olla "toores"; selleks oli vaja teenust, mida teadlased olid juba testinud.
Sellest tulenevalt tehti valik selle kasuks seqtk. Rakendus on üsna populaarne, see on avatud lähtekoodiga, lähtekeel on C.
Enne Wasmile teisendamist tasub vaadata seqtk kompileerimispõhimõtet töölaua jaoks. Makefile'i andmetel vajate järgmist:
Binaarfaili väljastamise asemel kasutab Emscripten failide genereerimiseks .wasm ja js, mida kasutatakse WebAssemby mooduli käitamiseks.
USE_ZLIB lippu kasutatakse zlib teegi toetamiseks. Teek on levitatud ja WebAssemblysse porditud ning Emscripten kaasab selle projekti.
Emsscriptpteni virtuaalne failisüsteem on aktiveeritud. See POSIX-i sarnane FS, töötab brauseris RAM-is. Lehekülje värskendamisel mälu tühjeneb.
Et mõista, miks on vaja virtuaalset failisüsteemi, tasub võrrelda seda, kuidas te käsurealt seqtk käite, sellega, kuidas käitate kompileeritud WebAssembly moodulit.
# On the command line
$ ./seqtk fqchk data.fastq
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])
Juurdepääs virtuaalsele failisüsteemile on vajalik, et mitte failisisendi asemel stringi seqtk ümber kirjutada. Sellisel juhul kuvatakse andmefragment virtuaalses FS-is failina data.fastq, millel on kutse main() seqtk.
Siin on uus arhitektuur:
Joonis näitab, et brauseri peamise lõime arvutuste asemel Veebitöötajad. See meetod võimaldab teha arvutusi taustalõimes ilma brauseri reageerimisvõimet mõjutamata. WebWorkeri kontroller käivitab Workeri, haldades selle suhtlemist põhilõimega.
Käsk seqtk käivitatakse ühendatud failis Workeri abil. Pärast täitmise lõpetamist annab töötaja tulemuse lubaduse kujul. Kui põhilõime saab sõnumi, kasutatakse tulemust graafikute värskendamiseks. Ja nii edasi mitmes iteratsioonis.
Kuidas on lood WebAssembly jõudlusega?
Toimivuse muutuse hindamiseks kasutas projektimeeskond parameetrit lugemisoperatsioonid sekundis. Interaktiivsete graafikute koostamiseks kuluvat aega ei võeta arvesse, kuna mõlemad rakendused kasutavad JavaScripti.
Kastivalmis lahenduse kasutamisel oli jõudluse kasv üheksakordne.
See on suurepärane tulemus, kuid nagu selgub, on ka võimalus seda optimeerida. Fakt on see, et seqtk ei kasuta suurt hulka QC analüüsi tulemusi, seega saab need kustutada. Kui seda teha, paraneb tulemus võrreldes JS-iga 13 korda.
See saavutati lihtsalt printf () käskude kommenteerimisega.
Kuid see pole veel kõik. Fakt on see, et selles etapis saab fastq.bio analüüsitulemused vastu, kutsudes erinevaid C-funktsioone. Igaüks neist arvutab oma karakteristikute komplekti, nii et iga faili fragmenti loetakse kaks korda.
Selle probleemi lahendamiseks otsustati kaks funktsiooni ühendada üheks. Selle tulemusena kasvas tootlikkus 20 korda.
Väärib märkimist, et sellist silmapaistvat tulemust ei ole alati võimalik saavutada. Mõnel juhul jõudlus langeb, seega tasub iga juhtumit hinnata.
Kokkuvõtteks võib öelda, et Wasm annab küll võimaluse rakenduse jõudlust parandada, kuid seda tuleb targalt kasutada.