Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl

Nan ekosistèm PHP a gen kounye a de konektè pou travay ak sèvè Tarantool - sa a se ekstansyon ofisyèl PECL tarantool/tarantool-php, ekri nan C, ak tarantool-php/kliyan, ekri nan PHP. Mwen se otè lèt la.

Nan atik sa a, mwen ta renmen pataje rezilta tès pèfòmans tou de bibliyotèk yo epi montre kijan, avèk chanjman minimòm nan kòd la, ou ka reyalize yon ogmantasyon pèfòmans 3-5 (sou tès sentetik!).

Kisa nou pral teste?

Nou pral teste sa yo mansyone pi wo a synchrone konektè kouri asynchrone, an paralèl, ak asynchrone-paralèl. 🙂 Nou menm tou nou pa vle manyen kòd konektè yo tèt yo. Kounye a gen plizyè ekstansyon ki disponib pou reyalize sa ou vle:

  • Swoole ― yon fondasyon asynchrone wo-pèfòmans pou PHP. Itilize pa gran entènèt tankou Alibaba ak Baidu. Depi vèsyon 4.1.0 yon metòd majik parèt SwooleRuntime::enableCoroutine(), ki pèmèt ou "konvèti bibliyotèk rezo PHP synchrone an asynchrone bibliyotèk ak yon liy kòd."
  • Async te jiska dènyèman yon ekstansyon trè pwomèt pou travay asynchrone nan PHP. Poukisa jiska dènyèman? Malerezman, pou yon rezon enkoni pou mwen, otè a efase repozitwa a ak sò a nan lavni nan pwojè a se klè. Mwen pral oblije sèvi ak li youn soti nan fouchèt. Menm jan ak Swoole, ekstansyon sa a pèmèt ou fasilman vire pantalon ou ak yon ti koud nan ponyèt la pou pèmèt asynchrony pa ranplase aplikasyon estanda TCP ak TLS kouran ak vèsyon asynchrone yo. Sa a se fè atravè opsyon "async.tcp = 1".
  • Paralèl ― yon ekstansyon jistis nouvo soti nan byen koni Joe Watkins, otè bibliyotèk tankou phpdbg, apcu, pthreads, pcov, uopz. Ekstansyon an bay yon API pou multithreading nan PHP epi li pozisyone kòm yon ranplasman pou pthreads. Yon limit enpòtan nan bibliyotèk la se ke li sèlman travay ak ZTS (Zend Thread Safe) vèsyon PHP a.

Ki jan nou pral teste?

Ann lanse yon egzanp Tarantool ak anrejistreman ekri davans enfim (wal_mode = okenn) ak ogmante tanpon rezo (readhead = 1 * 1024 * 1024). Premye opsyon a pral elimine travay ak disk la, dezyèm lan pral fè li posib pou li plis demann nan tanpon sistèm operasyon an epi kidonk minimize kantite apèl sistèm lan.

Pou referans ki travay ak done (ensèsyon, efase, lekti, elatriye), anvan yo kòmanse referans lan, yo pral (re)kreye yon espas memtx, kote valè endèks prensipal yo kreye pa yon dèlko valè nonb antye ki òdone. (sekans).
DDL espas la sanble sa a:

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

Si sa nesesè, anvan ou kouri referans lan, espas la ranpli ak 10,000 tuple fòm nan.

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

Yo jwenn aksè nan tuple yo lè l sèvi avèk yon valè kle o aza.

Referans nan tèt li se yon demann sèl nan sèvè a, ki se egzekite 10,000 fwa (revolisyon), ki, nan vire, yo egzekite nan iterasyon. Iterasyon yo repete jiskaske tout devyasyon tan ant 5 iterasyon yo nan yon erè akseptab 3%*. Apre sa, rezilta mwayèn yo pran. Gen yon poz 1 segonn ant iterasyon yo anpeche processeur a soti nan throttling. Pèseptè fatra Lua a enfim anvan chak iterasyon epi li oblije kòmanse apre li fini. Pwosesis PHP a te lanse sèlman ak ekstansyon ki nesesè pou referans la, ak pwodiksyon tanpon pèmèt ak pèseptè fatra a enfim.

