Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel

Ing ekosistem PHP saiki ana rong konektor kanggo nggarap server Tarantool - iki minangka ekstensi PECL resmi tarantool/tarantool-php, ditulis ing C, lan tarantool-php/klien, ditulis ing PHP. Aku penulis sing terakhir.

Ing artikel iki, aku pengin nuduhake asil tes kinerja loro perpustakaan lan nuduhake carane, kanthi owah-owahan minimal ing kode, sampeyan bisa entuk peningkatan kinerja 3-5 (ing tes sintetik!).

Apa sing bakal kita tes?

Kita bakal nyoba sing kasebut ing ndhuwur sinkron konektor mlaku asynchronously, ing podo karo, lan asynchronously-paralel. πŸ™‚ Kita uga ora pengin nutul kode konektor dhewe. Saiki ana sawetara ekstensi sing kasedhiya kanggo entuk apa sing dikarepake:

  • Swool - kerangka kerja asinkron kinerja dhuwur kanggo PHP. Digunakake dening raksasa Internet kayata Alibaba lan Baidu. Wiwit versi 4.1.0 wis muncul metode sihir SwooleRuntime::enableCoroutine(), sing ngidini sampeyan "ngonversi perpustakaan jaringan PHP sing sinkron dadi sing ora sinkron kanthi siji baris kode."
  • Async nganti saiki dadi ekstensi sing njanjeni kanggo karya asinkron ing PHP. Kenapa nganti bubar? Sayange, kanthi alesan sing ora dingerteni, penulis mbusak repositori kasebut lan nasibe proyek kasebut ora jelas. Aku kudu nggunakake siji saka garpu. Kaya Swoole, ekstensi iki ngidini sampeyan kanthi gampang nguripake celonone kanthi gulung cepet ing bangkekan kanggo ngaktifake asinkron kanthi ngganti implementasi standar aliran TCP lan TLS kanthi versi asinkron. Iki ditindakake liwat pilihan "async.tcp = 1".
  • Paralel ― ekstensi sing cukup anyar saka Joe Watkins sing kondhang, penulis perpustakaan kayata phpdbg, apcu, pthreads, pcov, uopz. Ekstensi nyedhiyakake API kanggo multithreading ing PHP lan dipanggonke minangka panggantos kanggo pthreads. Watesan penting saka perpustakaan yaiku mung bisa digunakake karo versi PHP ZTS (Zend Thread Safe).

Kepiye carane kita bakal nyoba?

