Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel

Sa PHP ecosystem adunay karon duha ka mga konektor alang sa pagtrabaho kauban ang Tarantool server - kini ang opisyal nga extension sa PECL tarantool/tarantool-php, gisulat sa C, ug tarantool-php/kliyente, gisulat sa PHP. Ako ang tagsulat sa ulahi.

Niini nga artikulo, gusto nakong ipaambit ang mga resulta sa pagsulay sa pasundayag sa duha ka librarya ug ipakita kung giunsa, nga adunay gamay nga pagbag-o sa code, mahimo nimong makab-ot ang 3-5 nga pagtaas sa pasundayag (sa sintetikong mga pagsulay!).

Unsay atong sulayan?

Atong sulayan ang mga gihisgutan sa ibabaw dungan mga konektor nga nagdagan nga asynchronously, parallel, ug asynchronously-parallel. πŸ™‚ Dili usab namo gusto nga hikapon ang code sa mga konektor mismo. Karon adunay daghang mga extension nga magamit aron makab-ot ang imong gusto:

  • Swoole ― usa ka high-performance asynchronous framework para sa PHP. Gigamit sa mga higante sa Internet sama sa Alibaba ug Baidu. Sukad sa bersyon 4.1.0 usa ka magic nga pamaagi ang nagpakita SwooleRuntime::enableCoroutine(), nga nagtugot kanimo sa "pag-convert sa mga synchronous PHP network library ngadto sa mga asynchronous nga adunay usa ka linya sa code."
  • Ang Async hangtod karon usa ka maayo kaayo nga extension alang sa asynchronous nga trabaho sa PHP. Nganong hangtod karon? Ikasubo, alang sa usa ka hinungdan nga wala nako nahibal-an, gitangtang sa tagsulat ang repository ug ang umaabot nga kapalaran sa proyekto dili klaro. Kinahanglan nako kini gamiton usa gikan sa mga tinidor. Sama sa Swoole, kini nga extension nagtugot kanimo nga dali nga ibalik ang imong karsones sa usa ka pitik sa pulso aron mahimo ang asynchrony pinaagi sa pag-ilis sa standard nga pagpatuman sa TCP ug TLS nga mga sapa sa ilang mga asynchronous nga bersyon. Gihimo kini pinaagi sa opsyon "async.tcp = 1".
  • Parallel ― usa ka medyo bag-ong extension gikan sa iladong Joe Watkins, tagsulat sa mga librarya sama sa phpdbg, apcu, pthreads, pcov, uopz. Ang extension naghatag ug API para sa multithreading sa PHP ug gipahimutang isip puli sa pthreads. Ang usa ka mahinungdanon nga limitasyon sa librarya mao nga kini magamit lamang sa ZTS (Zend Thread Safe) nga bersyon sa PHP.

Unsaon nato pagsulay?

Atong ilunsad ang usa ka pananglitan sa Tarantool nga adunay wala’y mahimo nga pagsulat sa unahan nga pag-log (wal_mode = wala) ug dugang nga buffer sa network (basaha sa unahan = 1 * 1024 * 1024). Ang una nga kapilian magwagtang sa trabaho sa disk, ang ikaduha maghimo nga posible nga mabasa ang daghang mga hangyo gikan sa operating system buffer ug sa ingon maminusan ang gidaghanon sa mga tawag sa sistema.

Alang sa mga benchmark nga nagtrabaho uban ang datos (pagsulud, pagtangtang, pagbasa, ug uban pa), sa wala pa magsugod ang benchmark, usa ka puwang sa memtx ang (pagbuhat pag-usab), diin ang panguna nga mga kantidad sa indeks gihimo sa usa ka generator sa gimando nga mga kantidad nga integer ​(sunod-sunod).
Ang space DDL ingon niini:

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

Kung gikinahanglan, sa dili pa ipadagan ang benchmark, ang luna mapuno sa 10,000 ka tuple sa porma.

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

Ang mga tuple ma-access gamit ang random key value.

Ang benchmark mismo usa ka hangyo sa server, nga gipatuman 10,000 ka beses (mga rebolusyon), nga, sa baylo, gipatuman sa mga pag-uli. Ang mga pag-uli gisubli hangtod sa tanan nga oras nga mga pagtipas tali sa 5 nga mga pag-usab naa sa usa ka madawat nga sayup nga 3% *. Human niini, ang kasagaran nga resulta gikuha. Adunay 1 segundos nga paghunong tali sa mga pag-uli aron mapugngan ang processor gikan sa pag-throttling. Ang garbage collector ni Lua na-disable sa dili pa ang matag pag-uli ug napugos sa pagsugod human kini makompleto. Ang proseso sa PHP gilunsad lamang sa mga extension nga gikinahanglan alang sa benchmark, nga ang output buffering gipagana ug ang garbage collector na-disabled.

