Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel

Дар экосистемаи PHP дар айни замон ду пайвасткунак барои кор бо сервери Tarantool мавҷуд аст - ин тамдиди расмии PECL мебошад tarantool/tarantool-php, дар C навишта шудааст ва tarantool-php/client, дар PHP навишта шудааст. Ман муаллифи охиринам.

Дар ин мақола, ман мехоҳам натиҷаҳои санҷиши самаранокии ҳарду китобхонаро мубодила кунам ва нишон диҳам, ки чӣ гуна шумо бо тағири ҳадди ақали код, шумо метавонед 3-5 баланд бардоштани самаранокиро ба даст оред (дар озмоишҳои синтетикӣ!).

Мо чиро озмоиш хоҳем кард?

Мо чизҳои дар боло зикршударо озмоиш хоҳем кард синхронӣ Пайвасткунакҳо ба таври асинхронӣ, мувозӣ ва асинхронӣ-параллелӣ кор мекунанд. 🙂 Мо инчунин намехоҳем, ки худи рамзи пайвасткунакҳоро ламс кунем. Дар айни замон барои ноил шудан ба он чизе, ки шумо мехоҳед, якчанд васеъшавӣ мавҷуданд:

  • Swoole ― чаҳорчӯбаи асинхронии баландсифат барои PHP. Аз ҷониби бузургҷуссаҳои интернетӣ ба монанди Alibaba ва Baidu истифода мешавад. Аз версияи 4.1.0 усули ҷодугарӣ пайдо шуд SwooleRuntime ::enableCoroutine(), ки ба шумо имкон медиҳад, ки "китобхонаҳои шабакаи синхронии PHP-ро бо як сатри код ба китобхонаҳои асинхронӣ табдил диҳед."
  • Async то ба наздикӣ як тавсеаи хеле умедбахш барои кори асинхронӣ дар PHP буд. Чаро то ба наздикӣ? Мутаассифона, бо сабаби ба ман номаълум, муаллиф анборро нест кард ва сарнавишти ояндаи лоиҳа рӯшан нест. Ман бояд онро истифода барам як аз чангак. Мисли Свул, ин васеъшавӣ ба шумо имкон медиҳад, ки бо як зарбаи даст шими худро ба осонӣ ба кор баред, то асинхронӣ тавассути иваз кардани татбиқи стандартии ҷараёнҳои TCP ва TLS бо версияҳои асинхронии онҳо фаъол шавад. Ин тавассути опсияи " анҷом дода мешавадasync.tcp = 1".
  • Параллел ― васеъшавии хеле нав аз маъруфи Ҷо Уоткинс, муаллифи китобхонаҳои монанди phpdbg, apcu, pthreads, pcov, uopz. Васеъ API-ро барои чанд ришта дар PHP таъмин мекунад ва ҳамчун ивазкунандаи pthreads ҷойгир шудааст. Маҳдудияти назарраси китобхона дар он аст, ки он танҳо бо версияи ZTS (Zend Thread Safe) PHP кор мекунад.

Мо чӣ гуна озмоиш хоҳем кард?

Биёед як мисоли Tarantool-ро бо ғайрифаъол кардани сабти пешнавис оғоз кунем (wal_mode = ҳеҷ) ва афзоиши буфери шабака (пеш аз хондан = 1 * 1024 * 1024). Варианти аввал кор бо дискро аз байн мебарад, дуюм имкон медиҳад, ки дархостҳои бештар аз буфери системаи оператсионӣ хонда шавад ва ба ин васила шумораи зангҳои системаро кам кунад.

Барои нишондодҳое, ки бо маълумот кор мекунанд (воридкунӣ, ҳазф кардан, хондан ва ғ.), пеш аз оғози муқоиса, фазои memtx (аз нав) эҷод карда мешавад, ки дар он арзишҳои индекси ибтидоӣ аз ҷониби генератори арзишҳои бутуни фармоишӣ сохта мешаванд. (пайвандак).
Фазои DDL чунин менамояд:

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

