{"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\/sv\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI PHP-ekosystemet finns det f\u00f6r n\u00e4rvarande tv\u00e5 kopplingar f\u00f6r att arbeta med Tarantool-servern - det officiella PECL-till\u00e4gget <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, skrivet i C, och <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, skrivet i PHP. Jag \u00e4r f\u00f6rfattaren till det sistn\u00e4mnda.<\/p>\n<p>I den h\u00e4r artikeln t\u00e4nkte jag dela resultaten av prestandatestningen av b\u00e5da biblioteken och visa hur man med minimala kod\u00e4ndringar kan uppn\u00e5 en prestanda\u00f6kning p\u00e5 3-5<i>i syntetiska tester!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Vad ska vi testa?<\/h2>\n<p>\nVi kommer att testa de ovan n\u00e4mnda <i>synkrona<\/i> kopplingarna, k\u00f6rda asynkront, parallellt och asynkront-parallellt. \ud83d\ude42 Vi vill ocks\u00e5 undvika att r\u00f6ra kopplingarnas kod. F\u00f6r n\u00e4rvarande finns det flera till\u00e4gg som g\u00f6r det m\u00f6jligt att uppn\u00e5 \u00f6nskat resultat:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2013 en h\u00f6gpresterande asynkron ramverk f\u00f6r PHP. Anv\u00e4nds av internetj\u00e4ttar som Alibaba och Baidu. Fr\u00e5n version 4.1.0 finns det en magisk metod <i>SwooleRuntime::enableCoroutine()<\/i>, som m\u00f6jligg\u00f6r 'att med en rad kod omvandla synkrona n\u00e4tverksbibliotek i PHP till asynkrona'.\n<\/li>\n<li>Async \u2013 ett lovande till\u00e4gg f\u00f6r asynkron drift i PHP som fram till nyligen var popul\u00e4rt. Varf\u00f6r fram till nyligen? Tyv\u00e4rr har f\u00f6rfattaren av ok\u00e4nda sk\u00e4l tagit bort arkivet och projektets framtid \u00e4r os\u00e4ker. Vi f\u00e5r anv\u00e4nda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">ett<\/a><\/noindex> \u0438\u0437 \u0444\u043e\u0440\u043a\u043e\u0432. \u041a\u0430\u043a \u0438 Swoole, \u044d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u0438\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u0443\u043a\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0431\u0440\u044e\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 TCP \u0438 TLS \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438. \u0414\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 \u043e\u043f\u0446\u0438\u044e &#171;<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2013 ett ganska nytt till\u00e4gg fr\u00e5n den v\u00e4lk\u00e4nda Joe Watkins, skaparen av bibliotek som phpdbg, apcu, pthreads, pcov, uopz. Till\u00e4gget tillhandah\u00e5ller ett API f\u00f6r flertr\u00e5dad drift i PHP och marknadsf\u00f6rs som en ers\u00e4ttning f\u00f6r pthreads. Ett betydande begr\u00e4nsning av biblioteket \u00e4r att det endast fungerar med ZTS (Zend Thread Safe) versionen av PHP.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Hur ska vi testa?<\/h2>\n<p>\n\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Tarantool&#8217;\u0430 \u0441 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u043c \u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 (<i>wal_mode = none<\/i>) och en \u00f6kad n\u00e4tverksbuffer (<i>readahead = 1 * 1024 * 1024<\/i>). Det f\u00f6rsta alternativet eliminerar disk\u00e5tkomst, det andra ger m\u00f6jlighet att l\u00e4sa fler f\u00f6rfr\u00e5gningar fr\u00e5n operativsystemets buffer och d\u00e4rmed minimera antalet systemanrop.<\/p>\n<p>F\u00f6r benchmarktester som arbetar med data (infogning, borttagning, l\u00e4sning osv.) kommer en memtx-space att (\u00e5ter)skapas innan testet startar, d\u00e4r v\u00e4rdena f\u00f6r den prim\u00e4ra indexen skapas av en generator f\u00f6r ordnade heltalsv\u00e4rden (sequence).<br \/>\nDDL-space ser ut s\u00e5 h\u00e4r:<\/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>\nVid behov, innan benchmarktestet startar, fylls spacet med 10 000 tupler av typen<\/p>\n<pre><code class=\"lua\">{id, \"tuple_\"}<\/code><\/pre>\n<p>\n\u00c5tkomst till tuplerna sker med ett slumpm\u00e4ssigt v\u00e4rde av nyckeln.<\/p>\n<p>Sj\u00e4lva benchmarktestet best\u00e5r av en enskild beg\u00e4ran till servern, som utf\u00f6rs 10 000 g\u00e5nger (varv), vilket i sin tur utf\u00f6rs i iterationer. Iterationerna upprepas tills alla avvikelser i tiden mellan 5 iterationer \u00e4r inom en acceptabel felmarginal p\u00e5 3 %*. Efter det tas ett genomsnittligt resultat. Mellan iterationerna \u00e4r det en paus p\u00e5 1 sekund f\u00f6r att f\u00f6rhindra att processorn g\u00e5r in i throttling. Lua-skr\u00e4punsamlaren st\u00e4ngs av f\u00f6re varje iteration och tvingas att starta efter dess avslutande. PHP-processen startas endast med de n\u00f6dv\u00e4ndiga f\u00f6r benchmarktestet f\u00f6rl\u00e4ngningarna, med utdata-puffring aktiverad och skr\u00e4punsamlaren avst\u00e4ngd.<\/p>\n<p><i>* Antalet varv, iterationer och felgr\u00e4nser kan \u00e4ndras i inst\u00e4llningarna f\u00f6r benchmarktestet.<\/i><\/p>\n<h2>Testmilj\u00f6<\/h2>\n<p>\n\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u044b\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u043d\u0430 MacBookPro (2015), \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u2014 Fedora 30 (\u0432\u0435\u0440\u0441\u0438\u044f \u044f\u0434\u0440\u0430 5.3.8-200.fc30.x86_64). Tarantool \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u0432 \u0434\u043e\u043a\u0435\u0440\u0435 \u0432 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c &#171;<code>--network host\"<\/code>.<\/p>\n<p>Paketversioner:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (byggd: 22 okt 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ patch f\u00f6r 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>Tyv\u00e4rr fungerar den officiella kopplingen inte med PHP-versioner &gt; 7.2. F\u00f6r att kompilera och k\u00f6ra till\u00e4gget p\u00e5 PHP 7.3 var jag tvungen att anv\u00e4nda <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">patchen<\/a><\/noindex>.<\/i><\/p>\n<h2>Resultat<\/h2>\n<p><\/p>\n<h4>Synkront l\u00e4ge<\/h4>\n<p>\nTarantool-protokollet anv\u00e4nder ett bin\u00e4rt format <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> f\u00f6r serialisering av meddelanden. I PECL-kopplingen \u00e4r serialiseringen djupt g\u00f6md i bibliotekets inre och det \u00e4r inte m\u00f6jligt att p\u00e5verka kodningsprocessen fr\u00e5n userland-kod <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">inte \u00e4r m\u00f6jligt.<\/a><\/noindex>. En ren PHP-connector ger \u00e5 sin sida m\u00f6jlighet att anpassa kodningsprocessen antingen genom att utvidga standardkodaren eller genom att anv\u00e4nda sin egen implementering. Tv\u00e5 kodare finns tillg\u00e4ngliga fr\u00e5n b\u00f6rjan, en baserad p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (den officiella MessagePack PECL-till\u00e4gget), den andra p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (ren PHP).<\/p>\n<p>Innan vi j\u00e4mf\u00f6r connectorn, l\u00e5t oss m\u00e4ta prestandan hos MessagePack-kodare f\u00f6r PHP-connectorn och i de kommande testerna kommer vi anv\u00e4nda den som visar det b\u00e4sta resultatet:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTrots att PHP-versionen (Pure) \u00e4r l\u00e5ngsammare \u00e4n PECL-till\u00e4gget, skulle jag fortfarande rekommendera att anv\u00e4nda just <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, eftersom det officiella MessagePack-till\u00e4gget endast delvis implementerat formatets specifikation (till exempel finns inget st\u00f6d f\u00f6r anv\u00e4ndardefinierade datatyper, vilket g\u00f6r att du inte kan anv\u00e4nda Decimal \u2013 en ny datatyp som introducerades i Tarantool 2.3) och har en rad andra <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">av problem<\/a><\/noindex> (inklusive kompatibilitetsproblem med PHP 7.4). Dessutom ser projektet i allm\u00e4nhet \u00f6vergivet ut.<\/p>\n<p>S\u00e5, l\u00e5t oss m\u00e4ta prestandan hos connectorn i synkront l\u00e4ge:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSom man kan se fr\u00e5n diagrammet visar PECL-connectorn (Tarantool) b\u00e4ttre prestanda j\u00e4mf\u00f6rt med PHP-connectorn (Client). Men detta \u00e4r inte f\u00f6rv\u00e5nande, med tanke p\u00e5 att den senare, f\u00f6rutom att den \u00e4r implementerad i ett l\u00e5ngsammare spr\u00e5k, g\u00f6r mer arbete: vid varje anrop skapas ett nytt objekt <i>Beg\u00e4ran<\/i> och <i>Response<\/i> (i fallet Select \u2013 \u00e4ven <i>Criteria<\/i>, och i fallet Update\/Upsert \u2013 <i>Operations<\/i>), separata entiteter <i>Connection<\/i>, <i>Packer <\/i>och <i>Handler<\/i> tillf\u00f6r ocks\u00e5 overhead. Det \u00e4r uppenbart att man f\u00e5r betala f\u00f6r flexibiliteten. Men generellt visar PHP-tolken bra prestanda, \u00e4ven om det finns en skillnad, men den \u00e4r obetydlig och kommer sannolikt att bli \u00e4nnu mindre vid anv\u00e4ndning av preloading i PHP 7.4, f\u00f6r att inte tala om JIT i PHP 8.<\/p>\n<p>L\u00e5t oss g\u00e5 vidare. I Tarantool 2.0 introducerades st\u00f6d f\u00f6r SQL. L\u00e5t oss f\u00f6rs\u00f6ka utf\u00f6ra operationerna Select, Insert, Update och Delete med hj\u00e4lp av SQL-protokollet och j\u00e4mf\u00f6ra resultaten med noSQL (bin\u00e4ra) motsvarigheter:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nResultaten fr\u00e5n SQL imponerar inte s\u00e5 mycket (jag p\u00e5minner om att vi fortfarande testar det synkrona l\u00e4get). Men jag skulle inte oroa mig f\u00f6r detta i f\u00f6rtid, st\u00f6d f\u00f6r SQL \u00e4r fortfarande under aktiv utveckling (relativt nyligen, till exempel, lades st\u00f6d f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) till, och judging efter listan <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, SQL-motorn v\u00e4ntar p\u00e5 en rad optimeringar.<\/p>\n<h4>Async<\/h4>\n<p>\nL\u00e5t oss nu se hur Async-till\u00e4gget kan hj\u00e4lpa oss att f\u00f6rb\u00e4ttra resultaten ovan. F\u00f6r att skriva asynkrona program erbjuder till\u00e4gget ett API baserat p\u00e5 korutiner (coroutines), som vi kommer att anv\u00e4nda. Genom f\u00f6rs\u00f6k har vi kommit fram till att det optimala antalet korutiner f\u00f6r v\u00e5r milj\u00f6 \u00e4r 25:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVi \"sprider ut\" 10,000 operationer \u00f6ver 25 korutiner och ser vad resultatet blev:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAntalet operationer per sekund \u00f6kade mer \u00e4n tre g\u00e5nger f\u00f6r <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Tyv\u00e4rr startade inte PECL-anslutningen med ext-async.<\/p>\n<p>Hur st\u00e5r det till med SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSom ni ser, i asynkront l\u00e4ge \u00e4r skillnaden mellan det bin\u00e4ra protokollet och SQL inom felmarginalen.<\/p>\n<h4>Swoole<\/h4>\n<p>\nVi unders\u00f6ker \u00e5ter det optimala antalet korutiner, nu f\u00f6r Swoole:<br \/>\n<img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVi stannar vid 25. Vi upprepar samma trick som med Async-till\u00e4gget \u2013 sprider 10,000 operationer mellan 25 korutiner. Dessutom l\u00e4gger vi till ett test d\u00e4r vi delar hela arbetet p\u00e5 2 processer (det vill s\u00e4ga varje process kommer att utf\u00f6ra 5,000 operationer i 25 korutiner). Processerna kommer att skapas med hj\u00e4lp av <i>SwooleProcess<\/i>. <\/p>\n<p>Resultat:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwoole visar n\u00e5got l\u00e4gre resultat j\u00e4mf\u00f6rt med Async vid k\u00f6rning i en process, men med 2 processer f\u00f6r\u00e4ndras bilden radikalt (siffran 2 valdes inte av en slump, p\u00e5 min maskin visade just 2 processer det b\u00e4sta resultatet).<\/p>\n<p><i>F\u00f6r \u00f6vrigt har Async-till\u00e4gget ocks\u00e5 ett API f\u00f6r att arbeta med processer, men jag har inte m\u00e4rkt n\u00e5gon skillnad mellan att k\u00f6ra benchmarktester i en eller flera processer (det \u00e4r m\u00f6jligt att jag kan ha gjort ett misstag n\u00e5gonstans).<\/i><\/p>\n<p>SQL mot det bin\u00e4ra protokollet:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPrecis som med Async, j\u00e4mnas skillnaden mellan bin\u00e4ra och SQL-operationer ut i asynkront l\u00e4ge.<\/p>\n<h4>Parallel<\/h4>\n<p>\nEftersom Parallel-till\u00e4gget inte handlar om korutiner utan om tr\u00e5dar, m\u00e4ter vi det optimala antalet parallella tr\u00e5dar:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDet \u00e4r 16 p\u00e5 min maskin. L\u00e5t oss k\u00f6ra benchmarktester p\u00e5 anslutningarna med 16 parallella tr\u00e5dar:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSom ni ser, \u00e4r resultatet till och med b\u00e4ttre \u00e4n med de asynkrona till\u00e4ggen (f\u00f6rutom Swoole som k\u00f6rdes p\u00e5 2 processer). Observera att f\u00f6r PECL-anslutningen \u00e4r f\u00e4ltet f\u00f6r Update och Upsert-operationer tomt. Detta beror p\u00e5 att dessa operationer misslyckades med ett fel \u2013 jag vet inte om det beror p\u00e5 ext-parallel, ext-tarantool eller b\u00e5da.<\/p>\n<p>Nu j\u00e4mf\u00f6r vi SQL-prestanda:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSer ni likheten med grafen f\u00f6r anslutningar som k\u00f6rdes synkront?<\/p>\n<h4>Allt tillsammans<\/h4>\n<p>\nTill sist, l\u00e5t oss sammanst\u00e4lla alla resultat i en graf f\u00f6r att se den \u00f6vergripande bilden f\u00f6r de testade till\u00e4ggen. Vi l\u00e4gger till ett nytt test p\u00e5 grafen, som vi inte har gjort tidigare \u2013 vi k\u00f6r Async-koroutiner parallellt med hj\u00e4lp av Parallel*. Id\u00e9n om att integrera de n\u00e4mnda till\u00e4ggen har redan <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">diskuterats<\/a><\/noindex> av f\u00f6rfattarna, men n\u00e5gon konsensus har \u00e4nnu inte n\u00e5tts. Vi f\u00e5r g\u00f6ra detta sj\u00e4lva. <\/p>\n<p><i>* Det gick inte att k\u00f6ra Swoole-koroutiner med Parallel, det verkar som om dessa till\u00e4gg \u00e4r inkompatibla.<\/i><\/p>\n<p>S\u00e5, de slutgiltiga resultaten:<\/p>\n<p><img decoding=\"async\" alt=\"Accelerera PHP-kopplingen f\u00f6r Tarantool med Async, Swoole och Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Avslutande<\/h2>\n<p>\nJag tycker resultaten \u00e4r ganska lovande, och jag \u00e4r \u00f6vertygad om att detta inte \u00e4r slutet! Huruvida detta \u00e4r n\u00e5got ni beh\u00f6ver i ert verkliga projekt, det avg\u00f6r ni helt sj\u00e4lva. Jag vill bara s\u00e4ga att detta var ett intressant experiment som ger en uppfattning om hur mycket man kan \"pressa\" ur en synkron TCP-anslutning med minsta m\u00f6jliga anstr\u00e4ngning. Om ni har id\u00e9er f\u00f6r att f\u00f6rb\u00e4ttra benchmarkningarna \u2013 jag ser g\u00e4rna \u00f6ver er pull request. All kod med instruktioner f\u00f6r k\u00f6rning och resultat har publicerats i ett separat <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">f\u00f6rr\u00e5det<\/a><\/noindex>.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Accelerera PHP-anslutningar f\u00f6r Tarantool med hj\u00e4lp av Async, Swoole och Parallel | ProHoster","description":"I PHP-ekosystemet.","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}