* Ang gidaghanon sa mga rebolusyon, mga pag-uli ug sayup nga threshold mahimong mabag-o sa mga setting sa benchmark.

Pagsulay sa palibot

Ang mga resulta nga gipatik sa ubos gihimo sa MacBookPro (2015), operating system - Fedora 30 (kernel version 5.3.8-200.fc30.x86_64). Gilunsad ang Tarantool sa docker nga adunay parameter nga "--network host".

Mga bersyon sa package:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, paghimo og a872fc2f86
PHP: 7.3.11 (cli) (gitukod: Okt 22 2019 08:11:04)
tarantool/kliyente: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch para sa 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* Ikasubo, ang opisyal nga konektor dili molihok sa bersyon sa PHP> 7.2. Sa pag-compile ug pagpadagan sa extension sa PHP 7.3, kinahanglan nakong gamiton patch.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Synchronous nga mode

Ang Tarantool protocol naggamit ug binary format MessagePack aron ma-serialize ang mga mensahe. Sa PECL connector, ang serialization gitago sa kahiladman sa librarya ug makaapekto sa proseso sa pag-encode gikan sa userland code murag dili pwede. Ang usa ka purong PHP connector, sa sukwahi, naghatag sa abilidad sa pag-customize sa proseso sa pag-encode pinaagi sa pagpalapad sa standard encoder o pinaagi sa paggamit sa imong kaugalingong pagpatuman. Adunay duha ka mga encoder nga magamit sa gawas sa kahon, ang usa gibase sa msgpack/msgpack-php (opisyal nga MessagePack PECL extension), ang lain anaa na rybakit/msgpack (sa purong PHP).

Sa dili pa itandi ang mga konektor, atong sukdon ang performance sa MessagePack encoders para sa PHP connector ug sa dugang nga mga pagsulay atong gamiton ang usa nga nagpakita sa pinakamaayo nga resulta:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Bisan kung ang bersyon sa PHP (Pure) mas ubos sa PECL extension sa katulin, sa tinuud nga mga proyekto irekomenda gihapon nako ang paggamit niini rybakit/msgpack, tungod kay sa opisyal nga extension sa MessagePack ang espesipikasyon sa format partially implementar lamang (pananglitan, walay suporta alang sa custom data type, kung wala kini dili ka makagamit sa Decimal - usa ka bag-ong data type nga gipaila sa Tarantool 2.3) ug adunay gidaghanon sa uban mga problema (lakip ang mga isyu sa pagkaangay sa PHP 7.4). Aw, sa kinatibuk-an, ang proyekto morag gibiyaan.

Busa, atong sukdon ang performance sa mga connectors sa synchronous mode:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Ingon sa makita gikan sa graph, ang PECL connector (Tarantool) nagpakita sa mas maayo nga performance itandi sa PHP connector (Client). Apan dili kini katingad-an, tungod kay ang naulahi, dugang sa gipatuman sa usa ka hinay nga sinultian, sa tinuud naghimo labi pa nga trabaho: usa ka bag-ong butang ang gihimo sa matag tawag hangyo ΠΈ tubag (sa kaso sa Select - usab Mga criteria, ug sa kaso sa Update/Upsert ― Operations), bulag nga mga entidad Koneksyon, Packer ΠΈ Handler gidugang usab nila ang overhead. Dayag, ang pagka-flexible moabut sa usa ka presyo. Bisan pa, sa kinatibuk-an, ang PHP interpreter nagpakita sa maayo nga performance, bisan kung adunay kalainan, kini dili hinungdanon ug, tingali, mahimong mas gamay kung gamiton ang preloading sa PHP 7.4, wala pay labot ang JIT sa PHP 8.

Magpadayon ta. Gipaila sa Tarantool 2.0 ang suporta sa SQL. Atong sulayan ang pagbuhat sa Select, Insert, Update ug Delete gamit ang SQL protocol ug itandi ang mga resulta sa noSQL (binary) nga mga katumbas:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Ang mga resulta sa SQL dili kaayo impresibo (pahinumdoman ko ikaw nga gisulayan pa namon ang synchronous mode). Bisan pa, dili ako masuko bahin niini sa una; Ang suporta sa SQL anaa pa sa aktibo nga pag-uswag (bag-o lang, pananglitan, gidugang ang suporta andam nga mga pahayag) ug, sa paghukom sa listahan mga isyu, ang SQL engine moagi sa daghang mga pag-optimize sa umaabot.

async

Aw, karon atong tan-awon kon sa unsang paagi ang Async extension makatabang kanato sa pagpalambo sa mga resulta sa ibabaw. Sa pagsulat sa mga asynchronous nga programa, ang extension naghatag ug API base sa mga coroutine, nga among gamiton. Nahibal-an namon sa empirikal nga ang labing kaayo nga gidaghanon sa mga coroutine alang sa among palibot mao ang 25:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
"Ipakaylap" ang 10,000 ka operasyon sa 25 ka coroutine ug tan-awa kung unsa ang mahitabo:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Ang gidaghanon sa mga operasyon matag segundo misaka sa labaw pa kay sa 3 nga mga panahon alang sa tarantool-php/kliyente!

