ProHoster > Blogs > AdministrÄcija > Tarantool PHP savienotÄju paÄtrinÄÅ”ana, izmantojot Async, Swoole un Parallel
Tarantool PHP savienotÄju paÄtrinÄÅ”ana, izmantojot Async, Swoole un Parallel
PHP ekosistÄmÄ paÅ”laik ir divi savienotÄji darbam ar Tarantool serveri - tas ir oficiÄlais PECL paplaÅ”inÄjums tarantool/tarantool-php, rakstÄ«ts C un tarantool-php/klients, rakstÄ«ts PHP. Es esmu pÄdÄjÄs autors.
Å ajÄ rakstÄ es vÄlos dalÄ«ties ar abu bibliotÄku veiktspÄjas pÄrbaudes rezultÄtiem un parÄdÄ«t, kÄ ar minimÄlÄm koda izmaiÅÄm var sasniegt veiktspÄjas pieaugumu par 3-5 (uz sintÄtiskajiem testiem!).
Ko mÄs pÄrbaudÄ«sim?
MÄs pÄrbaudÄ«sim iepriekÅ” minÄtos sinhroni savienotÄji, kas darbojas asinhroni, paralÄli un asinhroni-paralÄli. š MÄs arÄ« nevÄlamies pieskarties paÅ”u savienotÄju kodiem. PaÅ”laik ir pieejami vairÄki paplaÅ”inÄjumi, lai sasniegtu vÄlamo:
Swoole ā augstas veiktspÄjas asinhronÄ sistÄma PHP. Izmanto tÄdi interneta giganti kÄ Alibaba un Baidu. KopÅ” versijas 4.1.0 ir parÄdÄ«jusies maÄ£iska metode SwooleRuntime::enableCoroutine(), kas ļauj āpÄrveidot sinhronÄs PHP tÄ«kla bibliotÄkas par asinhronÄm ar vienu koda rindiÅuā.
Async vÄl nesen bija ļoti daudzsoloÅ”s paplaÅ”inÄjums asinhronam darbam PHP. KÄpÄc vÄl nesen? DiemžÄl man nezinÄma iemesla dÄļ autors repozitoriju izdzÄsa un projekta turpmÄkais liktenis ir neskaidrs. Man tas bÅ«s jÄizmanto Š¾Š“Š½ŠøŠ¼ no dakÅ”Äm. TÄpat kÄ Swoole, arÄ« Å”is paplaÅ”inÄjums ļauj viegli ieslÄgt bikses ar plaukstas pirkstu, lai iespÄjotu asinhroniju, aizstÄjot TCP un TLS straumju standarta ievieÅ”anu ar to asinhronajÄm versijÄm. Tas tiek darÄ«ts, izmantojot opciju "async.tcp = 1".
paralÄle ā diezgan jauns paplaÅ”inÄjums no labi zinÄmÄ Džo Vatkinsa, tÄdu bibliotÄku autora kÄ phpdbg, apcu, pthreads, pcov, uopz. PaplaÅ”inÄjums nodroÅ”ina API daudzpavedienu veidoÅ”anai PHP un ir novietots kÄ pthreads aizstÄjÄjs. BÅ«tisks bibliotÄkas ierobežojums ir tas, ka tÄ darbojas tikai ar PHP ZTS (Zend Thread Safe) versiju.
KÄ mÄs pÄrbaudÄ«sim?
PalaidÄ«sim Tarantool instanci ar atspÄjotu priekÅ”rakstÄ«Å”anas reÄ£istrÄÅ”anu (wal_mode = nav) un palielinÄts tÄ«kla buferis (priekÅ”lasÄ«Å”ana = 1 * 1024 * 1024). PirmÄ opcija novÄrsÄ«s darbu ar disku, otrÄ - ļaus nolasÄ«t vairÄk pieprasÄ«jumu no operÄtÄjsistÄmas bufera un tÄdÄjÄdi samazinÄt sistÄmas zvanu skaitu.
Etaloniem, kas darbojas ar datiem (ievietoÅ”ana, dzÄÅ”ana, lasÄ«Å”ana utt.), pirms etalona palaiÅ”anas tiks (atkÄrtoti) izveidota memtx telpa, kurÄ primÄrÄs indeksa vÄrtÄ«bas izveido sakÄrtotu veselu skaitļu vÄrtÄ«bu Ä£enerators. (secÄ«ba).
Kosmosa DDL izskatÄs Å”Ädi:
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}})
Ja nepiecieÅ”ams, pirms etalona palaiÅ”anas vieta tiek aizpildÄ«ta ar 10,000 XNUMX veidlapas korteÅiem
{id, "tuplŠµ_<id>"}
Korpusiem var piekļūt, izmantojot nejauÅ”as atslÄgas vÄrtÄ«bu.
Pats etalons ir viens pieprasÄ«jums serverim, kas tiek izpildÄ«ts 10,000 5 reižu (apgriezienu), kas, savukÄrt, tiek izpildÄ«ts iterÄcijÄs. IterÄcijas tiek atkÄrtotas, lÄ«dz visas laika novirzes starp 3 iterÄcijÄm ir pieļaujamÄs kļūdas robežÄs 1%*. PÄc tam tiek Åemts vidÄjais rezultÄts. Starp iterÄcijÄm ir XNUMX sekundes pauze, lai novÄrstu procesora pÄrtraukÅ”anu. Lua atkritumu savÄcÄjs tiek atspÄjots pirms katras iterÄcijas, un tas ir spiests sÄkt pÄc tÄ pabeigÅ”anas. PHP process tiek palaists tikai ar etalonam nepiecieÅ”amajiem paplaÅ”inÄjumiem, ar iespÄjotu izvades buferizÄciju un atspÄjotu atkritumu savÄcÄju.
* Apgriezienu skaitu, atkÄrtojumus un kļūdu slieksni var mainÄ«t etalona iestatÄ«jumos.
Testa vide
TÄlÄk publicÄtie rezultÄti tika veikti, izmantojot MacBookPro (2015), operÄtÄjsistÄmu Fedora 30 (kodola versija 5.3.8-200.fc30.x86_64). Tarantool tika palaists dokerÄ ar parametru "--network host".
* DiemžÄl oficiÄlais savienotÄjs nedarbojas ar PHP versiju> 7.2. Lai apkopotu un palaistu paplaÅ”inÄjumu PHP 7.3, man bija jÄizmanto plÄksteris.
rezultÄtus
Sinhronais režīms
Tarantool protokols izmanto binÄro formÄtu MessagePack lai serializÄtu ziÅas. PECL savienotÄjÄ serializÄcija ir paslÄpta dziļi bibliotÄkas dziļumos un ietekmÄ kodÄÅ”anas procesu no lietotÄja zemes koda neŔķiet iespÄjams. TÄ«rs PHP savienotÄjs, gluži pretÄji, nodroÅ”ina iespÄju pielÄgot kodÄÅ”anas procesu, paplaÅ”inot standarta kodÄtÄju vai izmantojot savu ievieÅ”anu. Ir pieejami divi kodÄtÄji, no kuriem viens ir balstÄ«ts uz msgpack/msgpack-php (oficiÄlais MessagePack PECL paplaÅ”inÄjums), otrs ir ieslÄgts rybakit/msgpack (tÄ«rÄ PHP).
Pirms savienotÄju salÄ«dzinÄÅ”anas mÄs izmÄrÄ«sim MessagePack kodÄtÄju veiktspÄju PHP savienotÄjam un turpmÄkajos testos izmantosim to, kas uzrÄdÄ«s vislabÄko rezultÄtu:
Lai gan PHP versija (Pure) ÄtrumÄ ir zemÄka par PECL paplaÅ”inÄjumu, reÄlos projektos es tomÄr ieteiktu to izmantot rybakit/msgpack, jo oficiÄlajÄ MessagePack paplaÅ”inÄjumÄ formÄta specifikÄcija ir ieviesta tikai daļÄji (piemÄram, nav atbalsta pielÄgotiem datu tipiem, bez kuriem nevarÄsit izmantot Decimal - jaunu datu tipu, kas ieviests Tarantool 2.3) un tam ir citu skaits problÄmas (tostarp saderÄ«bas problÄmas ar PHP 7.4). Nu vispÄr projekts izskatÄs pamests.
KÄ redzams diagrammÄ, PECL savienotÄjs (Tarantool) parÄda labÄku veiktspÄju, salÄ«dzinot ar PHP savienotÄju (klientu). Bet tas nav pÄrsteidzoÅ”i, Åemot vÄrÄ, ka pÄdÄjais, papildus tam, ka tiek ieviests lÄnÄkÄ valodÄ, faktiski veic vairÄk darba: ar katru zvanu tiek izveidots jauns objekts PieprasÄ«t Šø Atbilde (IzvÄles gadÄ«jumÄ - arÄ« KritÄriji, un Update/Upsert gadÄ«jumÄ ā DarbÄ«bas), atseviŔķas vienÄ«bas saistÄ«ba, SaiÅotÄjs Šø Handler tie arÄ« pieskaita pieskaitÄmÄs izmaksas. AcÄ«mredzot elastÄ«bai ir sava cena. TomÄr kopumÄ PHP tulks uzrÄda labu sniegumu, lai gan ir atŔķirÄ«ba, tÄ ir niecÄ«ga un, iespÄjams, bÅ«s vÄl mazÄka, ja izmantos priekÅ”ielÄdÄÅ”anu PHP 7.4, nemaz nerunÄjot par JIT PHP 8.
Ejam tÄlÄk. Tarantool 2.0 pievienoja SQL atbalstu. MÄÄ£inÄsim veikt atlases, ievietoÅ”anas, atjauninÄÅ”anas un dzÄÅ”anas darbÄ«bas, izmantojot SQL protokolu, un salÄ«dzinÄt rezultÄtus ar noSQL (binÄrajiem) ekvivalentiem:
SQL rezultÄti nav Ä«paÅ”i iespaidÄ«gi (atgÄdinÄÅ”u, ka mÄs joprojÄm testÄjam sinhrono režīmu). TomÄr es par to neapvainotos pirms laika, SQL atbalsts joprojÄm ir aktÄ«va izstrÄdes stadijÄ (salÄ«dzinoÅ”i nesen, piemÄram, tika pievienots atbalsts sagatavoti paziÅojumi) un, spriežot pÄc saraksta jautÄjumi, SQL dzinÄjam nÄkotnÄ tiks veiktas vairÄkas optimizÄcijas.
AsinhronizÄcija
Nu, tagad redzÄsim, kÄ Async paplaÅ”inÄjums var mums palÄ«dzÄt uzlabot iepriekÅ” minÄtos rezultÄtus. Lai rakstÄ«tu asinhronas programmas, paplaÅ”inÄjums nodroÅ”ina API, kuras pamatÄ ir korutÄ«nas, kuras mÄs izmantosim. EmpÄ«riski noskaidrojam, ka optimÄlais korutÄ«nu skaits mÅ«su videi ir 25:
"Izplatiet" 10,000 25 operÄciju XNUMX korutÄ«nÄs un skatiet, kas notiek:
OperÄciju skaits sekundÄ palielinÄjÄs vairÄk nekÄ 3 reizes par tarantool-php/klients!
DiemžÄl PECL savienotÄjs nesÄkÄs ar ext-async.
KÄ ar SQL?
KÄ redzat, asinhronajÄ režīmÄ atŔķirÄ«ba starp binÄro protokolu un SQL kļuva kļūdas robežÄs.
Swoole
Atkal mÄs noskaidrojam optimÄlo korutÄ«nu skaitu, Å”oreiz Swoole:
ApstÄsimies pie 25. AtkÄrtosim to paÅ”u triku kÄ ar Async paplaÅ”inÄjumu ā sadaliet 10,000 25 operÄciju starp 2 korutÄ«nÄm. Papildus pievienosim vÄl vienu testu, kurÄ visu darbu sadalÄ«sim 5,000 divos procesos (tas ir, katrs process veiks 25 operÄcijas XNUMX korutÄ«nÄs). Procesi tiks izveidoti, izmantojot SwooleProcess.
RezultÄti:
Palaižot vienÄ procesÄ Swole uzrÄda nedaudz zemÄku rezultÄtu, salÄ«dzinot ar Async, bet ar 2 procesiem bilde krasi mainÄs (skaitlis 2 nav izvÄlÄts nejauÅ”i, manÄ maŔīnÄ tieÅ”i 2 procesi uzrÄdÄ«ja labÄko rezultÄtu).
Starp citu, Async paplaÅ”inÄjumam ir arÄ« API darbam ar procesiem, taÄu tur es nepamanÄ«ju nekÄdu atŔķirÄ«bu no etalonu palaiÅ”anas vienÄ vai vairÄkos procesos (iespÄjams, ka es kaut kur sajaucu).
SQL pret binÄro protokolu:
TÄpat kÄ ar Async, atŔķirÄ«ba starp binÄrajÄm un SQL operÄcijÄm tiek novÄrsta asinhronajÄ režīmÄ.
paralÄle
TÄ kÄ paralÄlais paplaÅ”inÄjums nav saistÄ«ts ar korutÄ«nÄm, bet gan par pavedieniem, izmÄrÄ«sim optimÄlo paralÄlo pavedienu skaitu:
ManÄ maŔīnÄ tas ir vienÄds ar 16. IzpildÄ«sim savienotÄja etalonus 16 paralÄlos pavedienos:
KÄ redzat, rezultÄts ir pat labÄks nekÄ ar asinhroniem paplaÅ”inÄjumiem (neskaitot Swoole, kas darbojas 2 procesos). Å emiet vÄrÄ, ka PECL savienotÄjam operÄcijas Update un Upsert ir tukÅ”as. Tas ir saistÄ«ts ar faktu, ka Ŕīs darbÄ«bas neizdevÄs ar kļūdu ā es nezinu, vai tÄ bija ext-parallel, ext-tarantool vai abu vaina.
Tagad salÄ«dzinÄsim SQL veiktspÄju:
Vai ievÄrojat lÄ«dzÄ«bu ar diagrammu savienotÄjiem, kas darbojas sinhroni?
KopÄ
Visbeidzot, apkoposim visus rezultÄtus vienÄ diagrammÄ, lai redzÄtu pÄrbaudÄ«to paplaÅ”inÄjumu kopÄjo ainu. Pievienosim diagrammai tikai vienu jaunu testu, ko mÄs vÄl neesam izdarÄ«juÅ”i - paralÄli palaist Async korutÄ«nas, izmantojot Parallel*. Ideja integrÄt iepriekÅ” minÄtos paplaÅ”inÄjumus jau ir tika apspriests autori, bet vienprÄtÄ«ba netika panÄkta, tas bÅ«s jÄdara paÅ”am.
* Nebija iespÄjams palaist Swoole korutÄ«nu ar Parallel; Ŕķiet, ka Å”ie paplaÅ”inÄjumi nav saderÄ«gi.
TÄtad, galÄ«gie rezultÄti:
TÄ vietÄ, lai noslÄgtu
ManuprÄt, rezultÄti izrÄdÄ«jÄs diezgan cienÄ«gi, un nez kÄpÄc esmu pÄrliecinÄts, ka tas nav ierobežojums! NeatkarÄ«gi no tÄ, vai reÄlÄ projektÄ tas ir jÄizlemj tikai un vienÄ«gi paÅ”am, es tikai teikÅ”u, ka man tas bija interesants eksperiments, kas ļauj novÄrtÄt, cik daudz jÅ«s varat āizspiestā no sinhronÄ TCP savienotÄja ar minimÄlu piepÅ«li. Ja jums ir idejas etalonu uzlaboÅ”anai, es ar prieku izskatÄ«Å”u jÅ«su pieprasÄ«jumu. Viss kods ar palaiÅ”anas instrukcijÄm un rezultÄtiem ir publicÄts atseviÅ”Ä·Ä sadaÄ¼Ä krÄtuves.