Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel

Di ekosîstema PHP-ê de niha du girêdan hene ku bi servera Tarantool re dixebitin - ev dirêjkirina fermî ya PECL ye tarantool/tarantool-php, bi C hatiye nivîsandin, û tarantool-php / muwekîlê, bi PHP hatiye nivîsandin. Ez nivîskarê vê dawiyê me.

Di vê gotarê de, ez dixwazim encamên ceribandina performansê ya her du pirtûkxaneyan parve bikim û destnîşan bikim ka çawa, bi guhertinên hindiktirîn ên kodê, hûn dikarin performansa 3-5 zêde bikin (li ser testên sentetîk!).

Em ê çi biceribînin?

Em ê yên ku li jor hatine destnîşan kirin biceribînin hemdem connectors bi asynchronously, paralel, û asynchronously-paralel. 🙂 Di heman demê de em naxwazin dest bidin koda girêdanan bixwe. Niha çend pêvek hene ku hûn bigihîjin tiştê ku hûn dixwazin:

  • Swoole - ji bo PHP-ê çarçoveyek asynchronous-performansa bilind. Ji hêla dêwên Înternetê yên wekî Alibaba û Baidu ve têne bikar anîn. Ji guhertoya 4.1.0 ve rêbazek sêrbaz derketiye SwooleRuntime::enableCoroutine(), ku dihêle hûn "pirtûkxaneyên tora PHP-a hevdem bi yek rêzek kodê veguhezînin yên asynkron."
  • Async heya vê dawiyê ji bo xebata asynchronous di PHP de dirêjkirinek pir hêvdar bû. Çima heta vê dawiyê? Mixabin, ji ber sedemek ku ji min re nayê zanîn, nivîskar depo jêbirin û çarenûsa pêşerojê ya projeyê ne diyar e. Divê ez wê bikar bînim yek ji qalikan. Mîna Swoole, ev pêvek dihêle hûn bi lêdana destikê pantolojên xwe bi hêsanî bizivirînin da ku asynkroniyê çalak bikin bi guheztina pêkanîna standard a herikên TCP û TLS bi guhertoyên wan ên asynchronous. Ev bi vebijarka "async.tcp = 1".
  • Dûberîn ― dirêjkirinek pir nû ji Joe Watkins-ê navdar, nivîskarê pirtûkxaneyên wekî phpdbg, apcu, pthreads, pcov, uopz. Berfirehbûnek API-ê ji bo pir-threading di PHP-ê de peyda dike û wekî cîhgirek ji bo pthreadan tête cîh kirin. Sînorek girîng a pirtûkxaneyê ev e ku ew tenê bi guhertoya ZTS (Zend Thread Safe) ya PHP-ê re dixebite.

Em ê çawa test bikin?

Werin em mînakek Tarantool bi qeydkirina pêş-nivîsandinê neçalak dest pê bikin (wal_mode = tune) û tampona torê zêde kir (xwendin li pêş = 1 * 1024 * 1024). Vebijarka yekem dê xebata bi dîskê re ji holê rabike, ya duyemîn dê gengaz bike ku hûn bêtir daxwazên ji tampona pergala xebitandinê bixwînin û bi vî rengî hejmara bangên pergalê kêm bikin.

Ji bo pîvanên ku bi daneyan re dixebitin (navkirin, jêbirin, xwendin, hwd.), berî destpêkirina pîvanê, cîhek memtx dê (ji nû ve) were afirandin, ku tê de nirxên seretayî ji hêla jeneratorek nirxên yekjimar ên rêzkirî ve têne afirandin. (rêzik).
Cihê DDL wiha xuya dike:

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}})

Ger hewce be, berî ku pîvanê bimeşîne, cîh bi 10,000 tîpên formê tê dagirtin.

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

Tuples bi karanîna nirxek keyek rasthatî têne gihîştin.

Pîvan bixwe daxwazek yekane ye ji serverê re, ku 10,000 carî (şoreş) tê darve kirin, ku di encamê de, di dubareyan de têne darve kirin. Dubarekirin têne dûbarekirin heya ku hemî veqetandina dema di navbera 5 dubareyan de di nav xeletiyek pejirandî ya %3* de bin. Piştî vê yekê, encama navîn tê girtin. Di navbera dubareyan de 1 saniye rawestinek heye da ku nehêle ku pêvajo bişewite. Berhevkarê çopê yê Lua berî her dubarekirinê tê asteng kirin û piştî ku temam dibe neçar dimîne ku dest pê bike. Pêvajoya PHP-ê tenê bi pêvekên ku ji bo pîvanê hewce ne, bi tamponkirina derketinê ve hatî çalak kirin û berhevkarê çopê neçalakkirî tê destpêkirin.

* Di mîhengên pîvanê de hejmara şoreşan, dubarekirin û bendava xeletiyê dikare were guheztin.

