Дар экосистемаи PHP дар айни замон ду пайвасткунак барои кор бо сервери Tarantool мавҷуд аст - ин тамдиди расмии PECL мебошад
Дар ин мақола, ман мехоҳам натиҷаҳои санҷиши самаранокии ҳарду китобхонаро мубодила кунам ва нишон диҳам, ки чӣ гуна шумо бо тағири ҳадди ақали код, шумо метавонед 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-ро барои пайвасткунаки PHP чен мекунем ва дар санҷишҳои минбаъда мо ҳамонеро истифода мебарем, ки натиҷаи беҳтаринро нишон медиҳад:
Гарчанде ки версияи PHP (Pure) аз тамдиди PECL аз ҷиҳати суръат пасттар аст, дар лоиҳаҳои воқеӣ ман то ҳол истифодаи онро тавсия медиҳам
Пас, биёед кори пайвасткунакҳоро дар ҳолати синхронӣ чен кунем:
Тавре ки аз график дида мешавад, пайвасткунаки PECL (Tarantool) нисбат ба пайвасткунаки PHP (Клиент) кори беҳтареро нишон медиҳад. Аммо ин тааҷҷубовар нест, бо назардошти он, ки охирин, илова бар он, ки бо забони сусттар амалӣ карда мешавад, воқеан кори бештарро иҷро мекунад: объекти нав бо ҳар як занг эҷод мешавад. дархост и Вокуниш (дар ҳолати Интихоб - инчунин Кристер, ва дар ҳолати Навсозӣ/Бозсозӣ ― Амалиёт), шахсони алоҳида Пайвастшавӣ, Packer и Ҳунарманд инчунин харочоти иловагй зам мекунанд. Аён аст, ки чандирӣ бо нархе меояд. Аммо, дар маҷмӯъ, тарҷумони PHP кори хуб нишон медиҳад, гарчанде ки фарқият вуҷуд дорад, он ночиз аст ва шояд ҳангоми истифодаи пешакӣ дар PHP 7.4, ҳатто аз JIT дар PHP 8 ёдовар нашавад.
Биёед пеш равем. Tarantool 2.0 дастгирии SQL-ро илова кард. Биёед кӯшиш кунем, ки амалиёти Интихоб, Вуруд, Навсозӣ ва Нобудро бо истифода аз протоколи SQL иҷро кунем ва натиҷаҳоро бо эквивалентҳои noSQL (бинарӣ) муқоиса кунем:
Натиҷаҳои SQL чандон таъсирбахш нестанд (иҷозат диҳед ба шумо хотиррасон кунам, ки мо ҳоло ҳам реҷаи синхронӣ санҷида истодаем). Аммо, ман пеш аз ин аз ин хафа намешавам; Дастгирии SQL ҳоло ҳам дар таҳаввулоти фаъол аст (масалан, нисбатан ба наздикӣ, дастгирӣ илова карда шуд
Асинх
Хуб, акнун биёед бубинем, ки чӣ тавр васеъшавии Async метавонад ба мо дар беҳтар кардани натиҷаҳои дар боло овардашуда кӯмак кунад. Барои навиштани барномаҳои асинхронӣ, васеъшавӣ API-ро дар асоси корутинҳо таъмин мекунад, ки мо аз он истифода хоҳем кард. Мо ба таври ампирикӣ мефаҳмем, ки шумораи оптималии корутинҳо барои муҳити мо 25 аст:
10,000 амалиётро дар 25 корутин "паҳн кунед" ва бубинед, ки чӣ мешавад:
Шумораи амалиёт дар як сония барои бештар аз 3 баробар афзуд
Мутаассифона, пайвасткунаки PECL бо ext-async оғоз нашудааст.
Дар бораи SQL чӣ гуфтан мумкин аст?
Тавре ки шумо мебинед, дар ҳолати асинхронӣ фарқият байни протоколи бинарӣ ва SQL дар доираи хатогӣ буд.
Swoole
Боз мо шумораи оптималии корутинҳоро мефаҳмем, ин дафъа барои Swoole:
Биёед дар 25 таваққуф кунем. Биё ҳамон ҳиллаеро, ки бо васеъшавии Async такрор мекунад, такрор мекунем - 10,000 амалиётро байни 25 корутин тақсим кунед. Илова бар ин, мо санҷиши дигареро илова мекунем, ки дар он ҳамаи корҳоро ба 2 ду раванд тақсим мекунем (яъне ҳар як раванд дар 5,000 корутин 25 амалро иҷро мекунад). Равандҳо бо истифода аз он сохта мешаванд SwooleProcess.
Натиҷаҳо:
Swole дар муқоиса бо Async дар як раванд натиҷаи каме пасттар нишон медиҳад, аммо бо 2 раванд тасвир ба таври назаррас тағир меёбад (рақами 2 тасодуфан интихоб нашудааст; дар мошини ман, он 2 раванд буд, ки натиҷаи беҳтаринро нишон дод).
Дар омади гап, васеъшавии Async инчунин дорои API барои кор бо равандҳо мебошад, аммо дар он ҷо ман ҳеҷ тафовутеро аз иҷроиши меъёрҳо дар як ё якчанд раванд пай набурдам (эҳтимол дорад, ки ман дар ҷое иштибоҳ карда бошам).
SQL протоколи дуӣ:
Мисли Async, фарқияти байни амалиёти дуӣ ва SQL дар ҳолати асинхронӣ бартараф карда мешавад.
Параллел
Азбаски васеъшавии параллелӣ на дар бораи корутинҳо, балки дар бораи риштаҳо аст, биёед шумораи оптималии риштаҳои параллелро чен кунем:
Дар мошини ман ба 16 баробар аст. Биёед меъёрҳои пайвасткуниро дар 16 риштаи параллел иҷро кунем:
Тавре ки шумо мебинед, натиҷа нисбат ба васеъшавии асинхронӣ беҳтар аст (ба ҳисоб гирифтани Swoole дар 2 раванд кор мекунад). Дар хотир доред, ки барои пайвасткунаки PECL, амалиёти Навсозӣ ва Upsert холӣ аст. Ин аз он сабаб аст, ки ин амалиётҳо бо хатогӣ ноком шуданд - ман намедонам, ки оё ин айби параллелӣ, ext-tarantool ё ҳарду буд.
Акнун биёед иҷрои SQL-ро муқоиса кунем:
Аҳамият диҳед, ки ба монандии графикӣ барои пайвасткунакҳо синхронӣ кор мекунанд?
Якҷоя
Ва ниҳоят, биёед ҳамаи натиҷаҳоро дар як график ҷамъбаст кунем, то тасвири умумии васеъшавии санҷидашударо бубинем. Биёед ба диаграмма танҳо як санҷиши нав илова кунем, ки мо онро ҳанӯз анҷом надодаем - биёед корутинҳои Async-ро дар баробари бо истифода аз Parallel* иҷро кунем. Идеяи ҳамгироии васеъшавии дар боло зикршуда аллакай вуҷуд дорад
* Оғози корутинҳои Swoole бо Parallel ғайриимкон буд; Чунин ба назар мерасад, ки ин васеъшавӣ номувофиқанд.
Ҳамин тариқ, натиҷаҳои ниҳоӣ:
Ба ҷои хулоса
Ба андешаи ман, натиҷаҳо хеле арзанда буданд ва барои баъзе сабабҳо ман боварӣ дорам, ки ин маҳдудият нест! Новобаста аз он ки шумо бояд инро дар як лоиҳаи воқеӣ танҳо барои худ ҳал кунед, ман танҳо мегӯям, ки барои ман ин як таҷрибаи ҷолибе буд, ки ба шумо имкон медиҳад арзёбӣ кунед, ки то чӣ андоза шумо метавонед аз пайвасткунаки синхронии TCP бо кӯшиши ҳадди аққал "фишурдан" кунед. Агар шумо барои беҳтар кардани нишондиҳандаҳо ғояҳо дошта бошед, ман бо хушнудӣ дархости ҷалби шуморо баррасӣ мекунам. Ҳама рамзҳо бо дастурҳои оғоз ва натиҷаҳо дар алоҳидагӣ нашр карда мешаванд
Манбаъ: will.com