Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel

Yn ecosystem PHP ar hyn o bryd mae dau gysylltydd ar gyfer gweithio gyda gweinydd Tarantool - dyma'r estyniad PECL swyddogol tarantool/tarantool-php, a ysgrifenwyd yn C, a tarantool-php/client, wedi'i ysgrifennu yn PHP. Fi yw awdur yr olaf.

Yn yr erthygl hon, hoffwn rannu canlyniadau profion perfformiad y ddwy lyfrgell a dangos sut, gydag ychydig iawn o newidiadau i'r cod, y gallwch chi gyflawni cynnydd perfformiad 3-5 (ar brofion synthetig!).

Beth fyddwn ni'n ei brofi?

Byddwn yn profi'r rhai a grybwyllir uchod cydamserol cysylltwyr yn rhedeg yn asynchronously, yn gyfochrog, ac asyncronously-gyfochrog. πŸ™‚ Hefyd nid ydym am gyffwrdd Γ’ chod y cysylltwyr eu hunain. Ar hyn o bryd mae sawl estyniad ar gael i gyflawni'r hyn rydych chi ei eisiau:

  • Swoole - fframwaith asyncronaidd perfformiad uchel ar gyfer PHP. Defnyddir gan gewri Rhyngrwyd fel Alibaba a Baidu. Ers fersiwn 4.1.0 mae dull hud wedi ymddangos SwooleRuntime::enableCoroutine(), sy'n eich galluogi i β€œdrosi llyfrgelloedd rhwydwaith PHP cydamserol i rai asyncronig gydag un llinell o god.”
  • Tan yn ddiweddar roedd Async yn estyniad addawol iawn ar gyfer gwaith anghydamserol yn PHP. Pam tan yn ddiweddar? Yn anffodus, am reswm anhysbys i mi, fe wnaeth yr awdur ddileu'r ystorfa ac nid yw tynged y prosiect yn y dyfodol yn glir. Bydd yn rhaid i mi ei ddefnyddio yn Γ΄l un o ffyrch. Fel Swoole, mae'r estyniad hwn yn caniatΓ‘u ichi droi eich pants ymlaen yn hawdd gyda fflic o'r arddwrn i alluogi asyncroni trwy ddisodli gweithrediad safonol ffrydiau TCP a TLS gyda'u fersiynau asyncronig. Gwneir hyn drwy'r opsiwn β€œasync.tcp = 1".
  • Gyfochrog ― estyniad gweddol newydd gan yr adnabyddus Joe Watkins, awdur llyfrgelloedd fel phpdbg, apcu, pthreads, pcov, uopz. Mae'r estyniad yn darparu API ar gyfer aml-edau yn PHP ac mae wedi'i leoli yn lle edau pt. Cyfyngiad sylweddol ar y llyfrgell yw ei fod yn gweithio gyda'r fersiwn ZTS (Zend Thread Safe) o PHP yn unig.

Sut byddwn ni'n profi?

Gadewch i ni lansio enghraifft Tarantool gydag analluogi logio ysgrifennu ymlaen llaw (wal_mode = dim) a mwy o glustogfa rhwydwaith (darllen ymlaen = 1 * 1024 * 1024). Bydd yr opsiwn cyntaf yn dileu gwaith gyda'r ddisg, bydd yr ail yn ei gwneud hi'n bosibl darllen mwy o geisiadau o glustogfa'r system weithredu a thrwy hynny leihau nifer y galwadau system.

Ar gyfer meincnodau sy'n gweithio gyda data (mewnosod, dileu, darllen, ac ati), cyn dechrau'r meincnod, bydd gofod memtx yn cael ei (ail)greu, lle mae'r gwerthoedd mynegai cynradd yn cael eu creu gan gynhyrchydd o werthoedd cyfanrif trefnedig . (dilyniant).
Mae'r gofod DDL yn edrych fel hyn:

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

Os oes angen, cyn rhedeg y meincnod, mae'r gofod wedi'i lenwi Γ’ 10,000 o dwples y ffurflen

