{"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\/cs\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV ekosyst\u00e9mu PHP v sou\u010dasnosti existuj\u00ed dva konektory pro pr\u00e1ci se serverem Tarantool \u2015 ofici\u00e1ln\u00ed roz\u0161\u00ed\u0159en\u00ed PECL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, napsan\u00e9 v C, a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, napsan\u00e9 v PHP. Jsem autorem posledn\u00edho z nich.<\/p>\n<p>V tomto \u010dl\u00e1nku bych se cht\u011bl pod\u011blit o v\u00fdsledky testov\u00e1n\u00ed v\u00fdkonu obou knihoven a uk\u00e1zat, jak pomoc\u00ed minim\u00e1ln\u00edch zm\u011bn v k\u00f3du dos\u00e1hnout 3-5% n\u00e1r\u016fstu v\u00fdkonu (<i>na syntetick\u00fdch testech!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Co budeme testovat?<\/h2>\n<p>\nBudeme testovat v\u00fd\u0161e zm\u00edn\u011bn\u00e9 <i>synchronn\u00ed<\/i> konektory, spu\u0161t\u011bn\u00e9 asynchronn\u011b, paraleln\u011b a asynchronn\u011b-paraleln\u011b. \ud83d\ude42 Tak\u00e9 nechceme zasahovat do k\u00f3du samotn\u00fdch konektor\u016f. V tuto chv\u00edli je k dispozici n\u011bkolik roz\u0161\u00ed\u0159en\u00ed, kter\u00e1 umo\u017e\u0148uj\u00ed dos\u00e1hnout po\u017eadovan\u00e9ho:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2015 vysoce v\u00fdkonn\u00fd asynchronn\u00ed framework pro PHP. Pou\u017e\u00edvaj\u00ed ho internetov\u00ed giganti jako Alibaba a Baidu. Od verze 4.1.0 se objevil kouzeln\u00fd metod <i>SwooleRuntime::enableCoroutine()<\/i>, kter\u00fd \"jedn\u00edm \u0159\u00e1dkem k\u00f3du p\u0159etv\u00e1\u0159\u00ed synchronn\u00ed s\u00ed\u0165ov\u00e9 knihovny PHP na asynchronn\u00ed\".\n<\/li>\n<li>Async \u2015 a\u017e doned\u00e1vna velmi nad\u011bjn\u00e9 roz\u0161\u00ed\u0159en\u00ed pro asynchronn\u00ed pr\u00e1ci v PHP. Pro\u010d a\u017e doned\u00e1vna? Bohu\u017eel z nezn\u00e1m\u00e9ho d\u016fvodu autor odstranil repozit\u00e1\u0159 a dal\u0161\u00ed osud projektu je nejasn\u00fd. Budeme muset vyu\u017e\u00edt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">jednu<\/a><\/noindex> z fork\u016f. Stejn\u011b jako Swoole, toto roz\u0161\u00ed\u0159en\u00ed umo\u017e\u0148uje jedn\u00edm jednoduch\u00fdm gestem p\u0159etvo\u0159it b\u011b\u017enou implementaci TCP a TLS na jejich asynchronn\u00ed verze. To se prov\u00e1d\u00ed pomoc\u00ed volby &#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 pom\u011brn\u011b nov\u00e9 roz\u0161\u00ed\u0159en\u00ed od zn\u00e1m\u00e9ho Joe Watkinse, autora knihoven jako phpdbg, apcu, pthreads, pcov, uopz. Toto roz\u0161\u00ed\u0159en\u00ed poskytuje API pro v\u00edcetr\u00fdskov\u00e9 zpracov\u00e1n\u00ed v PHP a je prezentov\u00e1no jako n\u00e1hrada pthreads. Zna\u010dn\u00fdm omezen\u00edm knihovny je, \u017ee funguje pouze s verz\u00ed PHP ZTS (Zend Thread Safe).\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Jak budeme testovat?<\/h2>\n<p>\nSpust\u00edme instanci Tarantoolu s vypnut\u00fdm protokolem p\u0159edb\u011b\u017en\u00e9ho z\u00e1znamu (<i>wal_mode = none<\/i>) a zv\u00fd\u0161en\u00fdm s\u00ed\u0165ov\u00fdm bufferem (<i>readahead = 1 * 1024 * 1024<\/i>). Prvn\u00ed mo\u017enost vylou\u010d\u00ed pr\u00e1ci s diskem, druh\u00e1 umo\u017en\u00ed \u010d\u00edst v\u00edce dotaz\u016f z cache opera\u010dn\u00edho syst\u00e9mu a t\u00edm minimalizovat po\u010det syst\u00e9mov\u00fdch vol\u00e1n\u00ed.<\/p>\n<p>Pro benchmarky, kter\u00e9 pracuj\u00ed s daty (vkl\u00e1d\u00e1n\u00ed, maz\u00e1n\u00ed, \u010dten\u00ed atd.), bude p\u0159ed spu\u0161t\u011bn\u00edm benchmarku (p\u0159e)vytvo\u0159en memtx prostor, ve kter\u00e9m jsou hodnoty prim\u00e1rn\u00edho indexu vytv\u00e1\u0159eny gener\u00e1torem uspo\u0159\u00e1dan\u00fdch cel\u00fdch \u010d\u00edsel (sequence).<br \/>\nDDL prostoru vypad\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>\nPokud je to nutn\u00e9, p\u0159ed spu\u0161t\u011bn\u00edm benchmarku se prostor napln\u00ed 10 000 koryty ve tvaru<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_\"}<\/code><\/pre>\n<p>\nP\u0159\u00edstup ke koryt\u016fm se prov\u00e1d\u00ed pomoc\u00ed n\u00e1hodn\u00e9 hodnoty kl\u00ed\u010de.<\/p>\n<p>Samotn\u00fd benchmark p\u0159edstavuje jedin\u00fd dotaz na server, kter\u00fd se prov\u00e1d\u00ed 10 000kr\u00e1t (revoluc\u00ed), kter\u00e9 jsou prov\u00e1d\u011bny v iterac\u00edch. Iterace se opakuj\u00ed, dokud se v\u0161echny odchylky v \u010dase mezi 5 iteracemi nenach\u00e1zej\u00ed v r\u00e1mci p\u0159ijateln\u00e9 chyby 3 %*. Po tom se vezme pr\u016fm\u011brn\u00fd v\u00fdsledek. Mezi iteracemi je pauza 1 sekundu, aby se procesoru nedovolilo p\u0159ej\u00edt do throttlingu. Sb\u011bra\u010d odpadu Lua je vypnut p\u0159ed ka\u017edou iterac\u00ed a je donucen spu\u0161t\u011bn po jej\u00edm dokon\u010den\u00ed. PHP proces je spu\u0161t\u011bn pouze s nezbytn\u00fdmi roz\u0161\u00ed\u0159en\u00edmi pro benchmark, s povolen\u00fdm vyrovn\u00e1v\u00e1n\u00edm v\u00fdstupu a vypnut\u00fdm sb\u011bra\u010dem odpadu.<\/p>\n<p><i>* Po\u010det revoluc\u00ed, iterac\u00ed a prahov\u00e1 hodnota chyby mohou b\u00fdt zm\u011bn\u011bny v nastaven\u00edch benchmarku.<\/i><\/p>\n<h2>Testovac\u00ed prost\u0159ed\u00ed<\/h2>\n<p>\nN\u00ed\u017ee zve\u0159ejn\u011bn\u00e9 v\u00fdsledky byly po\u0159\u00edzeny na MacBooku Pro (2015), opera\u010dn\u00ed syst\u00e9m \u2014 Fedora 30 (verze j\u00e1dra 5.3.8-200.fc30.x86_64). Tarantool byl spu\u0161t\u011bn v Dockeru s parametrem &#171;<code>--network host\"<\/code>.<\/p>\n<p>Verze bal\u00ed\u010dk\u016f:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (postaven: 22. \u0159\u00edjna 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ patch pro 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>Bohu\u017eel, ofici\u00e1ln\u00ed konektor nefunguje s verz\u00ed PHP &gt; 7.2. Abychom kompilovali a spustili roz\u0161\u00ed\u0159en\u00ed na PHP 7.3, museli jsme vyu\u017e\u00edt <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patchem<\/a><\/noindex>.<\/i><\/p>\n<h2>V\u00fdsledky<\/h2>\n<p><\/p>\n<h4>Synchronn\u00ed re\u017eim<\/h4>\n<p>\nProtokol Tarantool vyu\u017e\u00edv\u00e1 bin\u00e1rn\u00ed form\u00e1t <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> pro serializaci zpr\u00e1v. V konektoru PECL je serializace skryta hluboko v \u00fatrob\u00e1ch knihovny a ovlivnit proces k\u00f3dov\u00e1n\u00ed z userland k\u00f3du <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">nen\u00ed mo\u017en\u00e9<\/a><\/noindex>. Konnektor na \u010dist\u00e9m PHP naopak poskytuje mo\u017enost p\u0159izp\u016fsoben\u00ed procesu k\u00f3dov\u00e1n\u00ed roz\u0161\u00ed\u0159en\u00edm standardn\u00edho kod\u00e9ru nebo mo\u017enost\u00ed pou\u017eit\u00ed vlastn\u00ed implementace. K dispozici jsou dva kod\u00e9r\u016f, jeden zalo\u017een\u00fd na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (ofici\u00e1ln\u00ed roz\u0161\u00ed\u0159en\u00ed MessagePack PECL), druh\u00fd - na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (na \u010dist\u00e9m PHP).<\/p>\n<p>P\u0159ed porovn\u00e1n\u00edm konektor\u016f zm\u011b\u0159\u00edme v\u00fdkon MessagePack kod\u00e9r\u016f pro PHP konektor a v dal\u0161\u00edch testech budeme pou\u017e\u00edvat ten, kter\u00fd uk\u00e1\u017ee nejlep\u0161\u00ed v\u00fdsledek:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nI kdy\u017e PHP verze (Pure) zaost\u00e1v\u00e1 za roz\u0161\u00ed\u0159en\u00edm PECL v rychlosti, v re\u00e1ln\u00fdch projektech bych p\u0159esto doporu\u010dil pou\u017e\u00edt pr\u00e1v\u011b <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, proto\u017ee v ofici\u00e1ln\u00edm roz\u0161\u00ed\u0159en\u00ed MessagePack je specifikace form\u00e1tu implementov\u00e1na pouze \u010d\u00e1ste\u010dn\u011b (nap\u0159\u00edklad nen\u00ed podpora u\u017eivatelsk\u00fdch typ\u016f dat, bez kter\u00e9 nebudete moci pou\u017e\u00edt Decimal - nov\u00fd typ dat p\u0159edstaven\u00fd v Tarantool 2.3) a m\u00e1 \u0159adu dal\u0161\u00edch <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">probl\u00e9mech<\/a><\/noindex> (v\u010detn\u011b probl\u00e9m\u016f s kompatibilitou s PHP 7.4). Celkov\u011b projekt vypad\u00e1 opu\u0161t\u011bn\u011b.<\/p>\n<p>Tak\u017ee zm\u011b\u0159\u00edme v\u00fdkon konektor\u016f v synchronn\u00edm re\u017eimu:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJak je vid\u011bt z grafu, konektor PECL (Tarantool) vykazuje lep\u0161\u00ed v\u00fdkon ne\u017e konektor na PHP (Client). Ale to nen\u00ed p\u0159ekvapiv\u00e9, vezmeme-li v \u00favahu, \u017ee posledn\u00ed, krom\u011b toho, \u017ee je implementov\u00e1n v pomalej\u0161\u00edm jazyce, vykon\u00e1v\u00e1 v podstat\u011b v\u00edce pr\u00e1ce: p\u0159i ka\u017ed\u00e9m vol\u00e1n\u00ed se vytv\u00e1\u0159\u00ed nov\u00fd objekt <i>Request<\/i> a <i>Odpov\u011b\u010f<\/i> (v p\u0159\u00edpad\u011b Select - je\u0161t\u011b i <i>Criteria<\/i>, a v p\u0159\u00edpad\u011b Update\/Upsert - <i>Operations<\/i>), jednotliv\u00e9 entity <i>Connection<\/i>, <i>Packer <\/i>a <i>Handler<\/i> tak\u00e9 p\u0159id\u00e1vaj\u00ed overhead. Je z\u0159ejm\u00e9, \u017ee za flexibilitu se plat\u00ed. Nicm\u00e9n\u011b, celkov\u011b PHP interpret vykazuje dobr\u00fd v\u00fdkon, i kdy\u017e rozd\u00edl je a nen\u00ed zanedbateln\u00fd, ale mo\u017en\u00e1 bude je\u0161t\u011b men\u0161\u00ed p\u0159i pou\u017eit\u00ed preloading v PHP 7.4, nemluv\u011b o JIT v PHP 8.<\/p>\n<p>Pokra\u010dujeme d\u00e1le. V Tarantool 2.0 byla p\u0159id\u00e1na podpora SQL. Zkus\u00edme prov\u00e9st operace Select, Insert, Update a Delete pomoc\u00ed SQL protokolu a porovnat v\u00fdsledky s noSQL (bin\u00e1rn\u00edmi) ekvivalenty:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u00fdsledky SQL nejsou p\u0159\u00edli\u0161 ohromuj\u00edc\u00ed (p\u0159ipom\u00edn\u00e1m, \u017ee st\u00e1le testujeme synchronn\u00ed re\u017eim). Nicm\u00e9n\u011b, nenechal bych se t\u00edmto tr\u00e1pit p\u0159ed\u010dasn\u011b, podpora SQL je st\u00e1le v aktivn\u00edm v\u00fdvoji (ned\u00e1vno nap\u0159\u00edklad p\u0159ibyla podpora <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) a podle seznamu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, SQL engine v budoucnu \u010dek\u00e1 \u0159ada optimalizac\u00ed.<\/p>\n<h4>Asynchronn\u00ed<\/h4>\n<p>\nNu\u017ee, pod\u00edvejme se nyn\u00ed, jak roz\u0161\u00ed\u0159en\u00ed Asynchronn\u00ed m\u016f\u017ee pomoci zlep\u0161it v\u00fd\u0161e uveden\u00e9 v\u00fdsledky. Pro psan\u00ed asynchronn\u00edch program\u016f roz\u0161\u00ed\u0159en\u00ed poskytuje API zalo\u017een\u00e9 na korutin\u00e1ch (coroutines), jich\u017e vyu\u017eijeme. Zjistili jsme, \u017ee optim\u00e1ln\u00ed po\u010det korutin pro na\u0161e prost\u0159ed\u00ed je 25:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u201eRozlo\u017e\u00edme\u201c 10 000 operac\u00ed mezi 25 korutin a pod\u00edv\u00e1me se, co jsme z\u00edskali:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPo\u010det operac\u00ed za sekundu se zv\u00fd\u0161il v\u00edce ne\u017e t\u0159ikr\u00e1t pro <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Bohu\u017eel, PECL konektor se nespustil s ext-async.<\/p>\n<p>A co SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJak vid\u00edte, v asynchronn\u00edm re\u017eimu je rozd\u00edl mezi bin\u00e1rn\u00edm protokolem a SQL v mez\u00edch chybovosti.<\/p>\n<h4>Swoole<\/h4>\n<p>\nOp\u011bt zji\u0161\u0165ujeme optim\u00e1ln\u00ed po\u010det korutin, tentokr\u00e1t pro Swoole:<br \/>\n<img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZ\u016fstaneme u \u010d\u00edsla 25. Opakujeme stejn\u00fd trik jako s roz\u0161\u00ed\u0159en\u00edm Asynchronn\u00ed \u2013 rozd\u011bl\u00edme 10 000 operac\u00ed mezi 25 korutin. Krom\u011b toho p\u0159id\u00e1me dal\u0161\u00ed test, ve kter\u00e9m rozd\u011bl\u00edme ve\u0161kerou pr\u00e1ci na 2 procesy (to znamen\u00e1, \u017ee ka\u017ed\u00fd proces provede 5 000 operac\u00ed v 25 korutin\u00e1ch). Procesy budou vytv\u00e1\u0159eny pomoc\u00ed <i>SwooleProcess<\/i>. <\/p>\n<p>V\u00fdsledky:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole vykazuje m\u00edrn\u011b ni\u017e\u0161\u00ed v\u00fdsledek ve srovn\u00e1n\u00ed s Asynchronn\u00edm p\u0159i spu\u0161t\u011bn\u00ed v jednom procesu, ale s 2 procesy se obraz radik\u00e1ln\u011b m\u011bn\u00ed (\u010d\u00edslo 2 bylo vybr\u00e1no nikoli n\u00e1hodou, na m\u00e9m stroji skute\u010dn\u011b 2 procesy uk\u00e1zaly nejlep\u0161\u00ed v\u00fdsledek).<\/p>\n<p><i>Mimochodem, v roz\u0161\u00ed\u0159en\u00ed Asynchronn\u00ed je tak\u00e9 API pro pr\u00e1ci s procesy, nicm\u00e9n\u011b jsem tam nezaznamenal \u017e\u00e1dn\u00fd rozd\u00edl mezi spu\u0161t\u011bn\u00edm benchmark\u016f v jednom \u010di v\u00edce procesech (nen\u00ed vylou\u010deno, \u017ee jsem n\u011bkde ud\u011blal chybu).<\/i><\/p>\n<p>SQL vs bin\u00e1rn\u00ed protokol:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStejn\u011b jako u Asynchronn\u00edho, rozd\u00edl mezi bin\u00e1rn\u00edmi a SQL operacemi se v asynchronn\u00edm re\u017eimu vyrovn\u00e1v\u00e1.<\/p>\n<h4>Parallel<\/h4>\n<p>\nProto\u017ee roz\u0161\u00ed\u0159en\u00ed Paraleln\u00ed nen\u00ed o korutin\u00e1ch, ale o vl\u00e1knech, zm\u011b\u0159\u00edme optim\u00e1ln\u00ed po\u010det paraleln\u00edch vl\u00e1ken:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTen je na m\u00e9m stroji 16. Spust\u00edme benchmarky konektor\u016f na 16 paraleln\u00edch vl\u00e1knech:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJak vid\u00edte, v\u00fdsledek je dokonce lep\u0161\u00ed ne\u017e s asynchronn\u00edmi roz\u0161\u00ed\u0159en\u00edmi (nepo\u010d\u00edtaje Swoole spu\u0161t\u011bn\u00e9m na 2 procesech). V\u0161imn\u011bte si, \u017ee pro konektor PECL na m\u00edst\u011b Update a Upsert operac\u00ed je pr\u00e1zdno. To je zp\u016fsobeno t\u00edm, \u017ee tyto operace selhaly s chybou \u2013 nev\u00edm, jestli je to vinou ext-parallel, ext-tarantool nebo obou.<\/p>\n<p>Nyn\u00ed porovn\u00e1me v\u00fdkon SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nV\u0161imli jste si podobnosti s grafem pro konektory spu\u0161t\u011bn\u00e9 synchronn\u011b?<\/p>\n<h4>V\u0161e dohromady<\/h4>\n<p>\nA nakonec shrneme v\u0161echny v\u00fdsledky do jednoho grafu, abychom vid\u011bli celkov\u00fd obr\u00e1zek pro testovan\u00e1 roz\u0161\u00ed\u0159en\u00ed. Na graf p\u0159id\u00e1me pouze jeden nov\u00fd test, kter\u00fd jsme je\u0161t\u011b ned\u011blali \u2014 spust\u00edme korutiny Async paraleln\u011b pomoc\u00ed Parallel*. My\u0161lenka integrace v\u00fd\u0161e zm\u00edn\u011bn\u00fdch roz\u0161\u00ed\u0159en\u00ed ji\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">byla diskutov\u00e1na<\/a><\/noindex> autory, av\u0161ak konsenzus nebyl dosa\u017een, bude to muset ud\u011blat s\u00e1m. <\/p>\n<p><i>* Spustit korutiny Swoole s Parallel se nepoda\u0159ilo, zd\u00e1 se, \u017ee tato roz\u0161\u00ed\u0159en\u00ed nejsou kompatibiln\u00ed.<\/i><\/p>\n<p>Tak\u017ee fin\u00e1ln\u00ed v\u00fdsledky:<\/p>\n<p><img decoding=\"async\" alt=\"Zrychlen\u00ed PHP konektor\u016f pro Tarantool s vyu\u017eit\u00edm Async, Swoole a Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Na z\u00e1v\u011br<\/h2>\n<p>\nPodle m\u011b jsou v\u00fdsledky velmi slu\u0161n\u00e9 a n\u011bjak\u00fdm zp\u016fsobem jsem si jist\u00fd, \u017ee to je\u0161t\u011b nen\u00ed konec! Je na v\u00e1s, zda to pot\u0159ebujete ve skute\u010dn\u00e9m projektu, \u0159eknu jen, \u017ee pro m\u011b to byl zaj\u00edmav\u00fd experiment, kter\u00fd umo\u017enil posoudit, kolik lze \"vyt\u011b\u017eit\" ze synchronn\u00edho TCP konektoru s minim\u00e1ln\u00edmi n\u00e1mahy. Pokud m\u00e1te n\u011bjak\u00e9 n\u00e1pady na zlep\u0161en\u00ed benchmark\u016f \u2014 r\u00e1d se pod\u00edv\u00e1m na v\u00e1\u0161 pull request. Cel\u00fd k\u00f3d s instrukcemi k spu\u0161t\u011bn\u00ed a v\u00fdsledky je publikov\u00e1n v samostatn\u00e9m <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repozit\u00e1\u0159e<\/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.3 - 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\/cs\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Zrychlujeme PHP konektory pro Tarantool pomoc\u00ed Async, Swoole a Parallel | ProHoster","description":"Ekosyst\u00e9mu PHP.","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}