Агар лозим бошад, пеш аз иҷро кардани нишондиҳанда, фосила бо 10,000 кортаҳои форма пур карда мешавад.

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

Ба наворҳо бо истифода аз арзиши калиди тасодуфӣ дастрасӣ пайдо мекунанд.

Худи нишондод як дархости сервер аст, ки 10,000 5 маротиба (инқилобҳо) иҷро мешавад, ки дар навбати худ дар такрорҳо иҷро карда мешаванд. Итерацияҳо такрор карда мешаванд, то он даме, ки ҳама инҳирофҳои вақт байни 3 итератсия дар доираи хатои қобили қабули 1% * бошад. Баъд аз ин, натиҷаи миёна гирифта мешавад. Дар байни такрорҳо таваққуфи XNUMX сония вуҷуд дорад, то аз дроссели протсессор пешгирӣ карда шавад. Ҷамъоварии партовҳои Луа пеш аз ҳар як такрор хомӯш карда мешавад ва пас аз анҷоми он маҷбур мешавад, ки оғоз кунад. Раванди PHP танҳо бо васеъкуниҳои зарурӣ барои нишондод оғоз мешавад, ки буферии баромад фаъол ва коллектори партовҳо ғайрифаъол аст.

* Миқдори инқилобҳо, такрорҳо ва ҳадди хатогиҳоро дар танзимоти бенчмарк тағир додан мумкин аст.

Муҳити озмоиш

Натиҷаҳои дар зер нашршуда дар MacBookPro (2015), системаи оператсионии Fedora 30 (версияи ядрои 5.3.8-200.fc30.x86_64) таҳия карда шуданд. Tarantool дар докер бо параметр ба кор андохта шуд "--network host".

Версияҳои баста:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, сохтани a872fc2f86
PHP: 7.3.11 (cli) (сохт: 22 октябри 2019 08:11:04)
tarantool / муштарӣ: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ ямоқи 7.3)*
ext-msgpack: 2.0.3
Ex-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
параллели берунӣ: 1.1.3

* Мутаассифона, пайвасткунаки расмӣ бо версияи PHP> 7.2 кор намекунад. Барои тартиб додан ва иҷро кардани васеъкунӣ дар PHP 7.3, ман бояд истифода кунам ямоқи.

натиҷаҳои

Ҳолати синхронӣ

Протоколи Tarantool формати бинариро истифода мебарад MessagePack барои силсилаи паёмҳо. Дар пайвасткунаки PECL, сериализатсия дар умқи китобхона пинҳон аст ва ба раванди рамзгузорӣ аз рамзи замини корбар таъсир мерасонад имконнопазир ба назар мерасад. Пайвасткунаки холиси PHP, баръакс, қобилияти танзим кардани раванди рамзгузориро тавассути васеъ кардани рамзгузори стандартӣ ё бо истифода аз татбиқи худ таъмин мекунад. Аз қуттӣ ду рамзгузор мавҷуд аст, ки яке ба он асос ёфтааст msgpack/msgpack-php (васеъкунии расмии MessagePack PECL), дигаре фаъол аст rybakit/msgpack (дар PHP холис).

Пеш аз муқоисаи пайвасткунакҳо, мо кори рамзгузорҳои MessagePack-ро барои пайвасткунаки PHP чен мекунем ва дар санҷишҳои минбаъда мо ҳамонеро истифода мебарем, ки натиҷаи беҳтаринро нишон медиҳад:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Гарчанде ки версияи PHP (Pure) аз тамдиди PECL аз ҷиҳати суръат пасттар аст, дар лоиҳаҳои воқеӣ ман то ҳол истифодаи онро тавсия медиҳам rybakit/msgpack, зеро дар тамдиди расмии MessagePack мушаххасоти формат танҳо қисман иҷро карда мешавад (масалан, барои намудҳои фармоишии додаҳо дастгирӣ нест, ки бе он шумо наметавонед Даҳӣ - навъи нави маълумотро, ки дар Tarantool 2.3 ҷорӣ шудааст) истифода баред) ва дорои шумораи дигарон мушкилот (аз ҷумла масъалаҳои мутобиқат бо PHP 7.4). Хуб, дар маҷмӯъ, лоиҳа партофташуда ба назар мерасад.

