{"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 beschleunigen 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 beschleunigen 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 dies sind die offizielle PECL-Erweiterung <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\">tarantool\/tarantool-php<\/a><\/noindex>, geschrieben in C, und <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>, geschrieben in PHP. Ich bin der Autor letzterer.<\/p>\n<p>In diesem Artikel m\u00f6chte ich die Testergebnisse von beiden Bibliotheken teilen und zeigen, wie man mit minimalen \u00c4nderungen im Code eine Leistungssteigerung von 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 m\u00f6chten wir den Code der Connectoren selbst nicht ber\u00fchren. Derzeit stehen mehrere Erweiterungen zur Verf\u00fcgung, die das gew\u00fcnschte Ziel erreichen:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/swoole\/swoole-src\">Swoole<\/a><\/noindex> \u2013 ein leistungsstarker asynchroner Framework f\u00fcr PHP. Wird von Internet-Giganten 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 Netzwerkbibliotheken in PHP asynchrone zu verwandeln\".\n<\/li>\n<li>Async \u2013 bis vor kurzem eine vielversprechende Erweiterung f\u00fcr asynchrone Arbeiten 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 ungewiss. 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 Erweiterung, die Standardimplementierung von TCP und TLS durch ihre asynchronen Versionen zu ersetzen, um m\u00fchelos asynchronit\u00e4t zu integrieren. Dies geschieht \u00fcber die Option &#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 eine relativ neue Erweiterung vom nicht unbekannten Joe Watkins, dem Autor solcher Bibliotheken wie phpdbg, apcu, pthreads, pcov, uopz. Die Erweiterung bietet eine API f\u00fcr die Multithread-Arbeit in PHP und positioniert sich als Ersatz f\u00fcr pthreads. Eine wesentliche Einschr\u00e4nkung der 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>\nLassen Sie uns eine Instanz von Tarantool&#8217; mit deaktiviertem Journal f\u00fcr die Vorabaufzeichnung starten (<i>wal_mode = none<\/i>) und mit einem erh\u00f6hten 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 Betriebssystempuffer 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 Beginn des Benchmarks ein memtx-Space erstellt oder (wieder)hergestellt, in dem die Werte des Prim\u00e4rindexes durch einen Generator fortlaufender Ganzzahlen (Sequenz) erzeugt werden.<br \/>\nDas DDL des Spaces 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>\nFalls erforderlich, wird der Space vor dem Start des Benchmarks mit 10.000 Tupeln der Form<\/p>\n<pre><code class=\"lua\">{id, \"tupl\u0435_&lt;id&gt;\"}<\/code><\/pre>\n<p>\nDer Zugriff auf die Tupel erfolgt \u00fcber einen zuf\u00e4lligen Schl\u00fcsselwert.<\/p>\n<p>Der Benchmark selbst ist eine einzelne Anfrage an den Server, die 10.000 Mal (Revolutionen) ausgef\u00fchrt wird, die wiederum in Iterationen ausgef\u00fchrt werden. Die Iterationen werden wiederholt, bis alle Abweichungen in der Zeit zwischen 5 Iterationen innerhalb einer zul\u00e4ssigen Toleranz von 3 %* liegen. Danach wird ein Durchschnittswert genommen. Zwischen den Iterationen gibt es eine Pause von 1 Sekunde, um zu verhindern, dass der Prozessor ins Throttling \u00fcbergeht. Der Lua-Garbage-Collector wird vor jeder Iteration deaktiviert und nach deren Abschluss gezwungen gestartet. Der PHP-Prozess wird nur mit den f\u00fcr den Benchmark erforderlichen Erweiterungen gestartet, die Ausgabe-Pufferung ist aktiviert und der Garbage-Collector ist deaktiviert.<\/p>\n<p><i>* Die Anzahl der Revolutionen, Iterationen und die Toleranzgrenze k\u00f6nnen in den Einstellungen des Benchmarks ge\u00e4ndert werden.<\/i><\/p>\n<h2>Testumgebung<\/h2>\n<p>\nDie unten ver\u00f6ffentlichten Ergebnisse wurden auf einem MacBookPro (2015) mit dem Betriebssystem Fedora 30 (Kernelversion 5.3.8-200.fc30.x86_64) erzielt. Tarantool wurde in Docker mit dem Parameter &#171;<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 die Erweiterung f\u00fcr PHP 7.3 zu kompilieren und auszuf\u00fchren, musste ein <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool\/tarantool-php\/pull\/148\/files\">Patch<\/a><\/noindex>.<\/i><\/p>\n<h2>Ergebnisse<\/h2>\n<p><\/p>\n<h4>Synchroner Modus<\/h4>\n<p>\nDas Protokoll von Tarantool verwendet ein Bin\u00e4rformat <noindex><a rel=\"nofollow\" href=\"https:\/\/msgpack.org\/\">MessagePack<\/a><\/noindex> zur Serialisierung von Nachrichten. Im PECL-Connector ist die Serialisierung tief in den Untiefen der Bibliothek 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 Connector in reinem PHP bietet im Gegensatz dazu die M\u00f6glichkeit, den Kodierungsprozess durch die Erweiterung des Standardkodierers oder die Nutzung eigener Implementierungen anzupassen. Aus der Box sind zwei Kodierer verf\u00fcgbar, einer basiert auf <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/\">msgpack\/msgpack-php<\/a><\/noindex> (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>Vor dem Vergleich der Connectoren messen wir die Leistung der MessagePack-Kodierer f\u00fcr den PHP-Connector und verwenden in den weiteren Tests den, der das beste Ergebnis zeigt:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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, genau diese zu verwenden, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/rybakit\/msgpack.php\">rybakit\/msgpack<\/a><\/noindex>, da die offizielle MessagePack-Erweiterung die Spezifikation des Formats nur teilweise implementiert (zum Beispiel gibt es keine Unterst\u00fctzung f\u00fcr benutzerdefinierte Datentypen, ohne die Sie Decimal - den neuen Datentyp, der in Tarantool 2.3 eingef\u00fchrt wurde, nicht verwenden k\u00f6nnen) und hat eine Reihe anderer <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/msgpack\/msgpack-php\/issues\">der Probleme<\/a><\/noindex> (einschlie\u00dflich Kompatibilit\u00e4tsprobleme mit PHP 7.4). Insgesamt wirkt das Projekt jedoch vernachl\u00e4ssigt.<\/p>\n<p>Lassen Sie uns daher die Leistung der Connectoren im synchronen Modus messen:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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 zu sehen ist, zeigt der PECL-Connector (Tarantool) eine bessere Leistung im Vergleich zum PHP-Connector (Client). Aber das ist auch nicht \u00fcberraschend, da letzterer, abgesehen davon, dass er in einer langsameren Sprache implementiert ist, im Grunde genommen mehr Arbeit erledigt: Bei jedem Aufruf wird ein neues Objekt erstellt <i>Request<\/i> und <i>Response<\/i> (im Fall von Select - auch noch <i>Criteria<\/i>, und im Fall von Update\/Upsert - <i>Operations<\/i>), separate Entit\u00e4ten <i>Verbindung<\/i>, <i>Packer <\/i>und <i>Sie f\u00fcgen mit Hilfe der Handler<\/i> erh\u00f6hen ebenfalls die Overhead-Kosten. 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 werden mit der Nutzung von Preloading in PHP 7.4 wahrscheinlich noch geringer sein, ganz zu schweigen vom JIT in PHP 8.<\/p>\n<p>Lassen Sie uns weitermachen. In Tarantool 2.0 wurde SQL-Unterst\u00fctzung eingef\u00fchrt. Lassen Sie uns versuchen, die Operationen Select, Insert, Update und Delete unter Verwendung des SQL-Protokolls auszuf\u00fchren und die Ergebnisse mit den noSQL (bin\u00e4ren) \u00c4quivalenten zu vergleichen:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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). Ich w\u00fcrde mich jedoch nicht zu fr\u00fch dar\u00fcber aufregen, denn die SQL-Unterst\u00fctzung befindet sich noch in aktiver Entwicklung (relativ neu wurde beispielsweise 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 eine Reihe von Optimierungen bevor.<\/p>\n<h4>Async<\/h4>\n<p>\nNun, sehen wir uns an, wie das Async-Extension uns helfen kann, die obigen Ergebnisse zu verbessern. F\u00fcr das Schreiben asynchroner Programme bietet das Extension eine API auf Basis von Koroutinen (coroutines), die wir nutzen werden. Durch Experimente stellen wir fest, dass die optimale Anzahl an Koroutinen f\u00fcr unsere Umgebung 25 betr\u00e4gt:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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 \"verteilen\" 10.000 Operationen auf 25 Koroutinen und schauen, was dabei herauskommt:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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 ist um mehr als das Dreifache gestiegen f\u00fcr <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/client\">tarantool-php\/client<\/a><\/noindex>!<\/p>\n<p>Leider konnte der PECL-Connector nicht mit ext-async gestartet werden.<\/p>\n<p>Und was ist mit SQL?<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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 k\u00f6nnen, ist der Unterschied zwischen dem bin\u00e4ren Protokoll und SQL im asynchronen Modus vernachl\u00e4ssigbar geworden.<\/p>\n<h4>Swoole<\/h4>\n<p>\nErneut ermitteln wir die optimale Anzahl an Koroutinen, jetzt f\u00fcr Swoole:<br \/>\n<img decoding=\"async\" alt=\"Wir beschleunigen 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 bleiben bei 25. Wir wiederholen den gleichen Trick wie mit dem Async-Extension \u2013 verteilen 10.000 Operationen auf 25 Koroutinen. Dar\u00fcber hinaus f\u00fcgen wir einen weiteren Test hinzu, bei dem wir die gesamte Arbeit auf 2 Prozesse aufteilen (das bedeutet, dass jeder Prozess 5.000 Operationen in 25 Koroutinen ausf\u00fchrt). Die Prozesse werden mittels <i>SwooleProcess<\/i>. <\/p>\n<p>Ergebnisse:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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 einen etwas niedrigeren Wert im Vergleich zu Async, wenn es in einem Prozess gestartet wird, aber mit 2 Prozessen \u00e4ndert sich das Bild grundlegend (die Zahl 2 wurde nicht zuf\u00e4llig gew\u00e4hlt, auf meinem Rechner haben genau 2 Prozesse das beste Ergebnis gezeigt).<\/p>\n<p><i>\u00dcbrigens gibt es im Async-Extension auch eine API f\u00fcr die Arbeit mit Prozessen, jedoch habe ich dort keinen Unterschied bei der Ausf\u00fchrung der 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 beschleunigen 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 auch bei Async wird der Unterschied zwischen bin\u00e4ren und SQL-Operationen im asynchronen Modus nivelliert.<\/p>\n<h4>Parallel<\/h4>\n<p>\nDa das Parallel-Extension nicht um Koroutinen, sondern um Threads geht, messen wir die optimale Anzahl an parallelen Threads:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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 \/>\nSie betr\u00e4gt 16 auf meinem Rechner. Lassen Sie uns die Benchmarks der Connectoren auf 16 parallelen Threads ausf\u00fchren:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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 (abgesehen von Swoole, das in 2 Prozessen gestartet wurde). Beachten Sie, dass f\u00fcr den PECL-Connector an der Stelle von Update- und Upsert-Operationen nichts steht. Das liegt daran, dass diese Operationen fehlerhaft ausgefallen sind \u2013 ich wei\u00df nicht, ob es an ext-parallel, ext-tarantool oder an beiden liegt.<\/p>\n<p>Jetzt vergleichen wir die Leistung von SQL:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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 Connectoren bemerkt, die synchron ausgef\u00fchrt wurden?<\/p>\n<h4>Alles zusammen<\/h4>\n<p>\nUnd schlie\u00dflich fassen wir alle Ergebnisse in einem einzigen Diagramm zusammen, um das Gesamtbild der getesteten Erweiterungen zu sehen. Wir f\u00fcgen dem Diagramm nur einen neuen Test hinzu, den wir noch nicht durchgef\u00fchrt haben \u2013 wir starten die Async-Koroutinen parallel mit Hilfe von Parallel*. 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 erreicht, das m\u00fcssen wir selbst erledigen. <\/p>\n<p><i>* Es gelang nicht, die Swoole-Koroutinen mit Parallel zu starten; anscheinend sind diese Erweiterungen nicht kompatibel.<\/i><\/p>\n<p>Also, die finalen Ergebnisse:<\/p>\n<p><img decoding=\"async\" alt=\"Wir beschleunigen 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>Zum Abschluss<\/h2>\n<p>\nMeiner Meinung nach sind die Ergebnisse ziemlich ansprechend ausgefallen, und ich bin mir aus irgendeinem Grund sicher, dass dies noch nicht das Ende ist! Ob Sie das in Ihrem echten Projekt ben\u00f6tigen, liegt ganz bei Ihnen; ich sage nur, dass es f\u00fcr mich ein interessantes Experiment war, das es erm\u00f6glichte zu bewerten, wie viel man aus einem synchronen TCP-Connector mit minimalem Aufwand \u201eherausquetschen\u201c kann. Wenn Sie Ideen zur Verbesserung der Benchmarks haben, freue ich mich \u00fcber Ihren Pull-Request. Der gesamte Code mit Anweisungen zum Start und den Ergebnissen ist in einem separaten <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tarantool-php\/benchmarks\">das 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 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\/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) 5.0.1.1\" \/>\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.\" \/>\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\udd47Wir beschleunigen PHP-Connectoren f\u00fcr Tarantool mit Hilfe von Async, Swoole und Parallel | ProHoster","description":"In der PHP-\u00d6kosystem.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}