{"id":53530,"date":"2019-12-04T00:00:00","date_gmt":"2019-12-03T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel"},"modified":"2020-02-18T14:01:26","modified_gmt":"2020-02-18T11:01:26","slug":"uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV ekosyst\u00e9me PHP v s\u00fa\u010dasnosti existuj\u00fa dve rozhrania na pr\u00e1cu so serverom Tarantool - ofici\u00e1lne roz\u0161\u00edrenie PECL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, nap\u00edsan\u00e9 v C, a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, nap\u00edsan\u00e9 v PHP. Som autorom toho druh\u00e9ho.<\/p>\n<p>V tomto \u010dl\u00e1nku by som sa chcel podeli\u0165 o v\u00fdsledky testovania v\u00fdkonu oboch kni\u017en\u00edc a uk\u00e1za\u0165, ako m\u00f4\u017eeme dosiahnu\u0165 3-5% zlep\u0161enie v\u00fdkonu pri minim\u00e1lnych zmen\u00e1ch v k\u00f3de (<i>na syntetick\u00fdch testoch!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>\u010co budeme testova\u0165?<\/h2>\n<p>\nBudeme testova\u0165 vy\u0161\u0161ie spomenut\u00e9 <i>synchronn\u00e9<\/i> rozhrania, spusten\u00e9 asynchr\u00f3nne, paralelne a asynchr\u00f3nne-paralelne. \ud83d\ude42 Taktie\u017e sa nechceme dot\u00fdka\u0165 k\u00f3du samotn\u00fdch rozhran\u00ed. V s\u00fa\u010dasnosti je k dispoz\u00edcii nieko\u013eko roz\u0161\u00edren\u00ed, ktor\u00e9 umo\u017e\u0148uj\u00fa dosiahnu\u0165 po\u017eadovan\u00fd v\u00fdsledok:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 vysoce v\u00fdkonn\u00fd asynchr\u00f3nny r\u00e1mec pre PHP. Pou\u017e\u00edva ho nieko\u013eko internetov\u00fdch gigantov ako Alibaba a Baidu. Od verzie 4.1.0 sa objavila \u010darovn\u00e1 met\u00f3da <i>SwooleRuntime::enableCoroutine()<\/i>, ktor\u00e1 \"jedn\u00fdm riadkom k\u00f3du pretransformuje synchronn\u00e9 sie\u0165ov\u00e9 kni\u017enice PHP na asynchr\u00f3nne\".\n<\/li>\n<li>Async \u2015 doned\u00e1vna ve\u013emi perspekt\u00edvne roz\u0161\u00edrenie pre asynchr\u00f3nnu pr\u00e1cu v PHP. Pre\u010do doned\u00e1vna? Bohu\u017eia\u013e, z nezn\u00e1meho d\u00f4vodu autor odstr\u00e1nil repozit\u00e1r a bud\u00facnos\u0165 projektu je nejasn\u00e1. Budeme musie\u0165 vyu\u017ei\u0165 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">jednu<\/a><\/noindex> z fork. Tak ako Swoole, toto roz\u0161\u00edrenie umo\u017e\u0148uje jednoduch\u00fdm pohybom ruky premeni\u0165 nohavice na asynchr\u00f3nne zmenou \u0161tandardnej implement\u00e1cie TCP a TLS pr\u00fadov na ich asynchr\u00f3nne verzie. Rob\u00ed sa to cez mo\u017enos\u0165 &#171;<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2015 pomerne nov\u00e9 roz\u0161\u00edrenie od zn\u00e1meho Joea Watkinsa, autora tak\u00fdch kni\u017en\u00edc ako phpdbg, apcu, pthreads, pcov, uopz. Roz\u0161\u00edrenie poskytuje API pre viacer\u00e9 vl\u00e1kna v PHP a je poziciovan\u00e9 ako n\u00e1hrada za pthreads. V\u00fdznamn\u00fdm obmedzen\u00edm kni\u017enice je, \u017ee funguje len s verziou PHP ZTS (Zend Thread Safe).\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ako budeme testova\u0165?<\/h2>\n<p>\nSpust\u00edme in\u0161tanciu Tarantoolu s vypnut\u00fdm \u017eurn\u00e1lom predbe\u017en\u00e9ho z\u00e1pisu (<i>wal_mode = none<\/i>) a zv\u00fd\u0161en\u00fdm sie\u0165ov\u00fdm bufferom (<i>readahead = 1 * 1024 * 1024<\/i>). Prv\u00e1 mo\u017enos\u0165 vyl\u00fa\u010di pr\u00e1cu s diskom, druh\u00e1 umo\u017en\u00ed \u010d\u00edta\u0165 viac po\u017eiadaviek z bufferu opera\u010dn\u00e9ho syst\u00e9mu a t\u00fdm minimalizova\u0165 po\u010det syst\u00e9mov\u00fdch volan\u00ed.<\/p>\n<p>Pre benchmarkov, ktor\u00e9 pracuj\u00fa s \u00fadajmi (vkladanie, odstra\u0148ovanie, \u010d\u00edtanie at\u010f.), sa pred spusten\u00edm benchmarku vytvor\u00ed (alebo znovu vytvor\u00ed) memtx-\u0161peci\u00e1l, v ktorom sa hodnoty prim\u00e1rneho indexu generuj\u00fa gener\u00e1torom usporiadan\u00fdch hodn\u00f4t cel\u00fdch \u010d\u00edsel (sequence).<br \/>\nDDL \u0161peci\u00e1lu vyzer\u00e1 takto:<\/p>\n<pre><code class=\"lua\">space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})\nspace:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})\nspace:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})<\/code><\/pre>\n<p>\nAk je to potrebn\u00e9, pred spusten\u00edm benchmarku sa \u0161peci\u00e1l napln\u00ed 10 000 k\u00f3piami typu<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_&lt;id&gt;\"}<\/code><\/pre>\n<p>\nPr\u00edstup k k\u00f3pi\u00e1m je zabezpe\u010den\u00fd pomocou n\u00e1hodnej hodnoty k\u013e\u00fa\u010da.<\/p>\n<p>S\u00e1m benchmark predstavuje jednotkov\u00fd dotaz na server, ktor\u00fd sa vykon\u00e1va 10 000-kr\u00e1t (revol\u00faci\u00ed), ktor\u00e9 sa vykon\u00e1vaj\u00fa v iter\u00e1ci\u00e1ch. Iter\u00e1cie sa opakuj\u00fa, k\u00fdm v\u0161etky odch\u00fdlky v \u010dase medzi 5 iter\u00e1ciami nebud\u00fa v r\u00e1mci pr\u00edpustnej chyby 3 %*. Po tom sa vezme priemern\u00fd v\u00fdsledok. Medzi iter\u00e1ciami je pauza 1 sekunda, aby procesor nepre\u0161iel do re\u017eimu zn\u00ed\u017eenia v\u00fdkonu. Zbieranie odpadu Lua je vypnut\u00e9 pred ka\u017edou iter\u00e1ciou a n\u00fatene spusten\u00e9 po jej dokon\u010den\u00ed. PHP proces sa sp\u00fa\u0161\u0165a iba s potrebn\u00fdmi roz\u0161\u00edreniami pre benchmark, s povolen\u00fdm vyrovn\u00e1vac\u00edm pam\u00e4\u0165ou a vypnut\u00fdm zbierac\u00edm mechanizmom.<\/p>\n<p><i>* Po\u010det revol\u00faci\u00ed, iter\u00e1ci\u00ed a prahov\u00e1 chyba je mo\u017en\u00e9 zmeni\u0165 v nastaveniach benchmarku.<\/i><\/p>\n<h2>Testovacie prostredie<\/h2>\n<p>\nZverejnen\u00e9 ni\u017e\u0161ie v\u00fdsledky boli z\u00edskan\u00e9 na MacBookPro (2015), opera\u010dn\u00fd syst\u00e9m \u2014 Fedora 30 (verzia jadra 5.3.8-200.fc30.x86_64). Tarantool bol spusten\u00fd v Dockeri s parametrom &#171;<code>--network host\"<\/code>.<\/p>\n<p>Verzie bal\u00edkov:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (postaven\u00e9: 22. okt\u00f3bra 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ oprava pre 7.3)*<br \/>\next-msgpack: 2.0.3<br \/>\next-async: 0.3.0-8c1da46<br \/>\next-swoole: 4.4.12<br \/>\next-parallel: 1.1.3<\/p>\n<p>* <i>\u017dia\u013e, ofici\u00e1lny konektor nefunguje s verziou PHP &gt; 7.2. Aby som skompiloval a spustil roz\u0161\u00edrenie na PHP 7.3, musel som pou\u017ei\u0165 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patchom<\/a><\/noindex>.<\/i><\/p>\n<h2>V\u00fdsledky<\/h2>\n<p><\/p>\n<h4>S\u00fa\u010dasn\u00fd re\u017eim<\/h4>\n<p>\nProtokol Tarantool pou\u017e\u00edva bin\u00e1rny form\u00e1t <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> na serializ\u00e1ciu spr\u00e1v. V konektore PECL je serializ\u00e1cia skryt\u00e1 hlboko v vrstve kni\u017enice a ovplyvni\u0165 proces k\u00f3dovania z userland-k\u00f3du <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">sa ned\u00e1.<\/a><\/noindex>Konektor na \u010disto PHP poskytuje mo\u017enos\u0165 prisp\u00f4sobenia procesu k\u00f3dovania roz\u0161\u00edren\u00edm \u0161tandardn\u00e9ho k\u00f3dova\u010da alebo mo\u017enos\u0165ou pou\u017eitia vlastnej implement\u00e1cie. Z krabice s\u00fa k dispoz\u00edcii dvaja k\u00f3dova\u010de, jeden zalo\u017een\u00fd na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (ofici\u00e1lne roz\u0161\u00edrenie MessagePack PECL), druh\u00fd \u2014 na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (na \u010disto PHP).<\/p>\n<p>Pred porovnan\u00edm konektorov zmerajme v\u00fdkon MessagePack k\u00f3dova\u010dov pre PHP konektor a v \u010fal\u0161\u00edch testoch budeme pou\u017e\u00edva\u0165 ten, ktor\u00fd uk\u00e1\u017ee najlep\u0161\u00ed v\u00fdsledok:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHoci PHP verzia (Pure) zaost\u00e1va roz\u0161\u00edreniu PECL z h\u013eadiska r\u00fdchlosti, v re\u00e1lnych projektoch by som aj tak odpor\u00fa\u010dal pou\u017e\u00edva\u0165 pr\u00e1ve <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, preto\u017ee v ofici\u00e1lnom roz\u0161\u00edren\u00ed MessagePack je \u0161pecifik\u00e1cia form\u00e1tu implementovan\u00e1 iba \u010diasto\u010dne (napr\u00edklad neexistuje podpora pou\u017e\u00edvate\u013esk\u00fdch typov \u00fadajov, bez ktor\u00fdch nebudete m\u00f4c\u0165 pou\u017ei\u0165 Decimal \u2014 nov\u00fd typ \u00fadajov, predstaven\u00fd v Tarantool 2.3) a m\u00e1 nieko\u013eko \u010fal\u0161\u00edch <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">probl\u00e9mom<\/a><\/noindex> (vr\u00e1tane probl\u00e9mov s kompatibilitou s PHP 7.4). A celkovo projekt vyzer\u00e1 zanedbane.<\/p>\n<p>Tak\u017ee zmerajme v\u00fdkon konektorov v synchronnom re\u017eime:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAko je vidie\u0165 z grafu, konektor PECL (Tarantool) ukazuje lep\u0161\u00ed v\u00fdkon v porovnan\u00ed s konektorom na PHP (Client). Ale to nie je prekvapuj\u00face, vzh\u013eadom na to, \u017ee posledn\u00fd, okrem toho, \u017ee je implementovan\u00fd na pomal\u0161om jazyku, vykon\u00e1va v podstate viac pr\u00e1ce: pri ka\u017edom volan\u00ed sa vytv\u00e1ra nov\u00fd objekt <i>Po\u017eiadavka<\/i> a <i>Response<\/i> (v pr\u00edpade Select \u2014 e\u0161te aj <i>Criteria<\/i>, a v pr\u00edpade Update\/Upsert \u2014 <i>Operations<\/i>), samostatn\u00e9 entity <i>Pripojenie<\/i>, <i>Packer <\/i>a <i>Handler<\/i> tie\u017e prid\u00e1vaj\u00fa overhead. Je zrejm\u00e9, \u017ee za flexibilitu sa plat\u00ed. Av\u0161ak, celkovo PHP interpret\u00e1tor ukazuje dobr\u00fd v\u00fdkon, aj ke\u010f rozdiel existuje, je nev\u00fdznamn\u00fd a mo\u017eno bude e\u0161te men\u0161\u00ed pri pou\u017eit\u00ed preloading v PHP 7.4, nehovoriac u\u017e o JIT v PHP 8.<\/p>\n<p>Pos\u00favame sa \u010falej. V Tarantool 2.0 sa objavila podpora SQL. Sk\u00fasme vykona\u0165 oper\u00e1cie Select, Insert, Update a Delete pomocou SQL protokolu a porovna\u0165 v\u00fdsledky s noSQL (bin\u00e1rnymi) ekvivalentmi:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u00fdsledky SQL nie s\u00fa ve\u013emi p\u00f4sobiv\u00e9 (pripom\u00ednam, \u017ee st\u00e1le testujeme synchronn\u00fd re\u017eim). Av\u0161ak, nemal by som by\u0165 z toho znepokojen\u00fd pred\u010dasne, podpora SQL je st\u00e1le v akt\u00edvnom v\u00fdvoji (relat\u00edvne ned\u00e1vno, napr\u00edklad, sa pridala podpora <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) a, s\u00fadiac pod\u013ea zoznamu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, SQL engine \u010dak\u00e1 na mno\u017estvo optimaliz\u00e1ci\u00ed.<\/p>\n<h4>Async<\/h4>\n<p>\nNo, pozrime sa, ako roz\u0161\u00edrenie Async m\u00f4\u017ee pom\u00f4c\u0165 zlep\u0161i\u0165 na\u0161e v\u00fdsledky vy\u0161\u0161ie. Na p\u00edsanie asynchr\u00f3nnych programov roz\u0161\u00edrenie poskytuje API zalo\u017een\u00e9 na korutin\u00e1ch (coroutines), ktor\u00e9 vyu\u017eijeme. Sk\u00fasenostne zist\u00edme, \u017ee optim\u00e1lny po\u010det korut\u00edn pre na\u0161e prostredie je 25:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRozde\u013eujeme 10,000 oper\u00e1ci\u00ed medzi 25 korut\u00edn a sledujeme, \u010do to prinieslo:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPo\u010det oper\u00e1ci\u00ed za sekundu vzr\u00e1stol viac ako trojn\u00e1sobne pre <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>\u017dia\u013e, konektor PECL sa nespustil s ext-async.<\/p>\n<p>A \u010do SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAko vid\u00edte, v asynchr\u00f3nnom re\u017eime sa rozdiel medzi bin\u00e1rnym protokolom a SQL dostal do medz\u00ed nepresnosti.<\/p>\n<h4>Swoole<\/h4>\n<p>\nOp\u00e4\u0165 zis\u0165ujeme optim\u00e1lny po\u010det korut\u00edn, tentokr\u00e1t pre Swoole:<br \/>\n<img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZostaneme na 25. Opakujeme ten ist\u00fd trik ako s roz\u0161\u00edren\u00edm Async \u2013 rozdel\u00edme 10,000 oper\u00e1ci\u00ed medzi 25 korut\u00edn. Okrem toho prid\u00e1me \u010fal\u0161\u00ed test, v ktorom rozdel\u00edme v\u0161etku pr\u00e1cu na 2 procesy (teda ka\u017ed\u00fd proces vykon\u00e1 5,000 oper\u00e1ci\u00ed v 25 korut\u00ednach). Procesy bud\u00fa vytvoren\u00e9 pomocou <i>SwooleProcess<\/i>. <\/p>\n<p>V\u00fdsledky:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwole ukazuje o nie\u010do ni\u017e\u0161\u00ed v\u00fdsledok v porovnan\u00ed s Async pri spusten\u00ed v jednom procese, ale pri 2 procesoch sa situ\u00e1cia radik\u00e1lne men\u00ed (\u010d\u00edslo 2 bolo vybran\u00e9 nie n\u00e1hodou, na mojom zariaden\u00ed pr\u00e1ve 2 procesy uk\u00e1zali najlep\u0161\u00ed v\u00fdsledok).<\/p>\n<p><i>Mimochodom, v roz\u0161\u00edren\u00ed Async je tie\u017e API na pr\u00e1cu s procesmi, ale tam som si nev\u0161imol \u017eiadny rozdiel medzi spusten\u00edm benchmarkingov v jednom alebo viacer\u00fdch procesoch (nie je vyl\u00fa\u010den\u00e9, \u017ee som niekde urobil chybu).<\/i><\/p>\n<p>SQL vs bin\u00e1rny protokol:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRovnako ako s Async, rozdiel medzi bin\u00e1rnymi a SQL oper\u00e1ciami sa vyrovn\u00e1va v asynchr\u00f3nnom re\u017eime.<\/p>\n<h4>Parallel<\/h4>\n<p>\nKe\u010f\u017ee roz\u0161\u00edrenie Parallel nie je o korutin\u00e1ch, ale o vl\u00e1knach, odmerajme optim\u00e1lny po\u010det paraleln\u00fdch vl\u00e1kien:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTen je 16 na m\u00f4jho zariaden\u00ed. Spust\u00edme benchmarky konektorov na 16 paraleln\u00fdch vl\u00e1knach:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAko vid\u00edte, v\u00fdsledok je dokonca lep\u0161\u00ed ako s asynchr\u00f3nnymi roz\u0161\u00edreniami (nepo\u010d\u00edtaj\u00fac Swoole spusten\u00e9 na 2 procesoch). V\u0161imnite si, \u017ee pre konektor PECL je na mieste oper\u00e1ci\u00ed Update a Upsert pr\u00e1zdno. To s\u00favis\u00ed s t\u00fdm, \u017ee tieto oper\u00e1cie spadli s chybou \u2013 neviem, \u010di za to m\u00f4\u017ee ext-parallel, ext-tarantool, alebo oboje.<\/p>\n<p>Teraz porovnajme v\u00fdkon SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u0161imli ste si podobnos\u0165 s grafom pre konektory spusten\u00e9 synchronne?<\/p>\n<h4>V\u0161etko dokopy<\/h4>\n<p>\nA nakoniec zhrnieme v\u0161etky v\u00fdsledky do jedn\u00e9ho grafu, aby sme videli celkov\u00fd obraz testovan\u00fdch roz\u0161\u00edren\u00ed. Na graf prid\u00e1me len jeden nov\u00fd test, ktor\u00fd sme e\u0161te nerobili \u2014 spust\u00edme Async korutiny paralelne pomocou Parallel*. My\u0161lienka integr\u00e1cie vy\u0161\u0161ie spomenut\u00fdch roz\u0161\u00edren\u00ed u\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">bola diskutovan\u00e1<\/a><\/noindex> autormi, av\u0161ak konsenzus nebol dosiahnut\u00fd, budeme musie\u0165 spravi\u0165 to sami. <\/p>\n<p><i>* Spusti\u0165 Swoole korutiny s Parallel sa nepodarilo, zd\u00e1 sa, \u017ee tieto roz\u0161\u00edrenia nie s\u00fa kompatibiln\u00e9.<\/i><\/p>\n<p>Tak\u017ee, fin\u00e1lne v\u00fdsledky:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Na z\u00e1ver<\/h2>\n<p>\nMysl\u00edm, \u017ee v\u00fdsledky s\u00fa celkom pote\u0161uj\u00face, a neviem pre\u010do, ale som presved\u010den\u00fd, \u017ee to e\u0161te nie je kone\u010dn\u00fd limit! \u010ci to potrebujete vo svojom skuto\u010dnom projekte, rozhodnete sa sami, poviem len, \u017ee pre m\u0148a to bol zauj\u00edmav\u00fd experiment, ktor\u00fd umo\u017enil pos\u00fadi\u0165, ko\u013eko sa d\u00e1 \u201evytiahnu\u0165\u201c zo synchronn\u00e9ho TCP konektora s minim\u00e1lnym \u00fasil\u00edm. Ak m\u00e1te n\u00e1pady na vylep\u0161enie benchmarkov, r\u00e1d pos\u00fadim v\u00e1\u0161 pull request. Cel\u00fd k\u00f3d s pokynmi na spustenie a v\u00fdsledkami je publikovan\u00fd v samostatnom <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repozit\u00e1ri<\/a><\/noindex>.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/478336\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c Tarantool \u2015 \u044d\u0442\u043e \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 PECL tarantool\/tarantool-php, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u043d\u0430 \u0421, \u0438 tarantool-php\/client, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 PHP. \u042f \u044f\u0432\u043b\u044f\u044e\u0441\u044c \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0435\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-53530","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.5 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c PHP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f Tarantool \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Async, Swoole \u0438 Parallel | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-03T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:01:26+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Zr\u00fdch\u013eujeme PHP konektory pre Tarantool pomocou Async, Swoole a Parallel | ProHoster","description":"V ekosyst\u00e9me PHP.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c PHP-\u043a\u043e\u043d\u043d\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f Tarantool \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Async, Swoole \u0438 Parallel | ProHoster","og:description":"\u0412 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0435 PHP.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-03T21:00:00+00:00","article:modified_time":"2020-02-18T11:01:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"53530","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 07:46:24","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:23:55","updated":"2026-01-24 07:46:24","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}