Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel

Dina ékosistem PHP ayeuna aya dua panyambungna pikeun gawé bareng server Tarantool - ieu téh extension PECL resmi. tarantool/tarantool-php, ditulis dina C, jeung tarantool-php/klien, ditulis dina PHP. Abdi pangarang anu terakhir.

Dina artikel ieu, abdi hoyong bagikeun hasil nguji kinerja duanana perpustakaan jeung nunjukkeun kumaha, kalawan parobahan minimal kana kode, Anjeun bisa ngahontal 3-5 kanaékan kinerja (dina tés sintétik!).

Naon anu bakal urang uji?

Kami bakal nguji anu didadarkeun di luhur sinkron konektor ngajalankeun asynchronously, paralel, sarta asynchronously-paralel. 🙂 Urang ogé teu hayang noél kodeu panyambungna sorangan. Ayeuna aya sababaraha ekstensi anu sayogi pikeun ngahontal naon anu anjeun pikahoyong:

  • Swool - kerangka Asynchronous-kinerja luhur pikeun PHP. Dipaké ku raksasa Internét sapertos Alibaba sareng Baidu. Kusabab versi 4.1.0 geus mucunghul metoda magic SwooleRuntime::enableCoroutine(), nu ngidinan Anjeun pikeun "ngarobah perpustakaan jaringan PHP sinkron kana leuwih Asynchronous kalawan hiji baris kode."
  • Async dugi ka ayeuna mangrupikeun ekstensi anu ngajangjikeun pikeun padamelan asinkron dina PHP. Naha nepi ka ayeuna? Hanjakalna, pikeun alesan anu teu dipikanyaho ku kuring, panulis ngahapus repositori sareng masa depan proyék éta teu jelas. Abdi kedah nganggo éta hiji ti garpu. Kawas Swoole, ekstensi ieu ngidinan Anjeun pikeun gampang ngahurungkeun calana anjeun ku sintreuk pigeulang pikeun ngaktipkeun asynchrony ku ngaganti palaksanaan standar TCP na TLS streams kalawan versi asynchronous maranéhanana. Hal ieu dilakukeun ngaliwatan pilihan "async.tcp = 1".
  • sajajar - ekstensi anu cukup anyar ti Joe Watkins anu kasohor, panulis perpustakaan sapertos phpdbg, apcu, pthreads, pcov, uopz. Ekstensi nyadiakeun API pikeun multithreading dina PHP sareng diposisikan salaku gaganti pthreads. Watesan anu penting pikeun perpustakaan nyaéta ngan ukur tiasa dianggo sareng versi ZTS (Zend Thread Safe) PHP.

Kumaha urang bakal nguji?

Hayu urang ngajalankeun hiji conto Tarantool kalawan nulis-hareup logging ditumpurkeun (wal_mode = euweuh) jeung ngaronjat panyangga jaringan (maca payun = 1 * 1024 * 1024). Pilihan kahiji bakal ngaleungitkeun karya jeung disk, nu kadua bakal ngamungkinkeun maca leuwih requests ti panyangga sistem operasi sahingga ngaleutikan jumlah panggero sistem.

Pikeun tolok ukur anu tiasa dianggo sareng data (sisipan, ngahapus, maca, jsb.), sateuacan ngamimitian patokan, rohangan memtx bakal (deui) didamel, dimana nilai indéks primér diciptakeun ku generator nilai integer anu maréntahkeun ​(runtuyan).
Spasi DDL sapertos kieu:

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}})

Upami diperlukeun, sateuacan ngajalankeun patokan, rohangan dieusian ku 10,000 tuple tina formulir.

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

Tuples diaksés maké nilai konci acak.

Patokan sorangan nyaéta pamundut tunggal ka server, anu dieksekusi 10,000 kali (révolusi), anu, kahareupna dieksekusi dina iterasi. Iterasi diulang dugi ka sadaya waktos panyimpangan antara 5 iterasi aya dina kasalahan anu tiasa ditampi 3%*. Saatos ieu, hasil rata-rata dicandak. Aya jeda 1 detik antara iterasi pikeun nyegah prosésor throttling. Pengumpul sampah Lua ditumpurkeun sateuacan unggal iterasi sareng kapaksa ngamimitian saatos réngsé. Prosés PHP diluncurkeun ngan ku ekstensi anu dipikabutuh pikeun patokan, kalayan panyangga kaluaran diaktipkeun sareng tukang sampah ditumpurkeun.