Ayo miwiti conto Tarantool kanthi nulis-ahead logging dipateni (wal_mode = ora analan buffer jaringan tambah (maca ngarep = 1 * 1024 * 1024). Opsi pisanan bakal ngilangi karya karo disk, sing nomer loro bakal bisa maca panjalukan liyane saka buffer sistem operasi lan kanthi mangkono nyilikake jumlah panggilan sistem.

Kanggo pathokan sing bisa digunakake karo data (sisipan, mbusak, maca, lan sapiturute), sadurunge miwiti pathokan, spasi memtx bakal (maneh) digawe, ing ngendi nilai indeks utama digawe dening generator nilai integer sing diurutake ​(urutan).
Ruang DDL katon kaya iki:

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

Yen perlu, sadurunge nglakokake pathokan, spasi diisi 10,000 tuple formulir.

{id, "tuplΠ΅_<id>"}

Tuples diakses nggunakake nilai kunci acak.

Patokan kasebut dhewe minangka panjalukan siji menyang server, sing dieksekusi kaping 10,000 (revolusi), sing banjur ditindakake kanthi iterasi. Pengulangan diulang nganti kabeh wektu panyimpangan antarane 5 iterasi ana ing kesalahan 3%* sing bisa ditampa. Sawise iki, asil rata-rata dijupuk. Ana jeda 1 detik ing antarane pengulangan kanggo nyegah prosesor throttling. Pengumpul sampah Lua dipateni sadurunge saben pengulangan lan dipeksa diwiwiti sawise rampung. Proses PHP diluncurake mung karo ekstensi sing dibutuhake kanggo pathokan, kanthi buffering output diaktifake lan kolektor sampah dipateni.

* Jumlah rΓ©volusi, iterasi lan batesan kesalahan bisa diganti ing setelan pathokan.

Lingkungan tes

Asil diterbitake ing ngisor iki digawe ing MacBookPro (2015), sistem operasi - Fedora 30 (versi kernel 5.3.8-200.fc30.x86_64). Tarantool diluncurake ing docker kanthi parameter "--network host".

Versi paket:

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

* Sayange, konektor resmi ora bisa digunakake karo versi PHP> 7.2. Kanggo ngumpulake lan mbukak ekstensi ing PHP 7.3, aku kudu nggunakake tembelan.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Mode sinkron

Protokol Tarantool nggunakake format binar MessagePack kanggo serialize pesen. Ing konektor PECL, serialisasi didhelikake ing jero perpustakaan lan mengaruhi proses enkoding saka kode userland. katon ora bisa. Konektor PHP murni, sebaliknya, nyedhiyakake kemampuan kanggo ngatur proses enkoding kanthi ndawakake encoder standar utawa nggunakake implementasine dhewe. Ana loro encoders kasedhiya metu saka kothak, siji adhedhasar msgpack/msgpack-php (ekstensi MessagePack PECL resmi), liyane aktif rybakit/msgpack (ing PHP murni).

Sadurunge mbandhingake konektor, kita bakal ngukur kinerja encoders MessagePack kanggo konektor PHP lan ing tes luwih lanjut, kita bakal nggunakake sing nuduhake asil paling apik:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Sanajan versi PHP (Pure) luwih murah tinimbang ekstensi PECL kanthi cepet, ing proyek nyata, aku isih bakal menehi rekomendasi nggunakake rybakit/msgpack, amarga ing ekstensi MessagePack resmi spesifikasi format mung dileksanakake sebagian (contone, ora ana dhukungan kanggo jinis data khusus, tanpa sampeyan ora bisa nggunakake Decimal - jinis data anyar sing dikenalake ing Tarantool 2.3) lan nduweni nomer liyane masalah (kalebu masalah kompatibilitas karo PHP 7.4). Inggih, umume, proyek kasebut katon ditinggal.

Dadi, ayo ngukur kinerja konektor ing mode sinkron:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Minangka bisa dideleng saka grafik, konektor PECL (Tarantool) nuduhake kinerja sing luwih apik dibandhingake karo konektor PHP (Klien). Nanging iki ora nggumunake, amarga sing terakhir, saliyane dileksanakake ing basa sing luwih alon, bener-bener nindakake luwih akeh: obyek anyar digawe karo saben telpon. request ΠΈ Response (ing kasus Pilih - uga Kriteria, lan ing kasus Update/Upsert ― operasi), entitas kapisah sambungan, packer ΠΈ handler padha uga nambah overhead. Temenan, keluwesan teka kanthi rega. Nanging, umume, juru basa PHP nuduhake kinerja sing apik, sanajan ana bedane, nanging ora pati penting lan, mbok menawa, bakal luwih sithik nalika nggunakake preloading ing PHP 7.4, ora kanggo sebutake JIT ing PHP 8.

Ayo nerusake. Tarantool 2.0 nambahake dhukungan kanggo SQL. Ayo nyoba nindakake operasi Pilih, Pasang, Nganyari lan Busak nggunakake protokol SQL lan mbandhingake asil karo sing padha karo noSQL (biner):

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Asil SQL ora banget nyengsemaken (ayo kula ngelingake yen kita isih nyoba mode sinkron). Nanging, aku ora bakal nesu babagan iki sadurunge; Dhukungan SQL isih aktif dikembangake (relatif bubar, contone, dhukungan ditambahake. statements disiapake) lan, miturut dhaptar masalah, mesin SQL bakal ngalami sawetara optimasi ing mangsa ngarep.

async

Saiki ayo ndeleng kepiye ekstensi Async bisa mbantu nambah asil ing ndhuwur. Kanggo nulis program asinkron, ekstensi kasebut nyedhiyakake API adhedhasar coroutine, sing bakal digunakake. Kita nemokake kanthi empiris manawa jumlah coroutine sing optimal kanggo lingkungan kita yaiku 25:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
"Sebarake" 10,000 operasi ing 25 coroutine lan deleng apa sing kedadeyan:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Jumlah operasi per detik tambah luwih saka 3 kaping kanggo tarantool-php/klien!

Sayange, konektor PECL ora diwiwiti kanthi ext-async.

Kepiye babagan SQL?

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Minangka sampeyan bisa ndeleng, ing mode asinkron beda antarane protokol binar lan SQL dadi ing wates kesalahan.

Swool

Maneh, kita nemokake jumlah coroutine sing paling optimal, wektu iki kanggo Swoole:
Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Ayo mandheg ing 25. Ayo baleni trik sing padha karo ekstensi Async - nyebarake 10,000 operasi ing antarane 25 coroutine. Kajaba iku, kita bakal nambah tes liyane sing bakal dibagi kabeh karya dadi 2 rong proses (yaiku, saben proses bakal nindakake 5,000 operasi ing 25 coroutine). Proses bakal digawe nggunakake Proses Swoole.

Asile:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Swole nuduhake asil rada ngisor dibandhingake Async nalika mbukak ing siji proses, nanging karo 2 pangolahan gambar owah-owahan dramatically (nomer 2 ora dipilih dening kasempatan ; ing mesin, iku 2 pangolahan sing nuduhake asil paling apik).

Miturut cara, extension Async uga duwe API kanggo nggarap proses, nanging aku ora weruh prabΓ©dan saka pathokan mlaku ing siji utawa luwih proses (bisa uga aku ngaco nang endi wae).

SQL vs protokol biner:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Kaya Async, prabΓ©dan antarane operasi binar lan SQL diilangi ing mode asinkron.

Paralel

Amarga ekstensi Paralel ora babagan coroutine, nanging babagan benang, ayo ngukur jumlah benang paralel sing optimal:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Iku 16 ing sandi mesin. Ayo mbukak pathokan konektor ing 16 utas paralel:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Nalika sampeyan bisa ndeleng, asil malah luwih apik tinimbang karo ekstensi bedo (ora ngetang Swoole mlaku ing 2 pangolahan). Elinga yen kanggo konektor PECL, operasi Update lan Upsert kosong. Iki amarga kasunyatan sing operasi iki gagal karo kesalahan - Aku ora ngerti yen iku fault saka ext-paralel, ext-tarantool, utawa loro-lorone.

Saiki ayo mbandhingake kinerja SQL:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel
Wigati podho karo grafik kanggo konektor mlaku bebarengan?

bareng

Lan pungkasane, ayo ngringkes kabeh asil ing siji grafik kanggo ndeleng gambar sakabèhé kanggo ekstensi sing diuji. Ayo nambahake mung siji tes anyar menyang grafik, sing durung rampung - ayo mbukak coroutine Async kanthi podo karo nggunakake Paralel *. Gagasan nggabungake ekstensi ing ndhuwur wis ana rembugan penulis, nanging ora ana konsensus, sampeyan kudu nindakake dhewe.

* Ora bisa diluncurake coroutine Swoole karo Paralel; kayane ekstensi kasebut ora kompatibel.

Dadi, asil pungkasan:

Nyepetake konektor PHP kanggo Tarantool nggunakake Async, Swoole lan Paralel

Tinimbang kesimpulan

Ing mratelakake panemume, asil dadi cukup pantes, lan sakperangan alesan aku yakin sing iki ora watesan! Apa sampeyan kudu mutusake iki ing proyèk nyata mung kanggo dhewe, Aku mung bakal ngomong sing kanggo kula iku eksperimen menarik sing ngijini sampeyan kanggo ngira-ngira pinten sampeyan bisa "remet" metu saka konektor TCP sinkron karo minimal gaweyan. Yen sampeyan duwe gagasan kanggo nambah benchmarks, Aku bakal seneng nimbang request narik Panjenengan. Kabeh kode kanthi instruksi lan asil peluncuran diterbitake ing kapisah repositori.

Source: www.habr.com

Add a comment