{id, "tuplΠ΅_<id>"}

Ceir mynediad i Tuples gan ddefnyddio gwerth bysell ar hap.

Mae'r meincnod ei hun yn gais unigol i'r gweinydd, sy'n cael ei weithredu 10,000 o weithiau (chwyldroadau), sydd, yn eu tro, yn cael eu gweithredu mewn iteriadau. Mae'r iteriadau'n cael eu hailadrodd nes bod yr holl wyriadau amser rhwng 5 iteriad o fewn gwall derbyniol o 3%*. Ar Γ΄l hyn, cymerir y canlyniad cyfartalog. Mae saib o 1 eiliad rhwng iteriadau i atal y prosesydd rhag gwthio. Mae casglwr sbwriel Lua yn anabl cyn pob iteriad ac yn cael ei orfodi i ddechrau ar Γ΄l iddo orffen. Mae'r broses PHP yn cael ei lansio gyda'r estyniadau angenrheidiol ar gyfer y meincnod yn unig, gyda byffro allbwn wedi'i alluogi a'r casglwr sbwriel yn anabl.

* Gellir newid nifer y chwyldroadau, iteriadau a throthwy gwallau yn y gosodiadau meincnod.

Amgylchedd prawf

Gwnaethpwyd y canlyniadau a gyhoeddir isod ar system weithredu MacBookPro (2015) - Fedora 30 (fersiwn cnewyllyn 5.3.8-200.fc30.x86_64). Lansiwyd Tarantool mewn docwr gyda'r paramedr "--network host".

Fersiynau pecyn:

Tarantool: 2.3.0-115-g5ba5ed37e
Dociwr: 19.03.3, adeiladu a872fc2f86
PHP: 7.3.11 (cli) (adeiladwyd: Oct 22 2019 08:11:04)
tarantool / cleient: 0.6.0
rybakit/msgpack: 0.6.1
est-tarantool: 0.3.2 (+ darn ar gyfer 7.3)*
est-msgpack: 2.0.3
est-async: 0.3.0-8c1da46
est-swoole: 4.4.12
est-gyfochrog: 1.1.3

* Yn anffodus, nid yw'r cysylltydd swyddogol yn gweithio gyda fersiwn PHP> 7.2. I lunio a rhedeg yr estyniad ar PHP 7.3, roedd yn rhaid i mi ddefnyddio clwt.

Canfyddiadau

Modd cydamserol

Mae protocol Tarantool yn defnyddio fformat deuaidd Pecyn Neges i gyfresoli negeseuon. Yn y cysylltydd PECL, mae cyfresoli wedi'i guddio'n ddwfn yn nyfnder y llyfrgell ac yn effeithio ar y broses amgodio o god tir y defnyddiwr nid yw'n ymddangos yn bosibl. Mae cysylltydd PHP pur, i'r gwrthwyneb, yn darparu'r gallu i addasu'r broses amgodio trwy ymestyn yr amgodiwr safonol neu trwy ddefnyddio'ch gweithrediad eich hun. Mae dau amgodiwr ar gael allan o'r bocs, mae un yn seiliedig arno msgpack/msgpack-php (estyniad swyddogol MessagePack PECL), mae'r llall ymlaen rybakit/msgpack (mewn PHP pur).

Cyn cymharu cysylltwyr, byddwn yn mesur perfformiad amgodyddion MessagePack ar gyfer y cysylltydd PHP ac mewn profion pellach byddwn yn defnyddio'r un sy'n dangos y canlyniad gorau:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Er bod y fersiwn PHP (Pur) yn israddol i'r estyniad PECL mewn cyflymder, mewn prosiectau go iawn byddwn yn dal i argymell ei ddefnyddio rybakit/msgpack, oherwydd yn yr estyniad MessagePack swyddogol dim ond yn rhannol y caiff y fanyleb fformat ei gweithredu'n rhannol (er enghraifft, nid oes cefnogaeth i fathau o ddata arferol, heb hynny ni fyddwch yn gallu defnyddio Degol - math data newydd a gyflwynwyd yn Tarantool 2.3) ac mae ganddo nifer o rai eraill problemau (gan gynnwys materion cydnawsedd Γ’ PHP 7.4). Wel, yn gyffredinol, mae'r prosiect yn edrych yn segur.

