Kā mēs izmantojām WebAssembly, lai 20 reizes paātrinātu tīmekļa lietojumprogrammu

Kā mēs izmantojām WebAssembly, lai 20 reizes paātrinātu tīmekļa lietojumprogrammu

Šajā rakstā ir apskatīts gadījums, kā paātrināt pārlūkprogrammas lietojumprogrammu, aizstājot JavaScript aprēķinus ar WebAssembly.

WebAssembly - kas tas ir?

ÄŖsāk sakot, Å”is ir binārais instrukciju formāts uz steku balstÄ«tai virtuālajai maŔīnai. Wasm (Ä«sais nosaukums) bieži sauc par programmÄ“Å”anas valodu, bet tā nav. Instrukcijas formāts tiek izpildÄ«ts pārlÅ«kprogrammā kopā ar JavaScript.

Ir svarÄ«gi, lai WebAssembly varētu iegÅ«t, apkopojot avotus tādās valodās kā C/C++, Rust, Go. Å eit tiek izmantota statistiskā maŔīnrakstÄ«Å”ana un tā sauktais plakanās atmiņas modelis. Kods, kā minēts iepriekÅ”, tiek saglabāts kompaktā binārā formātā, padarot to gandrÄ«z tikpat ātru kā lietojumprogrammas palaiÅ”anu, izmantojot komandrindu. Å Ä«s iespējas ir veicinājuÅ”as WebAssembly popularitātes pieaugumu.

Atgādinām: visiem "Habr" lasītājiem - atlaide 10 000 rubļu, reģistrējoties jebkurā Skillbox kursā, izmantojot "Habr" reklāmas kodu.

Skillbox iesaka: Praktiskais kurss "Mobile Developer PRO".

PaÅ”laik Wasm tiek izmantots daudzās lietojumprogrammās, sākot no spēlēm, piemēram, Doom 3, lÄ«dz tÄ«meklÄ« pārnēsātām lietojumprogrammām, piemēram, Autocad un Figma. Wasm tiek izmantots arÄ« tādās jomās kā skaitļoÅ”ana bez serveriem.

Å ajā rakstā ir sniegts piemērs Wasm izmantoÅ”anai, lai paātrinātu analÄ«tikas tÄ«mekļa pakalpojumu. SkaidrÄ«bas labad mēs paņēmām darba lietojumprogrammu, kas rakstÄ«ta C valodā, kas ir apkopota WebAssembly. Rezultāts tiks izmantots, lai aizstātu JS sadaļas ar zemu veiktspēju.

Lietojumprogrammu transformācija

Piemērā tiks izmantots pārlÅ«kprogrammas serviss fastq.bio, kas paredzēts Ä£enētiÄ·iem. RÄ«ks ļauj novērtēt DNS sekvencÄ“Å”anas (atÅ”ifrÄ“Å”anas) kvalitāti.

Šeit ir lietojumprogrammas darbības piemērs:

Kā mēs izmantojām WebAssembly, lai 20 reizes paātrinātu tīmekļa lietojumprogrammu

Procesa detaļās nav vērts iedziļināties, jo tās ir diezgan sarežģītas nespeciālistiem, taču Ä«si sakot, zinātnieki var izmantot iepriekÅ” minēto infografiku, lai saprastu, vai DNS sekvencÄ“Å”anas process noritēja gludi un kādas problēmas radās.

Šim pakalpojumam ir alternatīvas, darbvirsmas programmas. Taču fastq.bio ļauj paātrināt darbu, vizualizējot datus. Vairumā citu gadījumu jums ir jāspēj strādāt ar komandrindu, taču ne visiem ģenētiķiem ir vajadzīgā pieredze.

Viss darbojas vienkārÅ”i. Ievade ir dati, kas tiek parādÄ«ti teksta faila formā. Å o failu Ä£enerē specializēti secÄ«bas rÄ«ki. Failā ir DNS sekvenču saraksts un katra nukleotÄ«da kvalitātes rādÄ«tājs. Faila formāts ir .fastq, tāpēc pakalpojums ieguva savu nosaukumu.

