{"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\/pl\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nW ekosystemie PHP obecnie istniej\u0105 dwa konektory do pracy z serwerem Tarantool \u2014 to oficjalne rozszerzenie PECL <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, napisane w C, oraz <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, napisane w PHP. Jestem autorem tego drugiego.<\/p>\n<p>W tym artykule chcia\u0142bym podzieli\u0107 si\u0119 wynikami testowania wydajno\u015bci obu bibliotek i pokaza\u0107, jak przy minimalnych zmianach w kodzie mo\u017cna osi\u0105gn\u0105\u0107 wzrost wydajno\u015bci o 3-5 (<i>na syntetycznych testach!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Co b\u0119dziemy testowa\u0107?<\/h2>\n<p>\nB\u0119dziemy testowa\u0107 wspomniane wy\u017cej <i>synchronizowane<\/i> konektory, uruchomione asynchronicznie, r\u00f3wnolegle i asynchronicznie-r\u00f3wnolegle. \ud83d\ude42 R\u00f3wnie\u017c nie chcemy zmienia\u0107 kodu samych konektor\u00f3w. Obecnie dost\u0119pnych jest kilka rozszerze\u0144, kt\u00f3re pozwalaj\u0105 osi\u0105gn\u0105\u0107 zamierzony cel:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2014 wysokowydajny asynchroniczny framework dla PHP. U\u017cywany przez takie giganty internetowe jak Alibaba i Baidu. Od wersji 4.1.0 pojawi\u0142a si\u0119 magiczna metoda <i>SwooleRuntime::enableCoroutine()<\/i>, kt\u00f3ra pozwala \u00abjednym wierszem kodu przekszta\u0142ci\u0107 synchronizowane biblioteki sieciowe PHP w asynchroniczne\u00bb.\n<\/li>\n<li>Async \u2014 do niedawna obiecuj\u0105ce rozszerzenie do asynchronicznej pracy w PHP. Dlaczego do niedawna? Niestety, z nieznanych mi powod\u00f3w, autor usun\u0105\u0142 repozytorium, a przysz\u0142o\u015b\u0107 projektu jest niepewna. B\u0119dziemy musieli skorzysta\u0107 z <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">jednego<\/a><\/noindex> z forka. Podobnie jak Swoole, to rozszerzenie pozwala w prosty spos\u00f3b zamieni\u0107 trwa\u0142o\u015b\u0107 na asynchroniczno\u015b\u0107, zast\u0119puj\u0105c standardow\u0105 implementacj\u0119 TCP i TLS ich asynchronicznymi wersjami. Dokonuje si\u0119 tego poprzez opcj\u0119 &#171;<i>async.tcp = 1<\/i>&#171;.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2014 do\u015b\u0107 nowe rozszerzenie od nie mniej znanego Joe Watkinsa, autora takich bibliotek jak phpdbg, apcu, pthreads, pcov, uopz. Rozszerzenie udost\u0119pnia API do wielow\u0105tkowej pracy w PHP i jest pozycjonowane jako alternatywa dla pthreads. Istotnym ograniczeniem biblioteki jest to, \u017ce dzia\u0142a tylko z wersj\u0105 PHP ZTS (Zend Thread Safe).\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Jak b\u0119dziemy testowa\u0107?<\/h2>\n<p>\nUruchomimy instancj\u0119 Tarantoola z wy\u0142\u0105czonym dziennikiem zapisu wst\u0119pnego (<i>wal_mode = none<\/i>) i zwi\u0119kszonym buforem sieciowym (<i>readahead = 1 * 1024 * 1024<\/i>). Pierwsza opcja wykluczy prac\u0119 z dyskiem, druga \u2014 umo\u017cliwi odczyt wi\u0119kszej liczby zapyta\u0144 z bufora systemu operacyjnego, minimalizuj\u0105c tym samym liczb\u0119 wywo\u0142a\u0144 systemowych.<\/p>\n<p>Dla benchmark\u00f3w, kt\u00f3re dzia\u0142aj\u0105 na danych (wstawianie, usuwanie, odczyt itp.) przed rozpocz\u0119ciem benchmarku b\u0119dzie (prze)tworzona przestrze\u0144 memtx, w kt\u00f3rej warto\u015bci indeksu pierwotnego s\u0105 generowane przez generator uporz\u0105dkowanych warto\u015bci liczb ca\u0142kowitych (sequence).<br \/>\nDDL przestrzeni wygl\u0105da tak:<\/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>\nW razie potrzeby, przed uruchomieniem benchmarku, przestrze\u0144 jest wype\u0142niana 10 000 krotkami rodzaju<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_&lt;id&gt;\"}<\/code><\/pre>\n<p>\nDost\u0119p do krotek realizowany jest na podstawie losowej warto\u015bci klucza.<\/p>\n<p>Sam benchmark stanowi pojedyncze zapytanie do serwera, kt\u00f3re wykonywane jest 10 000 razy (rewolucji), kt\u00f3re z kolei realizowane s\u0105 w iteracjach. Iteracje powtarzane s\u0105, dop\u00f3ki wszystkie odchylenia czasowe mi\u0119dzy 5 iteracjami nie b\u0119d\u0105 mie\u015bci\u0107 si\u0119 w dopuszczalnym b\u0142\u0119dzie wynosz\u0105cym 3 %*. Po tym brany jest \u015bredni wynik. Mi\u0119dzy iteracjami jest przerwa 1 sekundy, aby nie dopu\u015bci\u0107 do throttlingu procesora. Zbieracz \u015bmieci Lua jest wy\u0142\u0105czany przed ka\u017cd\u0105 iteracj\u0105 i wymuszenie uruchamiane po jej zako\u0144czeniu. Proces PHP uruchamiany jest tylko z niezb\u0119dnymi do benchmarku rozszerzeniami, z w\u0142\u0105czon\u0105 buforowaniem wyj\u015bcia i wy\u0142\u0105czonym zbieraczem \u015bmieci.<\/p>\n<p><i>* Liczba rewolucji, iteracji i pr\u00f3g b\u0142\u0119du mog\u0105 by\u0107 zmieniane w ustawieniach benchmarku.<\/i><\/p>\n<h2>\u015arodowisko testowe<\/h2>\n<p>\nOpublikowane poni\u017cej wyniki zosta\u0142y uzyskane na MacBooku Pro (2015), system operacyjny \u2014 Fedora 30 (wersja j\u0105dra 5.3.8-200.fc30.x86_64). Tarantool uruchamiano w dockerze z parametrem &#171;<code>--network host\"<\/code>.<\/p>\n<p>Wersje pakiet\u00f3w:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (zbudowany: Oct 22 2019 08:11:04)<br \/>\ntarantool\/client: 0.6.0<br \/>\nrybakit\/msgpack: 0.6.1<br \/>\next-tarantool: 0.3.2 (+ poprawka dla 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>Niestety, oficjalny konektor nie dzia\u0142a z wersj\u0105 PHP &gt; 7.2. Aby skompilowa\u0107 i uruchomi\u0107 rozszerzenie na PHP 7.3, trzeba by\u0142o skorzysta\u0107 z <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">\u0142atkami<\/a><\/noindex>.<\/i><\/p>\n<h2>Wyniki<\/h2>\n<p><\/p>\n<h4>Tryb synchroniczny<\/h4>\n<p>\nProtok\u00f3\u0142 Tarantoola u\u017cywa formatu binarnego <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> do serializacji wiadomo\u015bci. W konektorze PECL serializacja jest ukryta g\u0142\u0119boko w czelu\u015bciach biblioteki i nie mo\u017cna wp\u0142ywa\u0107 na proces kodowania z poziomu kodu userland. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">nie ma mo\u017cliwo\u015bci.<\/a><\/noindex>. Konektor w czystym PHP, przeciwnie, zapewnia mo\u017cliwo\u015b\u0107 dostosowania procesu kodowania poprzez rozszerzenie standardowego kodera lub mo\u017cliwo\u015b\u0107 wykorzystania w\u0142asnej implementacji. Z pude\u0142ka dost\u0119pne s\u0105 dwa kodery, z kt\u00f3rych jeden oparty jest na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (oficjalne rozszerzenie MessagePack PECL), a drugi \u2014 na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (na czystym PHP).<\/p>\n<p>Przed por\u00f3wnaniem konektor\u00f3w, zmierzmy wydajno\u015b\u0107 koder\u00f3w MessagePack dla konektora PHP i w dalszych testach zastosujemy ten, kt\u00f3ry osi\u0105gnie lepszy wynik:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nChocia\u017c wersja PHP (Pure) ust\u0119puje rozszerzeniu PECL pod wzgl\u0119dem szybko\u015bci, w rzeczywistych projektach nadal zaleca\u0142bym u\u017cywanie w\u0142a\u015bnie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, poniewa\u017c w oficjalnym rozszerzeniu MessagePack specyfikacja formatu zosta\u0142a zrealizowana jedynie cz\u0119\u015bciowo (na przyk\u0142ad brak wsparcia dla typ\u00f3w danych u\u017cytkownika, bez kt\u00f3rego nie b\u0119dziesz m\u00f3g\u0142 u\u017cy\u0107 Decimal \u2014 nowego typu danych wprowadzonego w Tarantool 2.3) i ma szereg innych <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">problemach<\/a><\/noindex> (w tym problemy z kompatybilno\u015bci\u0105 z PHP 7.4). Og\u00f3lnie projekt wygl\u0105da na porzucony.<\/p>\n<p>Zatem, zmierzmy wydajno\u015b\u0107 konektor\u00f3w w trybie synchronicznym:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJak wida\u0107 z wykresu, konektor PECL (Tarantool) pokazuje lepsz\u0105 wydajno\u015b\u0107 w por\u00f3wnaniu z konektorem w PHP (Client). Ale to nie jest zaskakuj\u0105ce, bior\u0105c pod uwag\u0119, \u017ce ostatni, opr\u00f3cz tego, \u017ce zosta\u0142 zaimplementowany w wolniejszym j\u0119zyku, wykonuje, w zasadzie, wi\u0119cej pracy: przy ka\u017cdym wywo\u0142aniu tworzy nowy obiekt <i>Request<\/i> i <i>Odpowied\u017a<\/i> (w przypadku Select \u2014 jeszcze i <i>Criteria<\/i>, a w przypadku Update\/Upsert \u2014 <i>Operations<\/i>), oddzielne byty <i>Connection<\/i>, <i>Packer <\/i>i <i>Handler<\/i> r\u00f3wnie\u017c dodaj\u0105 narzut. Oczywiste jest, \u017ce za elastyczno\u015b\u0107 trzeba p\u0142aci\u0107. Niemniej jednak, og\u00f3lnie rzecz bior\u0105c, interpreter PHP pokazuje dobr\u0105 wydajno\u015b\u0107, chocia\u017c r\u00f3\u017cnica istnieje, jest ona nieznaczna i by\u0107 mo\u017ce b\u0119dzie jeszcze mniejsza przy u\u017cyciu preloading w PHP 7.4, nie m\u00f3wi\u0105c ju\u017c o JIT w PHP 8.<\/p>\n<p>Przechodzimy dalej. W Tarantool 2.0 pojawi\u0142o si\u0119 wsparcie dla SQL. Spr\u00f3bujmy wykona\u0107 operacje Select, Insert, Update i Delete u\u017cywaj\u0105c protoko\u0142u SQL i por\u00f3wna\u0107 wyniki z noSQL (binarnymi) odpowiednikami:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWyniki SQL nie s\u0105 zbyt imponuj\u0105ce (przypominam, \u017ce wci\u0105\u017c testujemy tryb synchroniczny). Jednak nie s\u0105dz\u0119, aby warto by\u0142o si\u0119 tym martwi\u0107 za wcze\u015bnie, wsparcie dla SQL wci\u0105\u017c znajduje si\u0119 w aktywnym rozwoju (niedawno na przyk\u0142ad dodano wsparcie dla <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) i, s\u0105dz\u0105c po li\u015bcie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, silnik SQL czeka na szereg optymalizacji.<\/p>\n<h4>Async<\/h4>\n<p>\nC\u00f3\u017c, zobaczmy teraz, jak rozszerzenie Async mo\u017ce pom\u00f3c nam poprawi\u0107 wyniki powy\u017cej. Do pisania program\u00f3w asynchronicznych rozszerzenie udost\u0119pnia API oparte na korutynach (coroutines), z tego skorzystamy. Do\u015bwiadczeniem ustalamy, \u017ce optymalna liczba korutyn w naszym \u015brodowisku wynosi 25:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRozdzielamy 10,000 operacji na 25 korutyn i patrzymy, co si\u0119 wydarzy\u0142o:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLiczba operacji na sekund\u0119 wzros\u0142a ponad 3 razy dla <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Smutne, ale konektor PECL nie uruchomi\u0142 si\u0119 z ext-async.<\/p>\n<p>A co z SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJak wida\u0107, w trybie asynchronicznym r\u00f3\u017cnica mi\u0119dzy protoko\u0142em binarnym a SQL sta\u0142a si\u0119 w granicach b\u0142\u0119du.<\/p>\n<h4>Swoole<\/h4>\n<p>\nPonownie ustalamy optymaln\u0105 liczb\u0119 korutyn, tym razem dla Swoole:<br \/>\n<img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZatrzymujemy si\u0119 na 25. Powt\u00f3rzymy ten sam trick, co z rozszerzeniem Async - rozdzielimy 10,000 operacji mi\u0119dzy 25 korutynami. Ponadto, dodamy jeszcze test, w kt\u00f3rym podzielimy ca\u0142\u0105 prac\u0119 na 2 procesy (czyli ka\u017cdy proces b\u0119dzie wykonywa\u0142 5,000 operacji w 25 korutynach). Procesy b\u0119d\u0105 tworzone za pomoc\u0105 <i>SwooleProcess<\/i>. <\/p>\n<p>Wyniki:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwole pokazuje nieco ni\u017cszy wynik w por\u00f3wnaniu do Async przy uruchomieniu w jednym procesie, ale z 2 procesami sytuacja zmienia si\u0119 diametralnie (liczba 2 nie jest przypadkowa, na mojej maszynie w\u0142a\u015bnie 2 procesy pokaza\u0142y najlepszy wynik).<\/p>\n<p><i>Apropos, w rozszerzeniu Async r\u00f3wnie\u017c znajduje si\u0119 API do pracy z procesami, jednak nie zauwa\u017cy\u0142em jakiej\u015b r\u00f3\u017cnicy w uruchamianiu benchmark\u00f3w w jednym lub wielu procesach (nie wykluczone, \u017ce co\u015b popsu\u0142em).<\/i><\/p>\n<p>SQL vs protok\u00f3\u0142 binarny:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTak jak z Async, r\u00f3\u017cnica mi\u0119dzy operacjami binarnymi a SQL jest neutralizowana w trybie asynchronicznym.<\/p>\n<h4>Parallel<\/h4>\n<p>\nPoniewa\u017c rozszerzenie Parallel nie dotyczy korutyn, ale w\u0105tk\u00f3w, zmierzymy optymaln\u0105 liczb\u0119 r\u00f3wnoleg\u0142ych w\u0105tk\u00f3w:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWynosi ona 16 na mojej maszynie. Uruchomimy benchmarki konektor\u00f3w na 16 r\u00f3wnoleg\u0142ych w\u0105tkach:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJak widzicie, wynik jest nawet lepszy ni\u017c w przypadku asynchronicznych rozszerze\u0144 (nie licz\u0105c Swoole uruchomionego na 2 procesach). Zauwa\u017ccie, \u017ce dla konektora PECL w miejscu operacji Update i Upsert jest pusto. Jest to zwi\u0105zane z tym, \u017ce te operacje zako\u0144czy\u0142y si\u0119 b\u0142\u0119dem - nie wiem, czy to wina ext-parallel, ext-tarantool, czy obu.<\/p>\n<p>Teraz por\u00f3wnajmy wydajno\u015b\u0107 SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nZauwa\u017cyli\u015bcie podobie\u0144stwo do wykresu dla konektor\u00f3w uruchomionych synchronnie?<\/p>\n<h4>Wszystko razem<\/h4>\n<p>\nNa koniec zestawmy wszystkie wyniki w jednym wykresie, aby zobaczy\u0107 og\u00f3lny obraz testowanych rozszerze\u0144. Dodamy do wykresu tylko jeden nowy test, kt\u00f3rego jeszcze nie przeprowadzali\u015bmy \u2014 uruchomimy korutyny Async r\u00f3wnolegle przy pomocy Parallel*. Idea integracji wcze\u015bniej wspomnianych rozszerze\u0144 ju\u017c <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">by\u0142a omawiana<\/a><\/noindex> przez autor\u00f3w, jednak konsensus nie zosta\u0142 osi\u0105gni\u0119ty, b\u0119dziemy musieli zrobi\u0107 to samodzielnie. <\/p>\n<p><i>* Nie uda\u0142o si\u0119 uruchomi\u0107 korutyn Swoole z Parallel, wydaje si\u0119, \u017ce te rozszerzenia s\u0105 niekompatybilne.<\/i><\/p>\n<p>Oto finalne wyniki:<\/p>\n<p><img decoding=\"async\" alt=\"Przyspieszamy PHP-konektory do Tarantoola za pomoc\u0105 Async, Swoole i Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Zamiast zako\u0144czenia<\/h2>\n<p>\nMoim zdaniem wyniki s\u0105 bardzo obiecuj\u0105ce i mam jakie\u015b przeczucie, \u017ce to jeszcze nie koniec! Czy potrzebujesz tego w rzeczywistym projekcie, decydujesz wy\u0142\u0105cznie ty sam, powiem tylko, \u017ce dla mnie to by\u0142 interesuj\u0105cy eksperyment, kt\u00f3ry pozwoli\u0142 oceni\u0107, ile mo\u017cna \u201ewycisn\u0105\u0107\u201d z synchronizowanego TCP-\u0142\u0105cznika z minimalnym wysi\u0142kiem. Je\u015bli masz pomys\u0142y na ulepszenie benchmark\u00f3w \u2014 ch\u0119tnie rozwa\u017c\u0119 tw\u00f3j pull request. Ca\u0142y kod z instrukcjami uruchomienia i wynikami jest opublikowany w osobnym <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">repozytorium<\/a><\/noindex>.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Przyspieszamy PHP-\u0142\u0105czniki dla Tarantool przy pomocy Async, Swoole i Parallel | ProHoster","description":"Ekosystemie PHP.","canonical_url":"https:\/\/prohoster.info\/pl\/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":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}