Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する

珟圚、PHP゚コシステムにはTarantoolサヌバヌず連携するためのコネクタが2぀ありたす。これは公匏のPECL拡匵です。 tarantool/tarantool-phpC蚀語で曞かれおおり、 tarantool-php/クラむアントPHP で曞かれおいたす。私は埌者の著者です。

この蚘事では、䞡方のラむブラリのパフォヌマンステストの結果を共有し、コヌドに最小限の倉曎を加えるだけで3〜5倍のパフォヌマンス向䞊を実珟できるこずを瀺したいず思いたす合成テストで).

䜕をテストするのでしょうか?

䞊蚘の内容をテストしたす 同期 非同期、䞊列、非同期䞊列で実行されるコネクタ。 🙂 たた、コネクタ自䜓のコヌドにも觊れたくありたせん。珟圚、これを実珟するのに圹立぀拡匵機胜がいく぀かありたす。

  • スりヌル ― PHP 甚の高性胜な非同期フレヌムワヌク。 AlibabaやBaiduなどのむンタヌネット倧手で䜿甚されおいたす。バヌゞョン4.1.0以降、マゞックメ゜ッドが登堎したした SwooleRuntime::enableCoroutine()これにより、「1 行のコヌドで PHP の同期ネットワヌク ラむブラリを非同期のものに倉換」できるようになりたす。
  • Async は、最近たで、PHP での非同期䜜業のための非垞に有望な拡匵機胜でした。なぜ最近たで残念ながら、私には分からない䜕らかの理由で、䜜者はリポゞトリを削陀しおしたい、プロゞェクトの将来は䞍透明です。䜿わなければならない 1 フォヌクから。 Swoole ず同様に、この拡匵機胜を䜿甚するず、TCP および TLS ストリヌムの暙準実装を非同期バヌゞョンに眮き換えるこずで、非同期動䜜を簡単にオンにするこずができたす。これはオプション「非同期TCP = 1"
  • 䞊列シミュレヌションの蚭定 ― phpdbg、apcu、pthreads、pcov、uopz などのラむブラリの䜜者ずしお有名な Joe Watkins による比范的新しい拡匵機胜です。この拡匵機胜は、PHP でマルチスレッド甚の API を提䟛し、pthreads の代替ずしお䜍眮付けられおいたす。このラむブラリの倧きな制限は、PHP の ZTS (Zend Thread Safe) バヌゞョンでのみ動䜜するこずです。

どうやっおテストするのでしょうか?

先行曞き蟌みログを無効にしたTarantoolのむンスタンスを起動しおみたしょうwal_mode = なし) ずネットワヌクバッファの増加 (先読み = 1 * 1024 * 1024。最初のオプションはディスクでの䜜業を陀倖し、2 番目のオプションはオペレヌティング システム バッファヌからより倚くの芁求を読み取るこずを可胜にし、それによっおシステム コヌルの数を最小限に抑えたす。

デヌタを操䜜するベンチマヌク (挿入、削陀、読み取りなど) の堎合、ベンチマヌクの開始前に、memtx スペヌスが (再) 䜜成され、その䞭で、順序付けられた敎数倀 (シヌケンス) のゞェネレヌタヌによっおプラむマリ むンデックス倀が䜜成されたす。
スペヌスの DDL は次のようになりたす。

space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})
space:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})
space:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})

必芁であれば、ベンチマヌクを実行する前に、次の圢匏の10,000組で空間を埋める。

{id, "tuplе_<id>"}

タプルぞのアクセスはランダムなキヌ倀によっお提䟛されたす。

ベンチマヌク自䜓は、サヌバヌぞの単䞀のリク゚ストが 10,000 回 (回転) 実行され、それが反埩的に実行されるものです。 5 回の反埩間のすべおの時間偏差が 3%* の蚱容誀差内になるたで、反埩が繰り返されたす。この埌、平均結果が算出されたす。プロセッサのスロットルを防ぐために、反埩の間に 1 秒間の䞀時停止がありたす。 Lua のガベヌゞ コレクタヌは各反埩の前に無効にされ、完了埌に匷制的に実行されたす。 PHP プロセスは、ベンチマヌクに必芁な拡匵機胜のみを䜿甚しお開始され、出力バッファリングが有効にされ、ガベヌゞ コレクタヌは無効にされたす。

* 回転数、反埩回数、゚ラヌしきい倀はベンチマヌク蚭定で倉曎できたす。

テスト環境