IevieŔana JavaScript

Pirmais lietotāja solis, strādājot ar fastq.bio, ir izvēlēties atbilstoÅ”o failu. Izmantojot objektu Fails, lietojumprogramma nolasa nejauÅ”u datu paraugu no faila un apstrādā Å”o partiju. JavaScript uzdevums Å”eit ir veikt vienkārÅ”as virkņu darbÄ«bas un aprēķināt metriku. Viens no tiem ir nukleotÄ«du A, C, G un T skaits uz dažādiem DNS fragmentiem.

Pēc nepiecieÅ”amo rādÄ«tāju aprēķināŔanas tie tiek vizualizēti, izmantojot Plotly.js, un pakalpojums sāk strādāt ar jaunu datu paraugu. SadalÄ«Å”ana tiek veikta, lai uzlabotu UX kvalitāti. Ja strādājat ar visiem datiem vienlaikus, process uz kādu laiku iesaldēsies, jo faili ar secÄ«bas rezultātiem aizņem simtiem gigabaitu faila vietas. Pakalpojums ņem datu gabalus, kuru izmērs ir no 0,5 lÄ«dz 1 MB, un strādā ar tiem soli pa solim, veidojot grafiskos datus.

Tas darbojas Ŕādi:

Kā mēs izmantojām WebAssembly, lai 20 reizes paātrinātu tīmekļa lietojumprogrammu

Sarkanajā taisnstÅ«rÄ« ir virknes transformācijas algoritms vizualizācijas iegÅ«Å”anai. Å Ä« ir skaitļoÅ”anas ziņā ietilpÄ«gākā pakalpojuma daļa. Ir vērts mēģināt to aizstāt ar Wasm.

WebAssembly testēŔana

Lai novērtētu Wasm izmantoÅ”anas iespējas, projekta komanda sāka meklēt gatavus risinājumus QC metrikas (QC - kvalitātes kontrole) izveidei, pamatojoties uz fastq failiem. MeklÄ“Å”ana tika veikta starp rÄ«kiem, kas rakstÄ«ti C, C++ vai Rust valodā, lai bÅ«tu iespējams pārsÅ«tÄ«t kodu uz WebAssembly. Turklāt instrumentam nevajadzētu bÅ«t ā€œneapstrādātamā€, bija nepiecieÅ”ams zinātnieku jau pārbaudÄ«ts pakalpojums.

Rezultātā izvēle tika izdarīta par labu seqtk. Lietojumprogramma ir diezgan populāra, tā ir atvērtā pirmkoda, avota valoda ir C.

Pirms konvertÄ“Å”anas uz Wasm, ir vērts aplÅ«kot seqtk kompilācijas principu darbvirsmai. Saskaņā ar Makefile, lÅ«k, kas jums nepiecieÅ”ams:

# Compile to binary
$ gcc seqtk.c 
   -o seqtk 
   -O2 
   -lm 
   -lz

Principā seqtk var kompilēt, izmantojot Emscripten. Ja tā nav, mēs iztiekam. Docker attēls.

$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26

Ja vēlaties Jūs varat to salikt pats, bet tas prasa laiku.

Konteinerā varat viegli izmantot emcc kā alternatīvu gcc:

# Compile to WebAssembly
$ emcc seqtk.c 
    -o seqtk.js 
    -O2 
    -lm 
    -s USE_ZLIB=1 
    -s FORCE_FILESYSTEM=1

Minimālās izmaiņas:

Tā vietā, lai izvadÄ«tu binārā failā, Emscripten izmanto .wasm un .js, lai Ä£enerētu failus, kas tiek izmantoti WebAssemby moduļa palaiÅ”anai.

USE_ZLIB karodziņŔ tiek izmantots, lai atbalstÄ«tu zlib bibliotēku. Bibliotēka ir izplatÄ«ta un pārnesta uz WebAssembly, un Emscripten to iekļauj projektā.