Пас, биёед кори пайвасткунакҳоро дар ҳолати синхронӣ чен кунем:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Тавре ки аз график дида мешавад, пайвасткунаки PECL (Tarantool) нисбат ба пайвасткунаки PHP (Клиент) кори беҳтареро нишон медиҳад. Аммо ин тааҷҷубовар нест, бо назардошти он, ки охирин, илова бар он, ки бо забони сусттар амалӣ карда мешавад, воқеан кори бештарро иҷро мекунад: объекти нав бо ҳар як занг эҷод мешавад. дархост и Вокуниш (дар ҳолати Интихоб - инчунин Кристер, ва дар ҳолати Навсозӣ/Бозсозӣ ― Амалиёт), шахсони алоҳида Пайвастшавӣ, Packer и Ҳунарманд инчунин харочоти иловагй зам мекунанд. Аён аст, ки чандирӣ бо нархе меояд. Аммо, дар маҷмӯъ, тарҷумони PHP кори хуб нишон медиҳад, гарчанде ки фарқият вуҷуд дорад, он ночиз аст ва шояд ҳангоми истифодаи пешакӣ дар PHP 7.4, ҳатто аз JIT дар PHP 8 ёдовар нашавад.

Биёед пеш равем. Tarantool 2.0 дастгирии SQL-ро илова кард. Биёед кӯшиш кунем, ки амалиёти Интихоб, Вуруд, Навсозӣ ва Нобудро бо истифода аз протоколи SQL иҷро кунем ва натиҷаҳоро бо эквивалентҳои noSQL (бинарӣ) муқоиса кунем:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Натиҷаҳои SQL чандон таъсирбахш нестанд (иҷозат диҳед ба шумо хотиррасон кунам, ки мо ҳоло ҳам реҷаи синхронӣ санҷида истодаем). Аммо, ман пеш аз ин аз ин хафа намешавам; Дастгирии SQL ҳоло ҳам дар таҳаввулоти фаъол аст (масалан, нисбатан ба наздикӣ, дастгирӣ илова карда шуд изҳорот омода кардааст) ва, мувофиқи рӯйхат масъалањои, муҳаррики SQL дар оянда аз як қатор оптимизатсияҳо мегузарад.

Асинх

Хуб, акнун биёед бубинем, ки чӣ тавр васеъшавии Async метавонад ба мо дар беҳтар кардани натиҷаҳои дар боло овардашуда кӯмак кунад. Барои навиштани барномаҳои асинхронӣ, васеъшавӣ API-ро дар асоси корутинҳо таъмин мекунад, ки мо аз он истифода хоҳем кард. Мо ба таври ампирикӣ мефаҳмем, ки шумораи оптималии корутинҳо барои муҳити мо 25 аст:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
10,000 амалиётро дар 25 корутин "паҳн кунед" ва бубинед, ки чӣ мешавад:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Шумораи амалиёт дар як сония барои бештар аз 3 баробар афзуд tarantool-php/client!

Мутаассифона, пайвасткунаки PECL бо ext-async оғоз нашудааст.

Дар бораи SQL чӣ гуфтан мумкин аст?

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Тавре ки шумо мебинед, дар ҳолати асинхронӣ фарқият байни протоколи бинарӣ ва SQL дар доираи хатогӣ буд.

Swoole

Боз мо шумораи оптималии корутинҳоро мефаҳмем, ин дафъа барои Swoole:
Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Биёед дар 25 таваққуф кунем. Биё ҳамон ҳиллаеро, ки бо васеъшавии Async такрор мекунад, такрор мекунем - 10,000 амалиётро байни 25 корутин тақсим кунед. Илова бар ин, мо санҷиши дигареро илова мекунем, ки дар он ҳамаи корҳоро ба 2 ду раванд тақсим мекунем (яъне ҳар як раванд дар 5,000 корутин 25 амалро иҷро мекунад). Равандҳо бо истифода аз он сохта мешаванд SwooleProcess.