* Jumlah révolusi, iterasi sareng ambang kasalahan tiasa dirobih dina setélan patokan.

Lingkungan tés

Hasil anu diterbitkeun di handap ieu dilakukeun dina MacBookPro (2015), sistem operasi - Fedora 30 (versi kernel 5.3.8-200.fc30.x86_64). Tarantool diluncurkeun dina docker kalayan parameter "--network host".

Vérsi pakét:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, ngawangun a872fc2f86
PHP: 7.3.11 (cli) (diwangun: Oct 22 2019 08:11:04)
tarantool / klien: 0.6.0
rybakit / msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch pikeun 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-paralel: 1.1.3

* Hanjakalna, konektor resmi henteu tiasa dianggo sareng versi PHP> 7.2. Pikeun compile tur ngajalankeun extension on PHP 7.3, kuring kungsi make patch.

Hasil

Modeu sinkron

Protokol Tarantool ngagunakeun format binér MessagePack pikeun serialize pesen. Dina konektor PECL, serialization disumputkeun jero di jero perpustakaan jeung mangaruhan prosés encoding tina kode userland. sigana moal mungkin. A konektor PHP murni, sabalikna, nyadiakeun kamampuhan pikeun ngaluyukeun prosés encoding ku manjangkeun encoder baku atawa ku ngagunakeun palaksanaan anjeun sorangan. Aya dua encoders sadia out of the box, hiji dumasar kana msgpack/msgpack-php (ekstensi MessagePack PECL resmi), anu sanésna hurung rybakit / msgpack (dina PHP murni).

Sateuacan ngabandingkeun panyambungna, urang bakal ngukur kinerja encoders MessagePack pikeun konektor PHP sareng dina tés salajengna urang bakal nganggo anu nunjukkeun hasil anu pangsaéna:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Sanajan versi PHP (murni) inferior mun extension PECL dina speed, dina proyék nyata kuring masih bakal nyarankeun ngagunakeun eta. rybakit / msgpack, sabab dina extension MessagePack resmi spésifikasi format ngan sawaréh dilaksanakeun (contona, teu aya rojongan pikeun tipe data custom, tanpa nu moal bisa ngagunakeun Decimal - tipe data anyar diwanohkeun dina Tarantool 2.3) sarta ngabogaan jumlah batur masalah (kaasup masalah kasaluyuan sareng PHP 7.4). Nya, sacara umum, proyék éta katingalina ditinggalkeun.

Janten, hayu urang ngukur kinerja konektor dina modeu sinkron:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Sapertos tiasa ditingali tina grafik, konektor PECL (Tarantool) nunjukkeun kinerja anu langkung saé dibandingkeun sareng konektor PHP (klien). Tapi ieu teu héran, nunjukkeun yen dimungkinkeun, salian dilaksanakeun dina basa laun, sabenerna ngalakukeun leuwih gawé: objék anyar dijieun kalawan unggal panggero. nyuhunkeun и jawaban (dina kasus Pilih - ogé kriteria, sareng dina kasus Update/Upsert ― operasi), éntitas misah hubungan, Packer и Handler aranjeunna ogé nambahkeun overhead. Jelas, kalenturan asalna dina hargana. Nanging, sacara umum, juru PHP nunjukkeun kinerja anu saé, sanaos aya bédana, éta teu pati penting sareng, sigana, bakal langkung handap nalika nganggo preloading dina PHP 7.4, sanés deui JIT dina PHP 8.

Hayu urang ngaléngkah. Tarantool 2.0 nambihan dukungan pikeun SQL. Hayu urang cobian ngalakukeun operasi Pilih, Selapkeun, Apdet sareng Hapus nganggo protokol SQL sareng ngabandingkeun hasilna sareng sarimbag noSQL (binér):

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Hasil SQL teu pisan impressive (hayu kuring ngingetan yén kami masih nguji mode sinkron). Najan kitu, kuring moal kesel ngeunaan ieu sateuacanna; Pangrojong SQL masih aya dina pamekaran aktip (relatif anyar, contona, dukungan parantos ditambah. pernyataan disusun) jeung, ditilik ku daptar isu, mesin SQL bakal ngalaman sababaraha optimizations dina mangsa nu bakal datang.

async

Nya, ayeuna hayu urang tingali kumaha ekstensi Async tiasa ngabantosan urang ningkatkeun hasil di luhur. Pikeun nulis program asynchronous, extension nyadiakeun API dumasar kana coroutines, nu urang bakal make. Urang manggihan sacara émpiris yén jumlah optimal coroutines pikeun lingkungan urang téh 25:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
"Nyebarkeun" 10,000 operasi di 25 coroutines sareng tingali naon anu lumangsung:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Jumlah operasi per detik ngaronjat ku leuwih ti 3 kali pikeun tarantool-php/klien!