* Kantite revolisyon, iterasyon ak papòt erè ka chanje nan paramèt referans yo.

Anviwònman tès la

Rezilta yo pibliye anba a yo te fè sou yon MacBookPro (2015), sistèm opere - Fedora 30 (vèsyon nwayo 5.3.8-200.fc30.x86_64). Tarantool te lanse nan docker ak paramèt la "--network host".

Vèsyon pake:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, bati a872fc2f86
PHP: 7.3.11 (cli) (bati: 22 oktòb 2019 08:11:04)
tarantool/kliyan: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch pou 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ekst-paralèl: 1.1.3

* Malerezman, konektè ofisyèl la pa travay ak PHP vèsyon > 7.2. Pou konpile ak kouri ekstansyon an sou PHP 7.3, mwen te oblije itilize plak.

Jwenn

Mòd synchrone

Pwotokòl Tarantool itilize yon fòma binè MessagePack pou seri mesaj yo. Nan konektè PECL a, serializasyon kache byen fon nan pwofondè bibliyotèk la epi li afekte pwosesis kodaj ki soti nan kòd userland. pa sanble posib. Yon konektè PHP pi bon kalite, okontrè, bay kapasite nan Customize pwosesis la kodaj pa pwolonje ankode estanda a oswa lè l sèvi avèk pwòp aplikasyon ou. Gen de ankode ki disponib soti nan bwat la, youn ki baze sou msgpack/msgpack-php (Ofisyèl ekstansyon MessagePack PECL), lòt la se sou rybakit/msgpack (nan PHP pi).

Anvan konpare konektè, nou pral mezire pèfòmans ankode MessagePack pou konektè PHP a epi nan plis tès nou pral sèvi ak youn ki montre pi bon rezilta a:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Malgre ke vèsyon an PHP (Pure) se enferyè a ekstansyon an PECL nan vitès, nan pwojè reyèl mwen ta toujou rekòmande pou itilize li. rybakit/msgpack, paske nan ekstansyon ofisyèl MessagePack la se sèlman pasyèlman aplike spesifikasyon fòma (pa egzanp, pa gen okenn sipò pou kalite done koutim, san yo pa ou pa pral kapab sèvi ak Decimal - yon nouvo kalite done prezante nan Tarantool 2.3) epi li gen yon kantite lòt moun pwoblèm (ki gen ladan pwoblèm konpatibilite ak PHP 7.4). Oke, an jeneral, pwojè a sanble abandone.

Se konsa, an nou mezire pèfòmans konektè nan mòd synchrone:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Kòm ou ka wè nan graf la, konektè PECL (Tarantool) montre pi bon pèfòmans konpare ak konektè PHP (Kliyan). Men, sa a pa etone, bay lèt la, anplis ke yo te aplike nan yon lang pi dousman, aktyèlman fè plis travay: yon nouvo objè kreye ak chak apèl. Mande и Repons (nan ka Chwazi - tou Kritè pou, ak nan ka Mizajou/Remonte ― Operasyon), antite endividyèl yo Koneksyon, pakè и Handler yo ajoute tou anlè. Li evidan, fleksibilite vini nan yon pri. Sepandan, an jeneral, entèprèt PHP a montre bon pèfòmans, byenke gen yon diferans, li se ensiyifyan e, petèt, yo pral menm mwens lè w ap itilize preloading nan PHP 7.4, nou pa mansyone JIT nan PHP 8.

Ann avanse. Tarantool 2.0 te ajoute sipò pou SQL. Ann eseye fè operasyon Chwazi, Mete, Mizajou ak Efase lè l sèvi avèk pwotokòl SQL la epi konpare rezilta yo ak ekivalan noSQL (binè):

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Rezilta SQL yo pa trè enpresyonan (kite m fè w sonje ke nou toujou teste mòd synchrone). Sepandan, mwen pa ta fache sou sa davans sipò SQL toujou anba devlopman aktif (relativman dènyèman, pou egzanp, sipò yo te ajoute deklarasyon prepare) ak, jije pa lis la pwoblèm, motè SQL la pral sibi yon kantite optimize nan tan kap vini an.

async