Натиҷаҳо:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Swole дар муқоиса бо Async дар як раванд натиҷаи каме пасттар нишон медиҳад, аммо бо 2 раванд тасвир ба таври назаррас тағир меёбад (рақами 2 тасодуфан интихоб нашудааст; дар мошини ман, он 2 раванд буд, ки натиҷаи беҳтаринро нишон дод).

Дар омади гап, васеъшавии Async инчунин дорои API барои кор бо равандҳо мебошад, аммо дар он ҷо ман ҳеҷ тафовутеро аз иҷроиши меъёрҳо дар як ё якчанд раванд пай набурдам (эҳтимол дорад, ки ман дар ҷое иштибоҳ карда бошам).

SQL протоколи дуӣ:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Мисли Async, фарқияти байни амалиёти дуӣ ва SQL дар ҳолати асинхронӣ бартараф карда мешавад.

Параллел

Азбаски васеъшавии параллелӣ на дар бораи корутинҳо, балки дар бораи риштаҳо аст, биёед шумораи оптималии риштаҳои параллелро чен кунем:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Дар мошини ман ба 16 баробар аст. Биёед меъёрҳои пайвасткуниро дар 16 риштаи параллел иҷро кунем:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Тавре ки шумо мебинед, натиҷа нисбат ба васеъшавии асинхронӣ беҳтар аст (ба ҳисоб гирифтани Swoole дар 2 раванд кор мекунад). Дар хотир доред, ки барои пайвасткунаки PECL, амалиёти Навсозӣ ва Upsert холӣ аст. Ин аз он сабаб аст, ки ин амалиётҳо бо хатогӣ ноком шуданд - ман намедонам, ки оё ин айби параллелӣ, ext-tarantool ё ҳарду буд.

Акнун биёед иҷрои SQL-ро муқоиса кунем:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel
Аҳамият диҳед, ки ба монандии графикӣ барои пайвасткунакҳо синхронӣ кор мекунанд?

Якҷоя

Ва ниҳоят, биёед ҳамаи натиҷаҳоро дар як график ҷамъбаст кунем, то тасвири умумии васеъшавии санҷидашударо бубинем. Биёед ба диаграмма танҳо як санҷиши нав илова кунем, ки мо онро ҳанӯз анҷом надодаем - биёед корутинҳои Async-ро дар баробари бо истифода аз Parallel* иҷро кунем. Идеяи ҳамгироии васеъшавии дар боло зикршуда аллакай вуҷуд дорад мухокима карда шуд муаллифон, аммо консенсус ба даст наомадааст, шумо бояд ин корро худатон анҷом диҳед.

* Оғози корутинҳои Swoole бо Parallel ғайриимкон буд; Чунин ба назар мерасад, ки ин васеъшавӣ номувофиқанд.

Ҳамин тариқ, натиҷаҳои ниҳоӣ:

Шитоб кардани пайвасткунакҳои PHP барои Tarantool бо истифода аз Async, Swoole ва Parallel

Ба ҷои хулоса

Ба андешаи ман, натиҷаҳо хеле арзанда буданд ва барои баъзе сабабҳо ман боварӣ дорам, ки ин маҳдудият нест! Новобаста аз он ки шумо бояд инро дар як лоиҳаи воқеӣ танҳо барои худ ҳал кунед, ман танҳо мегӯям, ки барои ман ин як таҷрибаи ҷолибе буд, ки ба шумо имкон медиҳад арзёбӣ кунед, ки то чӣ андоза шумо метавонед аз пайвасткунаки синхронии TCP бо кӯшиши ҳадди аққал "фишурдан" кунед. Агар шумо барои беҳтар кардани нишондиҳандаҳо ғояҳо дошта бошед, ман бо хушнудӣ дархости ҷалби шуморо баррасӣ мекунам. Ҳама рамзҳо бо дастурҳои оғоз ва натиҷаҳо дар алоҳидагӣ нашр карда мешаванд анборҳо.

Манбаъ: will.com

Илова Эзоҳ