Hanjakalna, konektor PECL henteu ngamimitian ku ext-async.

Kumaha upami SQL?

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Sakumaha anjeun tiasa tingali, dina modeu Asynchronous bédana antara protokol binér sareng SQL janten dina margin kasalahan.

Swool

Deui urang manggihan jumlah optimal coroutines, waktos ieu pikeun Swoole:
Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Hayu urang eureun di 25. Hayu urang ngulang trik sarua jeung extension Async - ngadistribusikaeun 10,000 operasi antara 25 coroutines. Sajaba ti éta, urang bakal nambahan test sejen nu urang ngabagi sagala karya kana 2 dua prosés (nyaéta, unggal prosés bakal ngalakukeun 5,000 operasi di 25 coroutines). Prosés bakal dijieun ngagunakeun Prosés Swoole.

Hasil:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Swole nembongkeun hasil rada handap dibandingkeun Async lamun dijalankeun dina hiji prosés, tapi kalawan 2 prosés gambar robah nyirorot (nomer 2 teu dipilih ku kasempetan ; dina mesin kuring, éta 2 prosés nu némbongkeun hasil pangalusna).

Ku jalan kitu, ekstensi Async ogé gaduh API pikeun damel sareng prosés, tapi di dinya kuring henteu perhatikeun bédana tina ngajalankeun tolok ukur dina hiji atanapi langkung prosés (mungkin waé kuring ngaco di mana waé).

SQL vs protokol binér:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Sapertos sareng Async, bédana antara operasi binér sareng SQL dileungitkeun dina modeu Asynchronous.

sajajar

Kusabab extension Parallel sanes ngeunaan coroutines, tapi ngeunaan threads, hayu urang ngukur jumlah optimal threads paralel:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Ieu sarua jeung 16 on abdi mesin . Hayu urang ngajalankeun tolok ukur konektor dina 16 benang paralel:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Sakumaha anjeun tiasa tingali, hasilna malah leuwih hade tinimbang kalawan ekstensi Asynchronous (teu kaétang Swoole ngajalankeun on 2 prosés). Catet yén pikeun konektor PECL, operasi Update sareng Upsert kosong. Ieu alatan kanyataan yén operasi ieu gagal jeung kasalahan - Kuring henteu weruh lamun éta lepat ext-paralel, ext-tarantool, atawa duanana.

Ayeuna urang ngabandingkeun kinerja SQL:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel
Perhatikeun kasaruaan jeung grafik pikeun konektor ngajalankeun synchronously?

Babarengan

Sareng pamustunganana, hayu urang nyimpulkeun sadaya hasil dina hiji grafik pikeun ningali gambar umum pikeun ekstensi anu diuji. Hayu urang tambahkeun ngan hiji tés anyar kana bagan, nu urang teu acan rengse - hayu urang ngajalankeun Async coroutines sajajar ngagunakeun Parallel *. Gagasan pikeun ngahijikeun ekstensi di luhur parantos aya ieu dibahas pangarang, tapi euweuh konsensus ieu ngahontal, anjeun bakal kudu ngalakukeun hal eta diri.

* Teu mungkin ngaluncurkeun coroutines Swoole sareng Parallel; sigana ekstensi ieu teu cocog.

Ku kituna, hasil ahir:

Ngagancangkeun konektor PHP pikeun Tarantool nganggo Async, Swoole sareng Parallel

Gantina kacindekan

Dina pamanggih kuring, hasilna tétéla rada pantes, sarta pikeun sababaraha alesan kuring yakin yén ieu teu wates! Naha anjeun kedah mutuskeun ieu dina proyék nyata solely pikeun diri, Kuring ngan bakal disebutkeun yen keur kuring éta hiji percobaan metot nu ngidinan Anjeun pikeun evaluate sabaraha anjeun tiasa "squeeze" kaluar tina konektor TCP sinkron jeung minimal usaha . Upami Anjeun gaduh gagasan pikeun ngaronjatkeun tolok ukur, Kuring bakal senang mertimbangkeun pamundut tarikan Anjeun. Kabéh kode kalawan parentah peluncuran sarta hasil diterbitkeun dina misah repositories.

sumber: www.habr.com

Tambahkeun komentar