jîngeha Test

Encamên ku li jêr hatine weşandin li ser MacBookPro (2015), pergala xebitandinê - Fedora 30 (guhertoya kernel 5.3.8-200.fc30.x86_64) hatine çêkirin. Tarantool di dokerê de bi parametre " hate destpêkirin--network host".

Guhertoyên pakêtê:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, a872fc2f86 ava bikin
PHP: 7.3.11 (cli) (avakirin: Cotmeh 22 2019 08:11:04)
tarantool / muwekîlê: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch ji bo 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* Mixabin, girêdana fermî bi guhertoya PHP> 7.2 re naxebite. Ji bo berhevkirin û meşandina pêvekê li ser PHP 7.3, neçar ma ku ez bikar bînim pîne.

Encam

Moda hevdem

Protokola Tarantool formatek binary bikar tîne MessagePack ji bo serialize mesajên. Di girêdana PECL de, serialîzasyon di kûrahiya pirtûkxaneyê de veşartî ye û bandorê li pêvajoya şîfrekirinê ji koda bikarhênerê dike. ne mumkin xuya dike. Berevajî vê, girêdanek PHP-ya paqij, bi dirêjkirina şîfreya standard an bi karanîna pêkanîna xwe ve kapasîteya xweşkirina pêvajoya kodkirinê peyda dike. Du şîfreker ji derveyî qutiyê peyda dibin, yek li ser bingehê ye msgpack/msgpack-php (berfirehkirina fermî MessagePack PECL), ya din li ser e rybakit/msgpack (di PHP-ya paqij de).

Berî berhevdana girêdanan, em ê performansa şîfrekerên MessagePack ji bo girêdana PHP-ê bipîvin û di ceribandinên din de em ê ya ku çêtirîn encam nîşan dide bikar bînin:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Her çend guhertoya PHP-ê (Pure) bi leza dirêjkirina PECL-ê kêmtir e, di projeyên rastîn de ez ê dîsa jî karanîna wê pêşniyar bikim rybakit/msgpack, ji ber ku di dirêjkirina fermî ya MessagePack de taybetmendiya formatê tenê bi qismî tête bicîh kirin (mînak, ji bo celebên daneya xwerû piştgirî tune, bêyî ku hûn ê nikaribin Decimal bikar bînin - celebek daneya nû ya ku di Tarantool 2.3 de hatî destnîşan kirin) û xwedî hejmara yên din pirsgirêkên (Pirsgirêkên lihevhatina bi PHP 7.4 re jî tê de). Welê, bi gelemperî, proje berdayî xuya dike.

Ji ber vê yekê, bila em performansa girêdanan di moda hevdem de bipîvin:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Wekî ku ji grafîkê tê dîtin, girêdana PECL (Tarantool) li gorî girêdana PHP (Client) performansa çêtir nîşan dide. Lê ev ne ecêb e, ji ber ku ya paşîn, ji bilî ku bi zimanek hêdîtir tête bicîh kirin, bi rastî bêtir kar dike: bi her bangê re tiştek nû tê afirandin. Tika и Bersiv (di mijara Hilbijartinê de - jî Nirxandin, û di doza Nûvekirin/Zêde ― operasyonên), saziyên cuda Têkêlî, pakkeran и Handler ew jî serê xwe zêde dikin. Eşkere ye, nermbûn bi bihayek tê. Lêbelê, bi gelemperî, wergêrê PHP performansa baş nîşan dide, her çend cûdahiyek hebe jî, ew ne girîng e û, belkî, dema ku pêşî barkirin di PHP 7.4-ê de tê bikar anîn jî kêmtir be, ji bo JIT-ê di PHP 8-ê de nebêje.

Werin em herin. Tarantool 2.0 piştgiriya SQL destnîşan kir. Werin em hewl bidin ku bi karanîna protokola SQL operasyonên Hilbijartin, Têxe, Nûvekirin û Jêbirinê pêk bînin û encaman bi hevrehên noSQL (binary) re bidin ber hev:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Encamên SQL ne pir bi heybet in (bihêlin ez ji we re bi bîr bînim ku em hîn jî moda hevdemî diceribînin). Lêbelê, ez ê pêşî li ser vê yekê aciz nebim; Piştgiriya SQL hîn jî di bin pêşkeftina çalak de ye (ji nêzik ve, wek nimûne, piştgirî hate zêdekirin daxuyanî amade kirin) û, li gorî navnîşê dadbar kirin pirsên, motora SQL dê di paşerojê de gelek xweşbîniyan derbas bike.

async