Emscrippten virtuālā failu sistēma ir aktivizēta. Šis POSIX līdzīga FS, kas darbojas pārlūkprogrammas RAM. Kad lapa tiek atsvaidzināta, atmiņa tiek notīrīta.

Lai saprastu, kāpēc ir nepiecieÅ”ama virtuālā failu sistēma, ir vērts salÄ«dzināt veidu, kā palaižat seqtk no komandrindas ar veidu, kā palaižat kompilētu WebAssembly moduli.

# On the command line
$ ./seqtk fqchk data.fastq
 
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])

Piekļuve virtuālajai failu sistēmai ir nepiecieÅ”ama, lai nepārrakstÄ«tu seqtk virknei, nevis faila ievadei. Å ajā gadÄ«jumā datu fragments tiek parādÄ«ts kā data.fastq fails virtuālajā FS ar izsaukumu uz main() seqtk.

Lūk, jaunā arhitektūra:

Kā mēs izmantojām WebAssembly, lai 20 reizes paātrinātu tīmekļa lietojumprogrammu

Attēlā parādīts, ka aprēķinu vietā galvenajā pārlūkprogrammas pavedienā Web Workers. Šī metode ļauj veikt aprēķinus fona pavedienā, neietekmējot pārlūkprogrammas reakciju. WebWorker kontrolieris palaiž Worker, pārvaldot tā mijiedarbību ar galveno pavedienu.

Komanda seqtk tiek palaista, izmantojot Worker uzstādÄ«tajā failā. Pēc izpildes pabeigÅ”anas Darbinieks uzrāda rezultātu solÄ«juma veidā. Kad galvenais pavediens saņem ziņojumu, rezultāts tiek izmantots, lai atjauninātu grafikus. Un tā tālāk vairākās iterācijās.

Kā ar WebAssembly veiktspēju?

Lai novērtētu veiktspējas izmaiņas, projekta komanda izmantoja parametru nolasÄ«Å”anas darbÄ«bas sekundē. InteraktÄ«vo grafiku izveidei nepiecieÅ”amais laiks netiek ņemts vērā, jo abās implementācijās tiek izmantots JavaScript.

Izmantojot gatavu risinājumu, veiktspējas pieaugums bija deviņas reizes.

Kā mēs izmantojām WebAssembly, lai 20 reizes paātrinātu tīmekļa lietojumprogrammu

Tas ir lielisks rezultāts, taču, kā izrādās, ir iespēja arī to optimizēt. Fakts ir tāds, ka seqtk neizmanto lielu skaitu QC analīzes rezultātu, tāpēc tos var izdzēst. Ja jūs to darāt, rezultāts uzlabojas 13 reizes, salīdzinot ar JS.

Kā mēs izmantojām WebAssembly, lai 20 reizes paātrinātu tīmekļa lietojumprogrammu

Tas tika panākts, vienkārÅ”i komentējot printf () komandas.

Bet tas vēl nav viss. Fakts ir tāds, ka Å”ajā posmā fastq.bio saņem analÄ«zes rezultātus, izsaucot dažādas C funkcijas. Katra no tām aprēķina savu raksturlielumu kopu, lai katrs faila fragments tiktu nolasÄ«ts divreiz.

Lai apietu Å”o problēmu, tika nolemts apvienot divas funkcijas vienā. Rezultātā produktivitāte pieauga 20 reizes.

Kā mēs izmantojām WebAssembly, lai 20 reizes paātrinātu tīmekļa lietojumprogrammu

Ir vērts atzīmēt, ka tik izcilu rezultātu ne vienmēr var sasniegt. Dažos gadījumos veiktspēja samazināsies, tāpēc ir vērts izvērtēt katru gadījumu.

Noslēgumā mēs varam teikt, ka Wasm patieŔām sniedz iespēju uzlabot lietojumprogrammu veiktspēju, taču jums tas ir jāizmanto saprātÄ«gi.

Skillbox iesaka:

Avots: www.habr.com

Pievieno komentāru