Oke, kounye a ann wè ki jan ekstansyon Async la ka ede nou amelyore rezilta ki anwo yo. Pou ekri pwogram asynchrone, ekstansyon an bay yon API ki baze sou coroutines, ke nou pral itilize. Nou jwenn anpirik ke kantite pi bon nan koroutin pou anviwònman nou an se 25:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
"Gaye" 10,000 operasyon atravè 25 koroutin epi gade sa k ap pase:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Kantite operasyon pa segonn ogmante pa plis pase 3 fwa pou tarantool-php/kliyan!

Malerezman, konektè PECL a pa t kòmanse ak ext-async.

E SQL?

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Kòm ou ka wè, nan mòd asynchrone diferans ki genyen ant pwotokòl la binè ak SQL te vin nan maj la nan erè.

Swoole

Ankò nou jwenn kantite pi bon nan koroutin, fwa sa a pou Swoole:
Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Ann sispann nan 25. Ann repete menm trik ak ekstansyon Async - distribye 10,000 operasyon ant 25 coroutines. Anplis de sa, nou pral ajoute yon lòt tès kote nou pral divize tout travay la an 2 de pwosesis (sa vle di, chak pwosesis pral fè 5,000 operasyon nan 25 koroutin). Pwosesis yo pral kreye lè l sèvi avèk SwooleProcess.

Rezilta:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Swole montre yon rezilta yon ti kras pi ba konpare ak Async lè yo kouri nan yon sèl pwosesis, men ak 2 pwosesis foto a chanje dramatikman (nimewo a 2 pa te chwazi pa chans; sou machin mwen an, se te 2 pwosesis ki te montre rezilta a pi byen).

By wout la, ekstansyon Async la tou gen yon API pou travay ak pwosesis, men gen mwen pa t remake okenn diferans nan kouri referans nan youn oswa plis pwosesis (li posib ke mwen dezòd yon kote).

SQL vs pwotokòl binè:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Menm jan ak Async, diferans ki genyen ant operasyon binè ak SQL elimine nan mòd asynchrone.

Paralèl

Piske ekstansyon Paralèl la se pa sou coroutines, men sou fil, an nou mezire kantite pi bon fil paralèl:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Li se 16 sou machin mwen an. Ann kouri referans konektè sou 16 fil paralèl:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Kòm ou ka wè, rezilta a se menm pi bon pase ak ekstansyon asynchrone (pa konte Swoole kouri sou 2 pwosesis). Remake byen ke pou konektè PECL la, Mizajou ak Upsert operasyon yo vid. Sa a se akòz lefèt ke operasyon sa yo echwe ak yon erè - mwen pa konnen si li te fòt nan ext-paralèl, ext-tarantool, oswa toude.

Koulye a, ann konpare pèfòmans SQL:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl
Remake resanblans ak graf la pou konektè k ap fonksyone senkronize?

Ansanm

Epi finalman, ann rezime tout rezilta yo nan yon sèl graf pou wè foto an jeneral pou ekstansyon yo teste yo. Ann ajoute jis yon nouvo tès nan tablo a, sa nou poko fè - ann kouri Async coroutines an paralèl lè l sèvi avèk Paralèl *. Lide a nan entegre ekstansyon ki anwo yo deja te diskite otè, men pa gen konsansis te rive jwenn, ou pral gen fè li tèt ou.

* Li pa t posib pou lanse coroutines Swoole ak Paralèl, li sanble ke ekstansyon sa yo enkonpatib.

Se konsa, rezilta final yo:

Akselere konektè PHP pou Tarantool lè l sèvi avèk Async, Swoole ak Paralèl

Olye pou yo yon konklizyon

Nan opinyon mwen, rezilta yo te tounen soti yo dwe byen merite, ak pou kèk rezon mwen sèten ke sa a se pa limit la! Kit ou bezwen deside sa a nan yon pwojè reyèl sèlman pou tèt ou, mwen pral jis di ke pou mwen se te yon eksperyans enteresan ki pèmèt ou evalye konbyen lajan ou ka "peze" soti nan yon konektè TCP synchrone ak efò minim. Si ou gen lide pou amelyore referans, mwen pral kontan konsidere demann rale ou. Tout kòd ak enstriksyon lansman ak rezilta yo pibliye nan yon separe depo.

Sous: www.habr.com

Add nouvo kòmantè