Welê, naha em bibînin ka dirêjkirina Async çawa dikare ji me re bibe alîkar ku encamên li jor baştir bikin. Ji bo nivîsandina bernameyên asynchronous, pêvek API-yek li ser bingeha kortînan peyda dike, ku em ê bikar bînin. Em bi ezmûnî fêr dibin ku ji bo hawîrdora me hejmara herî baş a kortînan 25 e:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
10,000 operasyonan li ser 25 kortînan "belav bikin" û bibînin ka çi diqewime:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Hejmara operasyonan di çirkeyê de ji bo 3 qatan zêde bû tarantool-php / muwekîlê!

Mixabin, girêdana PECL bi ext-async dest pê nekir.

SQL çi ye?

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Wekî ku hûn dikarin bibînin, di moda asynchronous de cûdahiya di navbera protokola binary û SQL de di nav xeletiyê de bû.

Swoole

Dîsa em vê carê ji bo Swoole hejmara herî çêtirîn a kortînan fêr dibin:
Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Werin em li ser 25 rawestin. Werin em heman hîleyê wekî bi dirêjkirina Async dubare bikin - 10,000 operasyonan di navbera 25 kortînan de belav bikin. Wekî din, em ê ceribandinek din lê zêde bikin ku tê de em ê hemî karan li 2 du pêvajoyan dabeş bikin (ango, her pêvajo dê di 5,000 kortînan de 25 operasyonan pêk bîne). Pêvajoyên bi kar tên afirandin SwooleProcess.

Encam:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Swole dema ku di yek pêvajoyê de tê meşandin li gorî Async encamek hindik kêmtir nîşan dide, lê bi 2 pêvajoyan re wêne dramatîk diguhezîne (hejmara 2 ne bi tesadufî hate hilbijartin; li ser makîneya min, ew 2 pêvajoyê bûn ku encama çêtirîn nîşan da).

Bi awayê, dirêjkirina Async di heman demê de ji bo xebata bi pêvajoyan re API-yek jî heye, lê li wir min ferqek ji pîvanên xebitandinê di yek an çend pêvajoyan de nedît (mimkûn e ku min li deverek tevlihev kir).

SQL dijî protokola binary:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Mîna Asyncê, cûdahiya di navbera operasyonên binary û SQL de di moda asynchronous de ji holê radibe.

Dûberîn

Ji ber ku dirêjkirina Parallel ne li ser kortînan e, lê di derbarê têlan de ye, em jimareya herî baş a têlên paralel bipîvin:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Li ser makîneya min 16 wekhev e. Ka em pîvanên girêdanê li ser 16 mijarên paralel bimeşînin:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Wekî ku hûn dibînin, encam ji pêvekên asynchronous jî çêtir e (nehesibîn Swoole ku li ser 2 pêvajoyan dimeşe). Bala xwe bidinê ku ji bo girêdana PECL, operasyonên Nûvekirin û Serûvekirinê vala ne. Ev ji ber vê yekê ye ku van operasyonan bi xeletiyek bi ser neketin - ez nizanim gelo ew xeletiya ext-parallel, ext-tarantool, an hem jî bû.

Naha em performansa SQL bidin ber hev:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel
Bala xwe bidin wekheviya grafîkê ya ji bo girêdanên ku bi hevdemî dixebitin?

Bihevra

Û di dawiyê de, bila em hemî encaman di yek grafîkê de kurt bikin da ku wêneya giştî ya ji bo dirêjkirina ceribandinan bibînin. Werin em tenê ceribandinek nû li nexşeyê zêde bikin, ya ku me hîna nekiriye - werin em bi karanîna Parallel* bi paralelî hevokên Async bimeşînin. Fikra yekkirina pêvekên jorîn jixwe heye hat nîqaşkirin nivîskaran, lê lihevhatinek çênebû, hûn ê neçar bibin ku xwe bikin.

* Ne mimkun bû ku bi Parallel re kortîneyên Swoole dest pê bike; wusa dixuye ku ev dirêjkirin hevaheng in.

Ji ber vê yekê, encamên dawîn:

Lezkirina girêdanên PHP-ê yên ji bo Tarantool bi karanîna Async, Swoole û Parallel

Şûna encamê

Bi dîtina min, encam pir hêja derketin, û ji ber hin sedeman ez piştrast im ku ev ne sînor e! Ma hûn hewce ne ku hûn vê yekê di projeyek rastîn de tenê ji bo xwe biryar bidin, ez ê tenê bibêjim ku ji bo min ew ceribandinek balkêş bû ku dihêle hûn binirxînin ka hûn dikarin çiqas bi hewildanek hindiktirîn ji girêdanek TCP-ya hevdemî "pişk" bikin. Ger ramanên we ji bo baştirkirina pîvanan hebin, ez ê kêfxweş bibim ku daxwaza weya kişandinê binirxînim. Hemî kodên bi rêwerz û encamên destpêkirinê ve di veqetandî de têne weşandin depoyên.

Source: www.habr.com

Add a comment