以䞋に掲茉した結果は、MacBookPro (2015)、オペレヌティング システム - Fedora 30 (カヌネル バヌゞョン 5.3.8-200.fc30.x86_64) で䜜成されたした。 TarantoolはDockerでパラメヌタ「--network host".

パッケヌゞバヌゞョン:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3、ビルド a872fc2f86
PHP: 7.3.11 (cli) (ビルド: 22幎2019月08日 11:04:XNUMX)
tarantool/クラむアント: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ 7.3 甚パッチ)*
ext-msgpack: 2.0.3
倖郚非同期: 0.3.0-8c1da46
拡匵スりヌル: 4.4.12
拡匵パラレル: 1.1.3

* 残念ながら、公匏コネクタは PHP バヌゞョン 7.2 以降では動䜜したせん。 PHP 7.3で拡匵機胜をコンパむルしお実行するには、 パッチ.

結果

同期モヌド

Tarantoolプロトコルはバむナリ圢匏を䜿甚する メッセヌゞパック メッセヌゞのシリアル化甚。 PECL コネクタでは、シリアル化はラむブラリの奥深くに隠されおおり、ナヌザヌランド コヌドからの゚ンコヌド プロセスに圱響を䞎えるこずはできたせん。 できない。䞀方、玔粋な PHP コネクタは、暙準゚ンコヌダを拡匵するか、独自の実装を䜿甚するこずによっお、゚ンコヌド プロセスをカスタマむズする機胜を提䟛したす。すぐに䜿甚できる゚ンコヌダは2぀あり、1぀は msgpack/msgpack-php 公匏MessagePack PECL拡匵、もう䞀぀は rybakit/msgpack (玔粋な PHP で)。

コネクタを比范する前に、PHP コネクタの MessagePack ゚ンコヌダのパフォヌマンスを枬定し、さらなるテストで最高の結果を瀺すものを䜿甚したしょう。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
PHP バヌゞョン (Pure) は速床の点では PECL 拡匵機胜より劣りたすが、実際のプロゞェクトではやはり䜿甚するこずをお勧めしたす。 rybakit/msgpack公匏のMessagePack拡匵機胜では、フォヌマット仕様が郚分的にしか実装されおいないため䟋えば、カスタムデヌタ型はサポヌトされおおらず、これがないずTarantool 2.3で導入された新しいデヌタ型であるDecimalを䜿甚できたせん、他の倚くの прПблеЌ (PHP 7.4 ずの互換性の問題を含む)。たあ、党䜓的に芋るず、このプロゞェクトは攟棄されたように芋えたす。

それでは、同期モヌドでコネクタのパフォヌマンスを枬定しおみたしょう。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
グラフからわかるように、PECL コネクタ (Tarantool) は、PHP コネクタ (クラむアント) ず比范しお優れたパフォヌマンスを瀺しおいたす。しかし、埌者は、より遅い蚀語で実装されおいるこずに加えお、本質的にはより倚くの䜜業呌び出しごずに新しいオブゞェクトが䜜成されるを行うこずを考えるず、これは驚くべきこずではありたせん。 リク゚スト О 䞖界の動き セレクトの堎合も 基準、Update/Upsertの堎合 ― 業務執行統括、別個の゚ンティティ 接続, パッカヌ О ハンドラ オヌバヌヘッドも远加されたす。圓然ですが、柔軟性には代償が䌎いたす。ただし、党䜓的には、PHP むンタヌプリタヌは良奜なパフォヌマンスを瀺しおいたす。違いはあるものの、それは重芁ではなく、PHP 7.4 のプリロヌドを䜿甚するずさらに小さくなる可胜性があり、PHP 8 の JIT は蚀うたでもありたせん。

次に進みたしょう。 Tarantool 2.0 は SQL をサポヌトするようになりたした。 SQL プロトコルを䜿甚しお、Select、Insert、Update、Delete 操䜜を実行し、その結果を noSQL (バむナリ) の同等の結果ず比范しおみたしょう。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
SQL の結果はあたり印象的ではありたせん (同期モヌドはただテスト䞭であるこずに泚意しおください)。しかし、私はこれに぀いお事前に怒る぀もりはありたせん。SQLサポヌトはただ掻発に開発䞭です比范的最近、䟋えば、サポヌトが远加されたした。 プリペアドステヌトメントそしお、リストから刀断するず 問題今埌、SQL ゚ンゞンではさたざたな最適化が行われる予定です。

非同期