Felly, gadewch i ni fesur perfformiad cysylltwyr yn y modd cydamserol:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Fel y gwelir o'r graff, mae'r cysylltydd PECL (Tarantool) yn dangos perfformiad gwell o'i gymharu Γ’'r cysylltydd PHP (Cleient). Ond nid yw hyn yn syndod, o ystyried bod yr olaf, yn ogystal Γ’ chael ei weithredu mewn iaith arafach, mewn gwirionedd yn gwneud mwy o waith: mae gwrthrych newydd yn cael ei greu gyda phob galwad Cais ΠΈ Ymateb (yn achos Select - hefyd Meini Prawf, ac yn achos Update/Upsert ― Gweithrediadau), endidau ar wahΓ’n Cysylltiad, Packer ΠΈ handler maent hefyd yn ychwanegu gorbenion. Yn amlwg, daw hyblygrwydd am bris. Fodd bynnag, yn gyffredinol, mae'r dehonglydd PHP yn dangos perfformiad da, er bod gwahaniaeth, mae'n ddibwys ac, efallai, bydd hyd yn oed yn llai wrth ddefnyddio rhag-lwytho yn PHP 7.4, heb sΓ΄n am JIT yn PHP 8.

Gadewch i ni symud ymlaen. Cyflwynodd Tarantool 2.0 gefnogaeth SQL. Gadewch i ni geisio perfformio gweithrediadau Dewis, Mewnosod, Diweddaru a Dileu gan ddefnyddio'r protocol SQL a chymharu'r canlyniadau Γ’'r hyn sy'n cyfateb i noSQL (deuaidd):

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Nid yw canlyniadau SQL yn drawiadol iawn (gadewch imi eich atgoffa ein bod yn dal i brofi modd cydamserol). Fodd bynnag, ni fyddwn yn cynhyrfu am hyn o flaen amser; mae cymorth SQL yn dal i gael ei ddatblygu'n weithredol (yn gymharol ddiweddar, er enghraifft, ychwanegwyd cefnogaeth datganiadau parod) ac, a barnu wrth y rhestr materion, bydd yr injan SQL yn cael nifer o optimeiddiadau yn y dyfodol.

Cysoni

Wel, nawr gadewch i ni weld sut y gall yr estyniad Async ein helpu i wella'r canlyniadau uchod. I ysgrifennu rhaglenni asyncronig, mae'r estyniad yn darparu API yn seiliedig ar coroutines, y byddwn yn ei ddefnyddio. Rydyn ni'n darganfod yn empirig mai'r nifer gorau posibl o goroutines ar gyfer ein hamgylchedd yw 25:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
β€œLlaenu” 10,000 o lawdriniaethau ar draws 25 coroutines i weld beth sy'n digwydd:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Cynyddodd nifer y llawdriniaethau yr eiliad fwy na 3 gwaith ar gyfer tarantool-php/client!

Yn anffodus, ni ddechreuodd y cysylltydd PECL gydag ext-async.

Beth am SQL?

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Fel y gallwch weld, yn y modd asyncronaidd daeth y gwahaniaeth rhwng y protocol deuaidd a SQL o fewn yr ymyl gwall.

Swoole

Unwaith eto rydym yn darganfod y nifer optimaidd o goroutines, y tro hwn ar gyfer Swoole:
Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Gadewch i ni stopio yn 25. Gadewch i ni ailadrodd yr un tric Γ’'r estyniad Async - dosbarthwch 10,000 o weithrediadau rhwng 25 coroutines. Yn ogystal, byddwn yn ychwanegu prawf arall lle byddwn yn rhannu'r holl waith yn 2 ddwy broses (hynny yw, bydd pob proses yn perfformio 5,000 o weithrediadau mewn 25 coroutines). Bydd prosesau'n cael eu creu gan ddefnyddio SwooleProcess.

