{"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\/de\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel","title":{"rendered":"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a4bfc8a3f7f7de0298623b1bf9dcfc54.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn der PHP-\u00d6kosystem gibt es derzeit zwei Connectoren f\u00fcr die Arbeit mit dem Tarantool-Server \u2013 das offizielle PECL-Erweiterung <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, entwickelt in C, und <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, entwickelt in PHP. Ich bin der Autor letzterer.<\/p>\n<p>In diesem Artikel m\u00f6chte ich die Ergebnisse der Leistungstests beider Bibliotheken teilen und zeigen, wie man mit minimalen \u00c4nderungen im Code eine Steigerung der Leistung um 3-5 % erreichen kann (<i>bei synthetischen Tests!<\/i>).<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Was werden wir testen?<\/h2>\n<p>\nWir werden die oben genannten <i>synchronen<\/i> Connectoren testen, die asynchron, parallel und asynchron-parallel ausgef\u00fchrt werden. \ud83d\ude42 Au\u00dferdem wollen wir den Code der Connectoren selbst nicht anpassen. Derzeit gibt es mehrere Erweiterungen, die das gew\u00fcnschte Ziel erreichen k\u00f6nnen:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2013 ein hochleistungsf\u00e4higes asynchrones Framework f\u00fcr PHP. Es wird von Internet-Riesen wie Alibaba und Baidu verwendet. Seit Version 4.1.0 gibt es die magische Methode <i>SwooleRuntime::enableCoroutine()<\/i>, die es erm\u00f6glicht, \"mit einer einzigen Codezeile synchronen PHP-Netzwerkbibliotheken in asynchrone umzuwandeln.\"\n<\/li>\n<li>Async \u2015 bis vor kurzem ein vielversprechendes Erweiterung f\u00fcr die asynchrone Arbeit in PHP. Warum bis vor kurzem? Leider hat der Autor aus mir unbekannten Gr\u00fcnden das Repository gel\u00f6scht und die weitere Zukunft des Projekts ist unklar. Wir m\u00fcssen auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dreamsxin\/ext-async\">eine<\/a><\/noindex> aus Forks. Wie Swoole erm\u00f6glicht dieses Modul mit wenigen Handgriffen, sozusagen die Einschaltung der asynchronen Programmierung, indem die Standardimplementierungen von TCP und TLS durch ihre asynchronen Versionen ersetzt werden. Dies erfolgt \u00fcber die Option \u201e<i>async.tcp = 1<\/i>\u201e.\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\">Parallel<\/a><\/noindex> \u2015 eine relativ neue Erweiterung des bekannten Joe Watkins, der Bibliotheken wie phpdbg, apcu, pthreads, pcov und uopz entwickelt hat. Die Erweiterung bietet ein API f\u00fcr Multithreading in PHP und wird als Ersatz f\u00fcr pthreads positioniert. Ein wesentliches Limit dieser Bibliothek ist, dass sie nur mit der ZTS (Zend Thread Safe) Version von PHP funktioniert.\n<\/li>\n<\/ul>\n<p><\/p>\n<h2>Wie werden wir testen?<\/h2>\n<p>\nStarten wir eine Tarantool-Instanz mit deaktiviertem Pre-Write-Log (<i>wal_mode = none<\/i>) und mit einem vergr\u00f6\u00dferten Netzwerkpuffer (<i>readahead = 1 * 1024 * 1024<\/i>). Die erste Option schlie\u00dft die Arbeit mit der Festplatte aus, die zweite erm\u00f6glicht es, mehr Anfragen aus dem Puffer des Betriebssystems zu lesen und damit die Anzahl der Systemaufrufe zu minimieren.<\/p>\n<p>F\u00fcr Benchmarks, die mit Daten arbeiten (Einf\u00fcgen, L\u00f6schen, Lesen usw.), wird vor dem Start des Benchmarks ein Memtx-Space (neu) erstellt, in dem die Werte des Prim\u00e4rindex von einem Generator sortierter Ganzzahlwerte (Sequenz) erstellt werden.<br \/>\nDDL-Space sieht folgenderma\u00dfen aus:<\/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>\nNach Bedarf wird der Space vor dem Start des Benchmarks mit 10.000 Tupeln des Typs gef\u00fcllt<\/p>\n<pre><code class=\"lua\">{id, \"tuple_\"}<\/code><\/pre>\n<p>\nDer Zugriff auf die Tupel erfolgt \u00fcber einen zuf\u00e4lligen Schl\u00fcsselwert.<\/p>\n<p>Der Benchmark ist eine Einzelanfrage an den Server, die 10.000 Mal (Revolutions) ausgef\u00fchrt wird, die wiederum in Iterationen durchgef\u00fchrt werden. Die Iterationen werden wiederholt, bis alle Abweichungen in der Zeit zwischen 5 Iterationen innerhalb der zul\u00e4ssigen Toleranz von 3 % liegen*. Danach wird das Mittelwert-Ergebnis genommen. Zwischen den Iterationen gibt es eine Pause von 1 Sekunde, um zu verhindern, dass der Prozessor drosselt. Der Lua-Garbage-Collector wird vor jeder Iteration deaktiviert und nach Beendigung erzwungen. Der PHP-Prozess wird nur mit den f\u00fcr den Benchmark erforderlichen Erweiterungen gestartet, mit aktivierter Ausgabe-Pufferung und deaktiviertem Garbage Collector.<\/p>\n<p><i>* Die Anzahl der Revolutions, Iterationen und der Toleranzschwelle kann in den Benchmark-Einstellungen ge\u00e4ndert werden.<\/i><\/p>\n<h2>Testumgebung<\/h2>\n<p>\nDie nachfolgend ver\u00f6ffentlichten Ergebnisse wurden auf einem MacBook Pro (2015) mit dem Betriebssystem Fedora 30 (Kernel-Version 5.3.8-200.fc30.x86_64) durchgef\u00fchrt. Tarantool wurde in Docker mit der Option \u201e<code>--network host\"<\/code>.<\/p>\n<p>Paketversionen:<\/p>\n<p>Tarantool: 2.3.0-115-g5ba5ed37e<br \/>\nDocker: 19.03.3, build a872fc2f86<br \/>\nPHP: 7.3.11 (cli) (gebaut: 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\u00fcr 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>Leider funktioniert der offizielle Connector nicht mit PHP-Versionen &gt; 7.2. Um das Erweiterungspaket f\u00fcr PHP 7.3 zu kompilieren und auszuf\u00fchren, musste ich auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">einen Patch<\/a><\/noindex>.<\/i><\/p>\n<h2>Ergebnisse<\/h2>\n<p><\/p>\n<h4>Synchronmodus<\/h4>\n<p>\nDas Tarantool-Protokoll verwendet ein bin\u00e4res Format <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> zur Serialisierung von Nachrichten. In der PECL-Connector-Bibliothek ist die Serialisierung tief im Code verborgen, und es ist nicht m\u00f6glich, den Kodierungsprozess aus dem Userland-Code <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/issues\/89\">zu beeinflussen.<\/a><\/noindex>Der rein PHP-basierte Connector hingegen bietet die M\u00f6glichkeit, den Kodierungsprozess mithilfe des Standardcodierers oder durch die Verwendung einer eigenen Implementierung anzupassen. Standardm\u00e4\u00dfig sind zwei Codierer verf\u00fcgbar, einer basiert auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (das offizielle MessagePack PECL-Erweiterung), der andere auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex> (in reinem PHP).<\/p>\n<p>Bevor wir die Connectoren vergleichen, messen wir die Leistung der MessagePack-Codierer f\u00fcr den PHP-Connector, und in weiteren Tests werden wir den verwenden, der die besten Ergebnisse zeigt:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/a293ec51cb8bf18cb88df2dc276142c4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nObwohl die PHP-Version (Pure) in der Geschwindigkeit hinter der PECL-Erweiterung zur\u00fcckbleibt, w\u00fcrde ich in realen Projekten dennoch empfehlen, diese zu verwenden. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, da im offiziellen MessagePack-Erweiterung die Formatsspezifikation nur teilweise umgesetzt ist (zum Beispiel keine Unterst\u00fctzung f\u00fcr benutzerdefinierte Datentypen, ohne die Sie Decimal \u2014 einen neuen Datentyp, der in Tarantool 2.3 eingef\u00fchrt wurde \u2014 nicht verwenden k\u00f6nnen) und es auch noch einige andere <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">problemen<\/a><\/noindex> (einschlie\u00dflich Kompatibilit\u00e4tsprobleme mit PHP 7.4). Zudem wirkt das Projekt insgesamt verlassen.<\/p>\n<p>Nun, messen wir die Leistung der Connectoren im synchronen Modus:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/d8c5765956c62b927014ec4f26547820.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWie aus dem Diagramm hervorgeht, zeigt der PECL-Connector (Tarantool) eine bessere Leistung im Vergleich zum PHP-Connector (Client). Das ist auch nicht \u00fcberraschend, da letzterer nicht nur in einer langsameren Sprache implementiert ist, sondern auch insgesamt mehr Arbeit verrichtet: Bei jedem Aufruf wird ein neues Objekt erstellt <i>Request<\/i> und <i>Response<\/i> (im Falle von Select \u2014 auch <i>Criteria<\/i>, und im Falle von Update\/Upsert \u2014 <i>Operations<\/i>), separate Entit\u00e4ten <i>Verbindung<\/i>, <i>Packer <\/i>und <i>Handler<\/i> f\u00fcgen ebenfalls Overhead hinzu. Offensichtlich muss man f\u00fcr Flexibilit\u00e4t bezahlen. Insgesamt zeigt der PHP-Interpreter jedoch eine gute Leistung, auch wenn es Unterschiede gibt, sind diese gering und k\u00f6nnten mit Preloading in PHP 7.4 noch geringer ausfallen, ganz zu schweigen von JIT in PHP 8.<\/p>\n<p>Lass uns weitermachen. In Tarantool 2.0 gibt es nun Unterst\u00fctzung f\u00fcr SQL. Lassen Sie uns die Operationen Select, Insert, Update und Delete mit dem SQL-Protokoll durchf\u00fchren und die Ergebnisse mit den noSQL (bin\u00e4ren) \u00c4quivalenten vergleichen:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/cbc61697d9670dc7384c25de3c63c8d5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie SQL-Ergebnisse sind nicht besonders beeindruckend (ich erinnere daran, dass wir immer noch den synchronen Modus testen). Allerdings w\u00fcrde ich mich nicht vorzeitig dar\u00fcber \u00e4rgern, denn die SQL-Unterst\u00fctzung befindet sich noch in aktiver Entwicklung (vor nicht allzu langer Zeit wurde zum Beispiel die Unterst\u00fctzung f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/commit\/ff2091e09b5a7e9b7aa3f3e996dc7a06189889f3\">prepared statements<\/a><\/noindex>) hinzugef\u00fcgt, und laut der Liste <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool\/issues?q=is%3Aissue+is%3Aopen+sql+label%3Aperformance\">issues<\/a><\/noindex>, stehen dem SQL-Engine in Zukunft einige Optimierungen bevor.<\/p>\n<h4>Async<\/h4>\n<p>\nSchauen wir uns nun an, wie die Async-Erweiterung uns helfen kann, die oben genannten Ergebnisse zu verbessern. F\u00fcr das Schreiben asynchroner Programme bietet die Erweiterung eine API, die auf Koroutinen basiert, und genau das werden wir nutzen. Durch Versuch und Irrtum stellen wir fest, dass die optimale Anzahl von Koroutinen f\u00fcr unsere Umgebung 25 betr\u00e4gt:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4ceefef522b3bd91db7327c609ddda09.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWir \u201everteilen\u201c 10.000 Operationen auf 25 Koroutinen und sehen, was dabei herauskommt:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/916e461dfa5d1be08317e3703c267afe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDie Anzahl der Operationen pro Sekunde hat sich um mehr als das Dreifache erh\u00f6ht f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Es ist bedauerlich, aber der PECL-Connector ist mit ext-async nicht gestartet.<\/p>\n<p>Und was ist mit SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/39a0da214b893a217d9ae4eae23c4168.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWie Sie sehen, liegt im asynchronen Modus der Unterschied zwischen dem bin\u00e4ren Protokoll und SQL im Bereich der Messgenauigkeit.<\/p>\n<h4>Swoole<\/h4>\n<p>\nWir bestimmen erneut die optimale Anzahl an Koroutinen, diesmal f\u00fcr Swoole:<br \/>\n<img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/70d5bb26b91b7459e2f0b80a3fab7e06.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWir entscheiden uns f\u00fcr 25. Wir wiederholen den gleichen Trick wie mit der Async-Erweiterung \u2013 wir verteilen 10.000 Operationen auf 25 Koroutinen. Zus\u00e4tzlich f\u00fcgen wir einen weiteren Test hinzu, bei dem die gesamte Arbeit auf 2 Prozesse aufgeteilt wird (das hei\u00dft, jeder Prozess wird 5.000 Operationen in 25 Koroutinen ausf\u00fchren). Die Prozesse werden mithilfe von <i>SwooleProcess<\/i>. <\/p>\n<p>Ergebnisse:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/55f55d2661aa43ca3b6641abfff078a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSwole zeigt ein etwas niedrigeres Ergebnis im Vergleich zu Async bei der Ausf\u00fchrung in einem Prozess, aber mit 2 Prozessen \u00e4ndert sich das Bild drastisch (die Zahl 2 wurde nicht zuf\u00e4llig gew\u00e4hlt, auf meinem Rechner haben genau 2 Prozesse die besten Ergebnisse geliefert).<\/p>\n<p><i>\u00dcbrigens bietet die Async-Erweiterung ebenfalls eine API zur Arbeit mit Prozessen, allerdings habe ich da keinen Unterschied bei der Ausf\u00fchrung von Benchmarks in einem oder mehreren Prozessen bemerkt (es ist m\u00f6glich, dass ich irgendwo einen Fehler gemacht habe).<\/i><\/p>\n<p>SQL vs. bin\u00e4res Protokoll:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/dfa56be01ebba25edbec492838112778.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWie bei Async wird der Unterschied zwischen bin\u00e4ren und SQL-Operationen im asynchronen Modus nivelliert.<\/p>\n<h4>Parallel<\/h4>\n<p>\nDa die Parallel-Erweiterung nicht f\u00fcr Koroutinen, sondern f\u00fcr Threads gedacht ist, messen wir die optimale Anzahl paralleler Threads:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/acc6796d5731b0402ad6323e0f5bf38f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDiese betr\u00e4gt 16 auf meiner Maschine. Lassen Sie uns die Benchmarks der Connectoren mit 16 parallelen Threads durchf\u00fchren:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/03210b70f15e445fdd311a17c1034290.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nWie Sie sehen, ist das Ergebnis sogar besser als bei den asynchronen Erweiterungen (au\u00dfer Swoole, das auf 2 Prozessen l\u00e4uft). Beachten Sie, dass beim PECL-Connector bei den Update- und Upsert-Operationen nichts steht. Das h\u00e4ngt damit zusammen, dass diese Operationen mit einem Fehler ausgefallen sind \u2013 ich wei\u00df nicht, ob es am ext-parallel, ext-tarantool oder an beiden liegt.<\/p>\n<p>Lassen Sie uns nun die SQL-Leistung vergleichen:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/4be3025b424ad6485dc96968ce224bf5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHaben Sie die \u00c4hnlichkeit mit dem Diagramm f\u00fcr die synchron gestarteten Connectoren bemerkt?<\/p>\n<h4>Alles zusammen<\/h4>\n<p>\nUnd schlie\u00dflich fassen wir alle Ergebnisse in einem Diagramm zusammen, um das Gesamtbild der getesteten Erweiterungen zu sehen. Wir f\u00fcgen nur einen neuen Test zum Diagramm hinzu, den wir noch nicht durchgef\u00fchrt haben \u2013 wir werden die Async-Koroutinen parallel mit Parallel* starten. Die Idee, die oben genannten Erweiterungen zu integrieren, wurde bereits <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/krakjoe\/parallel\/issues\/25\">diskutiert<\/a><\/noindex> von den Autoren, jedoch wurde kein Konsens erzielt, sodass wir das selbst tun m\u00fcssen. <\/p>\n<p><i>* Die Koroutinen Swoole mit Parallel zu starten, war nicht m\u00f6glich, anscheinend sind diese Erweiterungen inkompatibel.<\/i><\/p>\n<p>Also, die finalen Ergebnisse:<\/p>\n<p><img decoding=\"async\" alt=\"Wir optimieren PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel\" src=\"\/wp-content\/uploads\/2019\/12\/85478d9dd5d8bd166f4aa91963c1af95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Abschlie\u00dfend<\/h2>\n<p>\nDie Ergebnisse erscheinen mir sehr vielversprechend, und ich bin mir irgendwie sicher, dass dies noch nicht das Ende ist! Ob Sie das in Ihrem tats\u00e4chlichen Projekt ben\u00f6tigen, m\u00fcssen Sie selbst entscheiden. Ich m\u00f6chte nur sagen, dass es f\u00fcr mich ein spannendes Experiment war, bei dem ich herausfinden konnte, wie viel man aus einem synchronen TCP-Connector mit minimalem Aufwand \u201eherausziehen\u201c kann. Wenn Sie Ideen zur Verbesserung der Benchmarks haben, schaue ich mir gerne Ihren Pull-Request an. Der gesamte Code mit Anweisungen zur Ausf\u00fchrung und den Ergebnissen ist in einem separaten <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">Repository<\/a><\/noindex>.<br \/>\n<br \/>Quelle: <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 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\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\" \/>\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\/de\/blog\/administrirovanie\/uskoryaem-php-konnektory-dlya-tarantool-s-pomoshhyu-async-swoole-i-parallel\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\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 \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/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\udd47PHP-Connectoren f\u00fcr Tarantool mit Async, Swoole und Parallel beschleunigen | ProHoster","description":"Im PHP-\u00d6kosystem gibt es derzeit zwei Connectoren, um mit dem Tarantool-Server zu arbeiten \u2013 das offizielle PECL-Erweiterung tarantool\/tarantool-php, das in C geschrieben ist, und tarantool-php\/client, das in PHP geschrieben wurde. Ich bin der Autor Letzterer. In diesem Artikel m\u00f6chte ich die Ergebnisse der Leistungsvergleiche beider Bibliotheken teilen und zeigen, wie man mit minimalen \u00c4nderungen im Code","canonical_url":"https:\/\/prohoster.info\/de\/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":"de_DE","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 \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","og:url":"https:\/\/prohoster.info\/de\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/53530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=53530"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/53530\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=53530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=53530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=53530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}