さお、Async 拡匵機胜が䞊蚘の結果を改善するのにどのように圹立぀かを芋おみたしょう。非同期プログラムを䜜成するために、拡匵機胜はコルヌチンに基づく API を提䟛しおおり、これを䜿甚したす。経隓的に、私たちの環境に最適なコルヌチンの数は 25 であるこずがわかりたした。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
10,000 回の挔算を 25 個のコルヌチンに分散させお、次の結果を芋おみたしょう。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
3秒あたりの操䜜数はXNUMX倍以䞊に増加したした。 tarantool-php/クラむアント!

残念なこずに、PECL コネクタは ext-async で起動できたせんでした。

SQLに぀いおはどうですか?

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
ご芧のずおり、非同期モヌドではバむナリ プロトコルず SQL の差は誀差範囲内になりたした。

スりヌル

今床は Swoole の堎合に、コルヌチンの最適な数をもう䞀床調べおみたしょう。
Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
25 で止めたしょう。Async 拡匵機胜ず同じトリックを繰り返しお、10,000 の操䜜を 25 個のコルヌチンに分散したしょう。さらに、すべおの䜜業を 2 ぀のプロセスに分割する別のテストを远加したす (぀たり、各プロセスは 5,000 のコルヌチンで 25 の操䜜を実行したす)。プロセスは以䞋を䜿甚しお䜜成されたす スりヌルプロセス.

結果

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
Swole は、2 ぀のプロセスで実行する堎合、Async ず比范しおわずかに䜎い結果を瀺したすが、2 ぀のプロセスでは状況は劇的に倉化したす (2 ずいう数字は偶然に遞択されたわけではなく、私のマシンでは XNUMX ぀のプロセスが最良の結果を瀺したした)。

ちなみに、Async 拡匵機胜にはプロセスを操䜜するための API もありたすが、ベンチマヌクを 1 ぀のプロセスで実行した堎合ず耇数のプロセスで実行した堎合の違いはわかりたせんでした (どこかで倱敗した可胜性がありたす)。

SQL ずバむナリ プロトコル:

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
Async の堎合ず同様に、非同期モヌドではバむナリ操䜜ず SQL 操䜜の違いはなくなりたす。

䞊列シミュレヌションの蚭定

Parallel 拡匵機胜はコルヌチンではなくスレッドに関するものなので、䞊列スレッドの最適な数を枬定しおみたしょう。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
私のマシンでは 16 です。 16 個の䞊列スレッドでコネクタ ベンチマヌクを実行しおみたしょう。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
ご芧のずおり、結果は非同期拡匵機胜 (2 ぀のプロセスで実行されおいる Swoole を陀く) よりもさらに優れおいたす。 PECL コネクタの堎合、Update 操䜜ず Upsert 操䜜は空であるこずに泚意しおください。これは、これらの操䜜が゚ラヌでクラッシュしたためです。原因が ext-parallel、ext-tarantool、たたはその䞡方であるかどうかはわかりたせん。

次に、SQL パフォヌマンスを比范しおみたしょう。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する
同期的に起動されたコネクタのグラフずの類䌌性に気づきたしたか?

みんなで

最埌に、テストした拡匵機胜の党䜓像を確認するために、すべおの結果を 1 ぀のグラフにたずめおみたしょう。ただ実行しおいない新しいテストを 1 ぀だけグラフに远加したしょう。Parallel* を䜿甚しお、非同期コルヌチンを䞊列に実行しおみたしょう。䞊蚘の拡匵機胜を統合するずいうアむデアはすでに 話し合った 著者らは合意に達しなかったため、私たち自身でそれを行わなければなりたせん。

* Parallel で Swoole コルヌチンを実行できたせんでした。これらの拡匵機胜は互換性がないようです。

最終結果は以䞋のずおりです。

Async、Swoole、Parallel を䜿甚しお Tarantool の PHP コネクタを高速化する

代わりに、結論の

私の意芋では、結果はかなり良奜で、䜕らかの理由でこれが限界ではないず確信しおいたす。実際のプロゞェクトでこれが必芁かどうかは完党にあなた次第ですが、私にずっおは興味深い実隓であり、最小限の劎力で同期 TCP コネクタからどれだけのものを「絞り出す」こずができるかを評䟡できたずだけ蚀っおおきたす。ベンチマヌクを改善する方法に぀いお䜕かアむデアがあれば、プル リク゚ストを怜蚎させおいただきたす。実行手順ず結果を含むコヌド党䜓は別の リポゞトリ.

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster