Kaip mes panaudojome WebAssembly, kad paspartintume žiniatinklio programą 20 kartų
Šiame straipsnyje aptariamas atvejis, kaip pagreitinti naršyklės taikomąją programą pakeičiant JavaScript skaičiavimus į WebAssembly.
WebAssembly – kas tai?
Trumpai tariant, tai dvejetainis instrukcijų formatas, skirtas kamino pagrindu veikiančiai virtualiai mašinai. Wasm (trumpasis pavadinimas) dažnai vadinamas programavimo kalba, bet taip nėra. Instrukcijos formatas vykdomas naršyklėje kartu su JavaScript.
Svarbu, kad WebAssembly būtų galima gauti sudarant šaltinius tokiomis kalbomis kaip C/C++, Rust, Go. Čia naudojamas statistinis tipavimas ir vadinamasis plokščiosios atminties modelis. Kodas, kaip minėta pirmiau, yra saugomas kompaktišku dvejetainiu formatu, todėl jis beveik toks pat greitas, kaip programos paleidimas naudojant komandinę eilutę. Šios galimybės lėmė WebAssembly populiarumo augimą.
Primename:visiems „Habr“ skaitytojams – 10 000 rublių nuolaida užsiregistravus į bet kurį „Skillbox“ kursą naudojant „Habr“ reklamos kodą.
Šiuo metu „Wasm“ naudojama daugelyje programų, pradedant žaidimais, tokiais kaip „Doom 3“, baigiant žiniatinkliu perkeliamomis programomis, tokiomis kaip „Autocad“ ir „Figma“. Wasm taip pat naudojamas tokiose srityse kaip kompiuterija be serverio.
Šiame straipsnyje pateikiamas Wasm naudojimo pavyzdys, kaip pagreitinti analizės žiniatinklio paslaugą. Aiškumo dėlei paėmėme veikiančią programą, parašytą C kalba, kuri yra sukompiliuota į WebAssembly. Rezultatas bus naudojamas blogo našumo JS skyriams pakeisti.
Programos transformacija
Pavyzdyje bus naudojama „fastq.bio“ naršyklės paslauga, skirta genetikams. Priemonė leidžia įvertinti DNR sekos nustatymo (iššifravimo) kokybę.
Čia yra veikiančios programos pavyzdys:
Neverta gilintis į proceso detales, nes ne specialistams jos yra gana sudėtingos, tačiau trumpai tariant, mokslininkai gali pasinaudoti aukščiau pateikta infografika, kad suprastų, ar DNR sekos nustatymo procesas vyko sklandžiai ir kokios problemos kilo.
Ši paslauga turi alternatyvų, darbalaukio programų. Tačiau fastq.bio leidžia paspartinti darbą vizualizuojant duomenis. Daugeliu kitų atvejų reikia mokėti dirbti su komandine eilute, tačiau ne visi genetikai turi reikiamos patirties.
Viskas veikia paprastai. Įvestis yra duomenys, pateikti tekstinio failo forma. Šis failas generuojamas naudojant specializuotus sekos nustatymo įrankius. Faile yra DNR sekų sąrašas ir kiekvieno nukleotido kokybės balas. Failo formatas yra .fastq, todėl paslauga gavo savo pavadinimą.
Diegimas JavaScript
Pirmasis vartotojo veiksmas dirbant su fastq.bio yra pasirinkti tinkamą failą. Naudodama objektą Failas, programa nuskaito atsitiktinį duomenų pavyzdį iš failo ir apdoroja tą paketą. „JavaScript“ užduotis yra atlikti paprastas eilutės operacijas ir apskaičiuoti metriką. Vienas iš jų yra nukleotidų A, C, G ir T skaičius skirtinguose DNR fragmentuose.
Apskaičiavus reikiamus rodiklius, jie vizualizuojami naudojant Plotly.js ir paslauga pradeda dirbti su nauju duomenų pavyzdžiu. Suskirstymas atliekamas siekiant pagerinti UX kokybę. Jei dirbate su visais duomenimis iš karto, procesas kurį laiką užstos, nes failai su sekos rezultatais užima šimtus gigabaitų failo vietos. Paslauga paima nuo 0,5 iki 1 MB dydžio duomenų gabalus ir su jais dirba žingsnis po žingsnio, kurdama grafinius duomenis.
Tai veikia taip:
Raudoname stačiakampyje yra eilučių transformacijos algoritmas vizualizacijai gauti. Tai yra daugiausiai skaičiavimo reikalaujanti paslaugos dalis. Verta pabandyti jį pakeisti Wasm.
WebAssembly testavimas
Siekdama įvertinti Wasm naudojimo galimybę, projekto komanda pradėjo ieškoti paruoštų sprendimų, kaip sukurti QC metriką (QC – kokybės kontrolę), pagrįstą fastq failais. Paieška buvo atlikta tarp įrankių, parašytų C, C++ arba Rust, kad būtų galima perkelti kodą į WebAssembly. Be to, įrankis neturėtų būti „neapdorotas“, reikalinga paslauga, kurią jau išbandė mokslininkai.
Dėl to buvo pasirinkta nauda seqtk. Programa yra gana populiari, ji yra atvirojo kodo, šaltinio kalba yra C.
Prieš konvertuojant į Wasm, verta pažvelgti į seqtk kompiliavimo principą darbalaukiui. Pagal Makefile, štai ko jums reikia:
Vietoj išvesties į dvejetainį failą, Emscripten naudoja .wasm ir .js failams generuoti, kurie naudojami WebAssemby moduliui paleisti.
USE_ZLIB vėliavėlė naudojama zlib bibliotekai palaikyti. Biblioteka buvo platinama ir perkelta į WebAssembly, o Emscripten įtraukė ją į projektą.
Suaktyvinta virtualioji failų sistema Emscrippten. Tai POSIX tipo FS, veikia RAM naršyklėje. Kai puslapis atnaujinamas, atmintis išvaloma.
Norint suprasti, kodėl reikalinga virtuali failų sistema, verta palyginti, kaip paleidžiate seqtk iš komandinės eilutės su tuo, kaip paleidžiate kompiliuotą WebAssembly modulį.
# On the command line
$ ./seqtk fqchk data.fastq
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])
Būtina gauti prieigą prie virtualios failų sistemos, kad nebūtų perrašoma seqtk eilutės, o ne failo įvesties. Šiuo atveju duomenų fragmentas rodomas kaip data.fastq failas virtualioje FS su iškvietimu į main() seqtk.
Štai nauja architektūra:
Paveikslėlyje parodyta, kad vietoj skaičiavimų pagrindinėje naršyklės gijoje, WebWorkers. Šis metodas leidžia atlikti skaičiavimus fono gijoje, nedarant įtakos naršyklės reagavimui. Na, WebWorker valdiklis paleidžia darbuotoją, valdydamas jo sąveiką su pagrindine gija.
Komanda seqtk paleidžiama naudojant Worker prijungtame faile. Baigęs vykdymą, darbuotojas pateikia rezultatą pažado forma. Kai pranešimą gauna pagrindinė gija, rezultatas naudojamas diagramoms atnaujinti. Ir taip keliomis iteracijomis.
Ką apie „WebAssembly“ našumą?
Siekdama įvertinti našumo pokytį, projekto komanda naudojo skaitymo operacijų per sekundę parametrą. Neatsižvelgiama į laiką, kurio reikia interaktyvių grafikų kūrimui, nes abu diegimai naudoja „JavaScript“.
Naudojant „out-of-the-box“ sprendimą, našumas padidėjo devynis kartus.
Tai puikus rezultatas, tačiau, kaip paaiškėjo, yra galimybė jį optimizuoti. Faktas yra tas, kad seqtk nenaudoja daug QC analizės rezultatų, todėl juos galima ištrinti. Jei tai padarysite, rezultatas pagerės 13 kartų, palyginti su JS.
Tai buvo pasiekta tiesiog komentuojant printf () komandas.
Bet tai dar ne viskas. Faktas yra tas, kad šiame etape fastq.bio gauna analizės rezultatus iškviesdamas skirtingas C funkcijas. Kiekviena iš jų apskaičiuoja savo charakteristikų rinkinį, kad kiekvienas failo fragmentas būtų skaitomas du kartus.
Siekiant išspręsti šią problemą, buvo nuspręsta sujungti dvi funkcijas į vieną. Dėl to produktyvumas išaugo 20 kartų.
Verta paminėti, kad ne visada galima pasiekti tokį puikų rezultatą. Kai kuriais atvejais našumas sumažės, todėl verta įvertinti kiekvieną atvejį.
Apibendrinant galime pasakyti, kad „Wasm“ suteikia galimybę pagerinti programos našumą, tačiau ja naudotis reikia protingai.