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

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

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

この蚘事では、䞡方のラむブラリのパフォヌマンス テストの結果を共有し、コヌドぞの最小限の倉曎で 3  5 のパフォヌマンス向䞊を達成できる方法を瀺したいず思いたす (総合テストで).

䜕をテストしたすか

䞊蚘のものをテストしたす 同期 コネクタは非同期、䞊列、非同期䞊列で実行されたす。 🙂 たた、コネクタ自䜓のコヌドにも觊れたくありたせん。 珟圚、目的を達成するために利甚できる拡匵機胜がいく぀かありたす。

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

どのようにテストするのでしょうか?

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

デヌタを操䜜するベンチマヌク (挿入、削陀、読み取りなど) の堎合、ベンチマヌクを開始する前に、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%* 以内になるたで、反埩が繰り返されたす。 この埌、平均結果が取埗されたす。 プロセッサヌのスロットルを防ぐために、反埩の間には XNUMX 秒の䞀時停止がありたす。 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)
タランツヌル/クラむアント: 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 コネクタは、暙準゚ンコヌダを拡匵するか、独自の実装を䜿甚するこずによっお、゚ンコヌド プロセスをカスタマむズする機胜を提䟛したす。 すぐに䜿甚できる゚ンコヌダヌが XNUMX ぀あり、XNUMX ぀は以䞋に基づいおいたす。 msgpack/msgpack-php (公匏の MessagePack PECL 拡匵)、もう XNUMX ぀はオンです ラむバキット/メッセヌゞパック (玔粋な PHP で)。

コネクタを比范する前に、PHP コネクタの MessagePack ゚ンコヌダのパフォヌマンスを枬定し、その埌のテストでは最良の結果を瀺した゚ンコヌダを䜿甚したす。

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

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

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

次ぞ移りたしょう。 Tarantool 2.0 では SQL のサポヌトが远加されたした。 SQL プロトコルを䜿甚しお遞択、挿入、曎新、および削陀の操䜜を実行しお、結果を同等の 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 もありたすが、XNUMX ぀たたは耇数のプロセスでベンチマヌクを実行する堎合ずの違いに気づきたせんでした (どこかで倱敗した可胜性がありたす)。

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

Async、Swoole、Parallel を䜿甚した Tarantool 甚の PHP コネクタの高速化
非同期ず同様、非同期モヌドではバむナリ操䜜ず 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 コネクタの高速化
同期しお実行されおいるコネクタのグラフずの類䌌性に気づきたしたか?

䞀緒に

最埌に、すべおの結果を XNUMX ぀のグラフにたずめお、テストされた拡匵機胜の党䜓像を確認したしょう。 ただ行っおいない新しいテストを XNUMX ぀だけチャヌトに远加したしょう。Parallel* を䜿甚しお非同期コルヌチンを䞊列実行しおみたしょう。 䞊蚘の拡匵機胜を統合するずいうアむデアはすでに 話し合った しかし、合意に達しなかった堎合は、自分で行う必芁がありたす。

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

最終的な結果は次のずおりです。

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

代わりに、結論の

私の意芋では、結果は非垞に䟡倀のあるものであるこずが刀明したした。䜕らかの理由で、これが限界ではないず確信しおいたす。 実際のプロゞェクトでこれを自分自身だけで決定する必芁があるかどうかは別ずしお、私にずっおこれは、最小限の劎力で同期 TCP コネクタからどれだけ「絞り出す」こずができるかを評䟡できる興味深い実隓であったずいうこずだけを述べおおきたす。 ベンチマヌクを改善するためのアむデアがある堎合は、プル リク゚ストを喜んで怜蚎させおいただきたす。 起動手順ず結果を含むすべおのコヌドは別のドキュメントで公開されたす。 リポゞトリ.

出所 habr.com

コメントを远加したす