Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel

Fl-ekosistema PHP bħalissa hemm żewġ konnetturi biex jaħdmu mas-server Tarantool - din hija l-estensjoni uffiċjali tal-PECL tarantool/tarantool-php, miktuba f'Ċ, u tarantool-php/klijent, miktuba bil-PHP. Jien l-awtur ta’ dan tal-aħħar.

F'dan l-artikolu, nixtieq naqsam ir-riżultati tal-ittestjar tal-prestazzjoni taż-żewġ libreriji u nuri kif, b'bidliet minimi fil-kodiċi, tista 'tikseb żieda fil-prestazzjoni ta' 3-5 (fuq testijiet sintetiċi!).

X'se nittestjaw?

Aħna ser nittestjaw dawk imsemmija hawn fuq sinkroniku konnetturi li jaħdmu b'mod asinkroniku, b'mod parallel, u b'mod asinkroniku-parallel. 🙂 Aħna wkoll ma rridux imissu l-kodiċi tal-konnetturi nfushom. Bħalissa hemm diversi estensjonijiet disponibbli biex tikseb dak li trid:

  • Swoole ― qafas asinkronu ta' prestazzjoni għolja għall-PHP. Użat minn ġganti tal-Internet bħal Alibaba u Baidu. Mill-verżjoni 4.1.0 deher metodu maġiku SwooleRuntime::enableCoroutine(), li jippermettilek "tikkonverti libreriji tan-netwerk PHP sinkroniċi għal dawk mhux sinkroniċi b'linja waħda ta 'kodiċi."
  • Async kien sa ftit ilu estensjoni promettenti ħafna għal xogħol asinkroniku fil-PHP. Għaliex sa ftit ilu? Sfortunatament, għal raġuni mhux magħrufa għalija, l-awtur ħassar ir-repożitorju u d-destin futur tal-proġett mhuwiex ċar. Ikolli nużaha a mill-frieket. Bħal Swoole, din l-estensjoni tippermettilek li faċilment iddawwar il-qliezet tiegħek b'daqqa tal-polz biex tippermetti asinkronija billi tissostitwixxi l-implimentazzjoni standard tal-flussi TCP u TLS bil-verżjonijiet asinkroniċi tagħhom. Dan isir permezz tal-għażla "async.tcp = 1".
  • Parallel ― estensjoni pjuttost ġdida mill-magħruf Joe Watkins, awtur ta’ libreriji bħal phpdbg, apcu, pthreads, pcov, uopz. L-estensjoni tipprovdi API għal multithreading fil-PHP u hija pożizzjonata bħala sostitut għal pthreads. Limitazzjoni sinifikanti tal-librerija hija li taħdem biss bil-verżjoni ZTS (Zend Thread Safe) tal-PHP.

Kif se nittestjaw?

Ejja nniedu istanza ta' Tarantool b'logging bil-miktub bil-quddiem diżattivat (wal_mode = xejn) u żieda fil-buffer tan-netwerk (readhead = 1 * 1024 * 1024). L-ewwel għażla telimina x-xogħol mad-diska, it-tieni se tagħmilha possibbli li taqra aktar talbiet mill-buffer tas-sistema operattiva u b'hekk timminimizza n-numru ta 'sejħiet tas-sistema.

Għal benchmarks li jaħdmu bid-dejta (inserzjoni, tħassir, qari, eċċ.), qabel ma jinbeda l-benchmark, se jinħoloq (mill-ġdid) spazju memtx, li fih il-valuri tal-indiċi primarji jinħolqu minn ġeneratur ta’ valuri interi ordnati (sekwenza).
L-ispazju DDL jidher bħal dan:

space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})
space:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})
space:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})

Jekk meħtieġ, qabel ma titħaddem il-benchmark, l-ispazju jimtela b'10,000 tuple tal-formola

{id, "tuplе_<id>"}

Tuples huma aċċessati bl-użu ta 'valur ewlieni każwali.

Il-punt ta 'referenza innifsu huwa talba waħda lis-server, li tiġi esegwita 10,000 darba (rivoluzzjonijiet), li, min-naħa tagħhom, huma eżegwiti f'iterazzjonijiet. L-iterazzjonijiet huma ripetuti sakemm id-devjazzjonijiet kollha tal-ħin bejn 5 iterazzjonijiet ikunu fi żball aċċettabbli ta '3%*. Wara dan, jittieħed ir-riżultat medju. Hemm pawża ta' sekonda bejn l-iterazzjonijiet biex ma tħallix li l-proċessur jitrażżan. Il-kollettur taż-żibel ta 'Lua huwa diżattivat qabel kull iterazzjoni u huwa sfurzat jibda wara li jitlesta. Il-proċess PHP jitnieda biss bl-estensjonijiet meħtieġa għall-benchmark, bil-buffering tal-output attivat u l-kollettur taż-żibel diżattivat.

* In-numru ta 'revoluzzjonijiet, iterazzjonijiet u limitu ta' żball jistgħu jinbidlu fis-settings tal-benchmark.

Ambjent tat-test

Ir-riżultati ppubblikati hawn taħt saru fuq MacBookPro (2015), sistema operattiva - Fedora 30 (verżjoni tal-kernel 5.3.8-200.fc30.x86_64). Tarantool tnieda fid-docker bil-parametru "--network host".

Verżjonijiet tal-pakkett:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, ibni a872fc2f86
PHP: 7.3.11 (cli) (mibnija: Ottubru 22 2019 08:11:04)
tarantool/klijent: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ garża għal 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* Sfortunatament, il-konnettur uffiċjali ma jaħdimx mal-verżjoni PHP> 7.2. Biex niġbor u tħaddem l-estensjoni fuq PHP 7.3, kelli nuża garża.

Sejbiet

Modalità sinkronika

Il-protokoll Tarantool juża format binarju MessagePack biex jiġu serialize messaġġi. Fil-konnettur PECL, is-serialization hija moħbija fil-fond fil-fond tal-librerija u taffettwa l-proċess ta 'kodifikazzjoni mill-kodiċi tal-userland ma jidhirx possibbli. Konnettur PHP pur, għall-kuntrarju, jipprovdi l-abbiltà li tippersonalizza l-proċess ta 'kodifikazzjoni billi testendi l-encoder standard jew billi tuża l-implimentazzjoni tiegħek stess. Hemm żewġ encoders disponibbli barra mill-kaxxa, wieħed huwa bbażat fuq msgpack/msgpack-php (estensjoni uffiċjali MessagePack PECL), l-oħra hija mixgħula rybakit/msgpack (f'PHP pur).

Qabel ma nqabblu l-konnetturi, se nkejlu l-prestazzjoni tal-encoders MessagePack għall-konnettur PHP u f'testijiet ulterjuri se nużaw dak li juri l-aħjar riżultat:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Għalkemm il-verżjoni PHP (Pure) hija inferjuri għall-estensjoni PECL fil-veloċità, fi proġetti reali xorta nirrakkomanda li tużaha rybakit/msgpack, għaliex fl-estensjoni uffiċjali MessagePack l-ispeċifikazzjoni tal-format hija implimentata biss parzjalment (per eżempju, m'hemm l-ebda appoġġ għal tipi ta 'dejta tad-dwana, li mingħajrhom ma tkunx tista' tuża Decimal - tip ta 'dejta ġdid introdott f'Tarantool 2.3) u għandu numru ta’ oħrajn problemi (inklużi kwistjonijiet ta' kompatibilità ma' PHP 7.4). Ukoll, b'mod ġenerali, il-proġett jidher abbandunat.