Ikasubo, ang PECL connector wala magsugod sa ext-async.

Unsa ang mahitungod sa SQL?

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Sama sa imong makita, sa asynchronous mode ang kalainan tali sa binary protocol ug SQL nahimong sulod sa margin of error.

Swoole

Pag-usab atong nahibal-an ang kamalaumon nga gidaghanon sa mga coroutine, niining panahona alang sa Swoole:
Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Mohunong ta sa 25. Usbon nato ang samang limbong sama sa extension sa Async - pag-apud-apod og 10,000 ka operasyon tali sa 25 ka coroutine. Dugang pa, magdugang kami og laing pagsulay diin among bahinon ang tanang trabaho ngadto sa 2 duha ka proseso (nga mao, ang matag proseso mohimo ug 5,000 ka operasyon sa 25 ka coroutine). Ang mga proseso himoon gamit ang SwooleProcess.

Resulta:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Ang swole nagpakita og gamay nga ubos nga resulta kumpara sa Async kung modagan sa usa ka proseso, apan sa 2 nga mga proseso ang hulagway mabag-o pag-ayo (ang numero 2 wala gipili nga sulagma; sa akong makina, kini 2 nga mga proseso nga nagpakita sa pinakamaayo nga resulta).

Pinaagi sa dalan, ang extension sa Async usab adunay usa ka API alang sa pagtrabaho sa mga proseso, apan didto wala ako nakamatikod sa bisan unsang kalainan gikan sa pagpadagan sa mga benchmark sa usa o daghan pa nga mga proseso (posible nga nasamok ako bisan diin).

SQL vs binary protocol:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Sama sa Async, ang kalainan tali sa binary ug SQL nga mga operasyon giwagtang sa asynchronous mode.

Parallel

Tungod kay ang Parallel extension dili bahin sa mga coroutine, apan bahin sa mga hilo, atong sukdon ang labing maayo nga gidaghanon sa parallel nga mga hilo:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Kini katumbas sa 16 sa akong makina. Atong ipadagan ang connector benchmarks sa 16 ka parallel threads:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Sama sa imong nakita, ang resulta mas maayo pa kaysa sa mga asynchronous nga mga extension (dili pag-ihap sa Swoole nga nagdagan sa 2 nga mga proseso). Timan-i nga alang sa PECL connector, ang Update ug Upsert nga mga operasyon walay sulod. Kini tungod sa kamatuoran nga kini nga mga operasyon napakyas nga adunay usa ka sayup - wala ko kahibalo kung kini ba ang sayup sa ext-parallel, ext-tarantool, o pareho.

Karon atong itandi ang performance sa SQL:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel
Matikdi ang pagkaparehas sa graph alang sa mga konektor nga nagdagan nga dungan?

Magkauban

Ug sa katapusan, atong i-summarize ang tanan nga mga resulta sa usa ka graph aron makita ang kinatibuk-ang hulagway alang sa gisulayan nga mga extension. Atong idugang ang usa lang ka bag-ong pagsulay sa tsart, nga wala pa nato mahimo - atong padaganon ang Async coroutines nga magkaparehas gamit ang Parallel*. Ang ideya sa pag-integrate sa mga extension sa ibabaw mao na gihisgutan mga tagsulat, apan walay consensus nga nakab-ot, kinahanglan nimo nga buhaton kini sa imong kaugalingon.

* Dili mahimo ang paglansad sa mga coroutine sa Swoole nga adunay Parallel; ingon og kini nga mga extension dili magkatugma.

Busa, ang katapusan nga mga resulta:

Pagpadali sa mga koneksyon sa PHP alang sa Tarantool gamit ang Async, Swoole ug Parallel

Kay sa usa ka konklusyon

Sa akong opinyon, ang mga resulta nahimo nga takus kaayo, ug sa pipila ka mga hinungdan sigurado ako nga dili kini ang limitasyon! Kung kinahanglan nimo nga magdesisyon niini sa usa ka tinuud nga proyekto alang lamang sa imong kaugalingon, isulti ko lang nga alang kanako kini usa ka makapaikag nga eksperimento nga nagtugot kanimo sa pagtimbang-timbang kung unsa ka daghan ang mahimo nimong "pagpit-os" gikan sa usa ka dungan nga TCP connector nga adunay gamay nga paningkamot. Kung naa kay mga ideya sa pagpaayo sa mga benchmark, malipay ko nga tagdon ang imong hangyo sa pagbitad. Ang tanan nga code nga adunay mga panudlo sa paglansad ug mga resulta gipatik sa usa ka lahi mga tipiganan.

Source: www.habr.com

Idugang sa usa ka comment