Canlyniadau:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Mae Swole yn dangos canlyniad ychydig yn is o'i gymharu ag Async pan gaiff ei redeg mewn un broses, ond gyda 2 broses mae'r llun yn newid yn ddramatig (ni ddewiswyd y rhif 2 ar hap; ar fy mheiriant, 2 broses a ddangosodd y canlyniad gorau).

Gyda llaw, mae gan estyniad Async hefyd API ar gyfer gweithio gyda phrosesau, ond yno ni sylwais ar unrhyw wahaniaeth o redeg meincnodau mewn un neu fwy o brosesau (mae'n bosibl fy mod wedi gwneud llanast yn rhywle).

SQL vs protocol deuaidd:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Yn yr un modd ag Async, mae'r gwahaniaeth rhwng gweithrediadau deuaidd a SQL yn cael ei ddileu mewn modd asyncronig.

Gyfochrog

Gan nad yw'r estyniad Parallel yn ymwneud Γ’ choroutines, ond am edafedd, gadewch i ni fesur y nifer gorau posibl o edafedd cyfochrog:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Mae'n 16 ar fy mheiriant. Gadewch i ni redeg meincnodau cysylltwyr ar 16 edafedd cyfochrog:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Fel y gallwch weld, mae'r canlyniad hyd yn oed yn well na gydag estyniadau asyncronig (heb gyfrif Swoole yn rhedeg ar 2 broses). Sylwch, ar gyfer y cysylltydd PECL, bod y gweithrediadau Update and Upsert yn wag. Mae hyn oherwydd bod y gweithrediadau hyn wedi methu gyda gwall - nid wyf yn gwybod ai bai ext-parallel, ext-tarantool, neu'r ddau oedd y bai.

Nawr, gadewch i ni gymharu perfformiad SQL:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel
Sylwch ar y tebygrwydd Γ’'r graff ar gyfer cysylltwyr sy'n rhedeg yn gydamserol?

Gyda'n gilydd

Ac yn olaf, gadewch i ni grynhoi'r holl ganlyniadau mewn un graff i weld y darlun cyffredinol ar gyfer yr estyniadau a brofwyd. Gadewch i ni ychwanegu un prawf newydd yn unig i'r siart, nad ydym wedi'i wneud eto - gadewch i ni redeg coroutines Async yn gyfochrog gan ddefnyddio Parallel *. Mae'r syniad o integreiddio'r estyniadau uchod eisoes trafod awduron, ond ni ddaethpwyd i gonsensws, bydd yn rhaid i chi ei wneud eich hun.

* Nid oedd yn bosibl lansio coroutines Swoole gyda Parallel; mae'n ymddangos bod yr estyniadau hyn yn anghydnaws.

Felly, y canlyniadau terfynol:

Cyflymu cysylltwyr PHP ar gyfer Tarantool gan ddefnyddio Async, Swoole a Parallel

Yn hytrach na i gasgliad

Yn fy marn i, trodd y canlyniadau allan i fod yn eithaf teilwng, ac am ryw reswm rwy'n siΕ΅r nad dyma'r terfyn! P'un a oes angen i chi benderfynu hyn mewn prosiect go iawn i chi'ch hun yn unig, ni fyddaf ond yn dweud ei fod yn arbrawf diddorol i mi sy'n eich galluogi i werthuso faint y gallwch chi ei β€œwasgu” allan o gysylltydd TCP cydamserol heb fawr o ymdrech. Os oes gennych syniadau ar gyfer gwella meincnodau, byddaf yn hapus i ystyried eich cais tynnu. Cyhoeddir yr holl god gyda chyfarwyddiadau lansio a chanlyniadau mewn ar wahΓ’n storfeydd.

Ffynhonnell: hab.com

Ychwanegu sylw