Allura, ejja nkejlu l-prestazzjoni tal-konnetturi fil-modalità sinkronika:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Kif jidher mill-graff, il-konnettur PECL (Tarantool) juri prestazzjoni aħjar meta mqabbel mal-konnettur PHP (Klijent). Iżda dan mhux sorprendenti, peress li dan tal-aħħar, minbarra li jiġi implimentat b’lingwa aktar bil-mod, fil-fatt jagħmel aktar xogħol: ma’ kull sejħa jinħoloq oġġett ġdid. Talba и rispons (fil-każ ta' Agħżel - ukoll Kriterji, u fil-każ ta’ Aġġornament/Upsert ― operazzjonijiet), entitajiet separati konnessjoni, Min jippakkja и Handler huma wkoll iżidu overhead. Ovvjament, il-flessibbiltà għandha prezz. Madankollu, b'mod ġenerali, l-interpretu PHP juri prestazzjoni tajba, għalkemm hemm differenza, hija insinifikanti u, forsi, se tkun saħansitra inqas meta tuża preloading f'PHP 7.4, biex ma nsemmux JIT f'PHP 8.

Ejja nimxu fuq. Tarantool 2.0 żied l-appoġġ għall-SQL. Ejja nippruvaw inwettqu l-operazzjonijiet Agħżel, Daħħal, Aġġorna u Ħassar billi tuża l-protokoll SQL u nqabblu r-riżultati mal-ekwivalenti noSQL (binarji):

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Ir-riżultati SQL mhumiex impressjonanti ħafna (ħalluni nfakkarkom li għadna qed nittestjaw il-mod sinkroniku). Madankollu, ma nkunx niddejjaq dwar dan qabel iż-żmien; L-appoġġ SQL għadu taħt żvilupp attiv (relattivament reċentement, pereżempju, ġie miżjud appoġġ dikjarazzjonijiet ippreparati) u, skont il-lista kwistjonijiet, il-magna SQL se tgħaddi minn numru ta 'ottimizzazzjonijiet fil-futur.

Asinkroniku

Ukoll, issa ejja naraw kif l-estensjoni Async tista 'tgħinna ntejbu r-riżultati ta' hawn fuq. Biex tikteb programmi asinkroniċi, l-estensjoni tipprovdi API bbażata fuq coroutines, li se nużaw. Niskopru empirikament li n-numru ottimali ta 'coroutines għall-ambjent tagħna huwa 25:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
"Frex" 10,000 operazzjoni fuq 25 coroutine u ara x'jiġri:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
In-numru ta 'operazzjonijiet kull sekonda żdied b'aktar minn 3 darbiet għal tarantool-php/klijent!

Sfortunatament, il-konnettur PECL ma bedax b'ext-async.

Xi ngħidu dwar SQL?

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Kif tistgħu taraw, fil-modalità asinkronika d-differenza bejn il-protokoll binarju u l-SQL saret fil-marġni ta 'żball.

Swoole

Għal darb'oħra nsibu l-aħjar numru ta' coroutines, din id-darba għal Swoole:
Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Ejja nieqfu f'25. Ejja nirrepetu l-istess trick bħall-estensjoni Async - iqassam 10,000 operazzjoni bejn 25 coroutines. Barra minn hekk, se nżidu test ieħor li fih se naqsmu x-xogħol kollu f'2 żewġ proċessi (jiġifieri, kull proċess se jwettaq 5,000 operazzjoni f'25 coroutines). Proċessi se jinħolqu bl-użu SwooleProcess.

Riżultati:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Swole juri riżultat kemmxejn aktar baxx meta mqabbel ma 'Async meta jitmexxa fi proċess wieħed, iżda b'2 proċessi l-istampa tinbidel b'mod drammatiku (in-numru 2 ma ntgħażilx b'kumbinazzjoni; fuq il-magna tiegħi, kienu 2 proċessi li wrew l-aħjar riżultat).

Mill-mod, l-estensjoni Async għandha wkoll API biex taħdem ma 'proċessi, iżda hemmhekk ma ndunajt l-ebda differenza mit-tmexxija ta' benchmarks fi proċess wieħed jew aktar (huwa possibbli li nħawwad xi mkien).

SQL vs protokoll binarju:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Bħal Async, id-differenza bejn l-operazzjonijiet binarji u SQL hija eliminata fil-modalità asinkronika.

Parallel

Peress li l-estensjoni Parallel mhix dwar coroutines, iżda dwar ħjut, ejja nkejlu l-aħjar numru ta 'ħjut paralleli:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Huwa ugwali għal 16 fuq il-magna tiegħi. Ejja nħaddmu benchmarks tal-konnetturi fuq 16-il ħajt parallel:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Kif tistgħu taraw, ir-riżultat huwa saħansitra aħjar milli b'estensjonijiet asinkroniċi (mingħajr ma jingħaddu Swoole li jaħdem fuq 2 proċessi). Innota li għall-konnettur PECL, l-operazzjonijiet Aġġornament u Upsert huma vojta. Dan huwa minħabba l-fatt li dawn l-operazzjonijiet fallew bi żball - ma nafx jekk kienx tort ta 'ext-parallel, ext-tarantool, jew it-tnejn.

Issa ejja nqabblu l-prestazzjoni tal-SQL:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel
Innota x-xebh mal-graff għal konnetturi li jaħdmu b'mod sinkroniku?

Flimkien

U fl-aħħarnett, ejja nġabru r-riżultati kollha f'graff wieħed biex naraw l-istampa ġenerali għall-estensjonijiet ittestjati. Ejja nżidu test ġdid wieħed biss mat-tabella, li għadna ma għamilniex - ejja nħaddmu coroutines Async b'mod parallel billi tuża Parallel*. L-idea li jiġu integrati l-estensjonijiet ta 'hawn fuq diġà hija ġie diskuss awturi, iżda ma ntlaħaq l-ebda kunsens, ser ikollok tagħmel it yourself.

* Ma kienx possibbli li jitniedu Swoole coroutines b'Parallel; jidher li dawn l-estensjonijiet huma inkompatibbli.

Allura, ir-riżultati finali:

Aċċelerazzjoni ta 'konnetturi PHP għal Tarantool bl-użu ta' Async, Swoole u Parallel

Minflok ma tikkonkludi

Fl-opinjoni tiegħi, ir-riżultati rriżultaw li huma pjuttost denji, u għal xi raġuni jien ċert li dan mhuwiex il-limitu! Jekk għandekx bżonn tiddeċiedi dan fi proġett reali biss għalik innifsek, jien se ngħid biss li għalija kien esperiment interessanti li jippermettilek tevalwa kemm tista '"tagħfas" minn konnettur TCP sinkroniku bi sforz minimu. Jekk għandek ideat għat-titjib tal-benchmarks, inkun kuntent li nikkunsidra t-talba tal-ġibda tiegħek. Il-kodiċi kollu bl-istruzzjonijiet u r-riżultati tat-tnedija huwa ppubblikat separatament repożitorji.

Sors: www.habr.com

Żid kumment