Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel

Ninu ilolupo ilolupo PHP lọwọlọwọ awọn asopọ meji wa fun ṣiṣẹ pẹlu olupin Tarantool - eyi ni itẹsiwaju PECL osise tarantool/tarantool-php, ti a kọ sinu C, ati tarantool-php / onibara, ti a kọ ni PHP. Emi ni onkowe ti igbehin.

Ninu nkan yii, Emi yoo fẹ lati pin awọn abajade ti idanwo iṣẹ ti awọn ile-ikawe mejeeji ati ṣafihan bii, pẹlu awọn ayipada kekere si koodu, o le ṣaṣeyọri ilosoke iṣẹ ṣiṣe 3-5 (lori awọn idanwo sintetiki!).

Kini a yoo ṣe idanwo?

A yoo ṣe idanwo awọn ti a mẹnuba loke amuṣiṣẹpọ awọn asopọ ti nṣiṣẹ ni asynchronously, ni afiwe, ati asynchronously-parallel. 🙂 A tun ko fẹ lati fi ọwọ kan koodu ti awọn asopọ funrararẹ. Lọwọlọwọ ọpọlọpọ awọn amugbooro wa lati ṣaṣeyọri ohun ti o fẹ:

  • Swoole - ilana asynchronous iṣẹ ṣiṣe giga fun PHP. Ti a lo nipasẹ awọn omiran Intanẹẹti bii Alibaba ati Baidu. Lati ẹya 4.1.0 ọna idan ti han SwooleRuntime:: mu ṣiṣẹCoroutine(), eyiti o fun ọ laaye lati ṣe iyipada awọn ile-ikawe nẹtiwọki PHP amuṣiṣẹpọ si awọn aṣiṣẹpọ pẹlu laini koodu kan.”
  • Async jẹ titi laipẹ itẹsiwaju ti o ni ileri pupọ fun iṣẹ asynchronous ni PHP. Kini idi titi di aipẹ? Laanu, fun idi kan ti a ko mọ si mi, onkọwe paarẹ ibi ipamọ naa ati pe ọjọ iwaju ti iṣẹ akanṣe ko ṣe akiyesi. Emi yoo ni lati lo nipasẹ ọkan lati orita. Bii Swoole, ifaagun yii n gba ọ laaye lati tan awọn sokoto rẹ ni rọọrun pẹlu fifẹ ọwọ lati mu asynchrony ṣiṣẹ nipa rirọpo imuse boṣewa ti awọn ṣiṣan TCP ati TLS pẹlu awọn ẹya asynchronous wọn. Eyi ni a ṣe nipasẹ aṣayan ".async.tcp = 1".
  • Ni afiwe - Ifaagun tuntun ti iṣẹtọ lati ọdọ Joe Watkins ti a mọ daradara, onkọwe ti iru awọn ile-ikawe bii phpdbg, apcu, pthreads, pcov, uopz. Ifaagun naa n pese API fun multithreading ni PHP ati pe o wa ni ipo bi rirọpo fun awọn pthreads. Idiwọn pataki ti ile-ikawe ni pe o ṣiṣẹ nikan pẹlu ẹya ZTS (Zend Thread Safe) ti PHP.

Bawo ni a yoo ṣe idanwo?

Jẹ ki a ṣe ifilọlẹ apẹẹrẹ Tarantool pẹlu alaabo gedu kikọ-iwaju (wal_mode = ko si) ati ifipamọ nẹtiwọọki pọ si (readhead = 1 * 1024 * 1024). Aṣayan akọkọ yoo yọkuro iṣẹ pẹlu disiki naa, keji yoo jẹ ki o ṣee ṣe lati ka awọn ibeere diẹ sii lati inu ifipamọ ẹrọ ati nitorinaa dinku nọmba awọn ipe eto.

Fun awọn aṣepari ti o ṣiṣẹ pẹlu data (fi sii, piparẹ, kika, ati bẹbẹ lọ), ṣaaju ki o to bẹrẹ ala-ilẹ, aaye memtx yoo jẹ (tun) ṣẹda, ninu eyiti awọn iye atọka akọkọ ti ṣẹda nipasẹ olupilẹṣẹ ti awọn iye integer ti a paṣẹ. (ilana).
DDL aaye naa dabi eyi:

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

Ti o ba jẹ dandan, ṣaaju ṣiṣe ala-ilẹ, aaye naa kun pẹlu awọn tuples 10,000 ti fọọmu naa

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

Tuples wa ni wọle nipa lilo a ID bọtini iye.

Aṣepari funrararẹ jẹ ibeere ẹyọkan si olupin naa, eyiti o ṣe ni awọn akoko 10,000 (awọn iyipada), eyiti, lapapọ, ni ṣiṣe ni awọn iterations. Awọn iterations naa tun jẹ atunṣe titi gbogbo awọn iyapa akoko laarin awọn iterations 5 wa laarin aṣiṣe itẹwọgba ti 3%*. Lẹhin eyi, a mu abajade apapọ. Idaduro iṣẹju-aaya 1 wa laarin awọn iterations lati ṣe idiwọ ero-iṣelọpọ lati throtling. Akojo-idọti Lua jẹ alaabo ṣaaju aṣetunṣe kọọkan a si fi agbara mu lati bẹrẹ lẹhin ti o pari. Ilana PHP ti ṣe ifilọlẹ nikan pẹlu awọn amugbooro ti o ṣe pataki fun ala-ilẹ, pẹlu ṣiṣe ifisilẹ iṣelọpọ ati alaabo agbo-idoti.

* Nọmba awọn iyipada, awọn iterations ati ala aṣiṣe le yipada ni awọn eto ala.

Idanwo ayika

Awọn abajade ti a tẹjade ni isalẹ ni a ṣe lori MacBookPro (2015), ẹrọ ṣiṣe - Fedora 30 (ẹya ekuro 5.3.8-200.fc30.x86_64). Tarantool ti ṣe ifilọlẹ ni docker pẹlu paramita naa "--network host".

Awọn ẹya idii:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, kọ a872fc2f86
PHP: 7.3.11 (cli) (ti a ṣe: Oṣu Kẹwa 22, 2019 08:11:04)
tarantool / onibara: 0.6.0
rybakit / msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ alemo fun 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* Laanu, asopo osise ko ṣiṣẹ pẹlu ẹya PHP> 7.2. Lati ṣajọ ati ṣiṣe itẹsiwaju lori PHP 7.3, Mo ni lati lo alemo.

Результаты

Ipo amuṣiṣẹpọ

Ilana Tarantool nlo ọna kika alakomeji kan Apo ifiranṣẹ lati serialize awọn ifiranṣẹ. Ninu asopo PECL, serialization ti farapamọ jinlẹ ni awọn ijinle ti ile-ikawe ati ni ipa lori ilana fifi koodu lati koodu olumulo ko dabi ṣee ṣe. Asopọ PHP mimọ kan, ni ilodi si, n pese agbara lati ṣe akanṣe ilana fifi ẹnọ kọ nkan nipa fifẹ koodu koodu boṣewa tabi nipa lilo imuse tirẹ. Awọn koodu koodu meji wa lati inu apoti, ọkan da lori msgpack/msgpack-php (osise MessagePack PECL itẹsiwaju), awọn miiran wa ni titan rybakit/msgpack (ni PHP funfun).

Ṣaaju ki o to ṣe afiwe awọn asopọ, a yoo ṣe iwọn iṣẹ ti awọn encoders MessagePack fun asopo PHP ati ni awọn idanwo siwaju a yoo lo ọkan ti o fihan abajade to dara julọ:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Botilẹjẹpe ẹya PHP (Pure) kere si itẹsiwaju PECL ni iyara, ni awọn iṣẹ akanṣe gidi Emi yoo tun ṣeduro lilo rẹ rybakit/msgpack, nitori ninu ifaagun IfiranṣẹPack osise naa sipesifikesonu kika jẹ imuse ni apakan nikan (fun apẹẹrẹ, ko si atilẹyin fun awọn oriṣi data aṣa, laisi eyiti iwọ kii yoo ni anfani lati lo eleemewa - iru data tuntun ti a ṣe ni Tarantool 2.3) ati pe o ni a nọmba ti awọn miran awọn iṣoro (pẹlu awọn ọran ibamu pẹlu PHP 7.4). O dara, ni gbogbogbo, iṣẹ naa dabi ẹni ti a kọ silẹ.

Nitorinaa, jẹ ki a ṣe iwọn iṣẹ ti awọn asopọ ni ipo amuṣiṣẹpọ:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Gẹgẹbi a ti le rii lati ori aworan, asopo PECL (Tarantool) ṣe afihan iṣẹ ṣiṣe ti o dara julọ ni akawe si asopo PHP (Onibara). Ṣugbọn eyi kii ṣe iyanilenu, fun pe igbehin, ni afikun si imuse ni ede ti o lọra, nitootọ ṣe iṣẹ diẹ sii: a ṣẹda ohun titun pẹlu ipe kọọkan. ìbéèrè и esi (ninu ọran ti Yan - tun àwárí mu, ati ninu ọran ti Imudojuiwọn/Imudojuiwọn - mosi), awọn nkan lọtọ asopọ, Apoti и Handler wọn tun ṣe afikun si oke. O han ni, irọrun wa ni idiyele kan. Sibẹsibẹ, ni gbogbogbo, olutumọ PHP ṣe afihan iṣẹ to dara, botilẹjẹpe iyatọ wa, ko ṣe pataki ati, boya, yoo jẹ paapaa kere si nigba lilo iṣaju iṣaju ni PHP 7.4, kii ṣe mẹnuba JIT ni PHP 8.

Jẹ ki a tẹsiwaju. Tarantool 2.0 ṣe afikun atilẹyin fun SQL. Jẹ ki a gbiyanju lati ṣe Yan, Fi sii, Ṣe imudojuiwọn ati Parẹ awọn iṣẹ ṣiṣe ni lilo ilana SQL ki o ṣe afiwe awọn abajade pẹlu awọn deede noSQL (alakomeji):

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Awọn abajade SQL kii ṣe iwunilori pupọ (jẹ ki n leti pe a tun n ṣe idanwo ipo amuṣiṣẹpọ). Sibẹsibẹ, Emi kii yoo binu nipa eyi ṣaaju akoko; gbaradi gbólóhùn) ati, idajọ nipasẹ awọn akojọ oran, SQL engine yoo faragba nọmba kan ti o dara ju ni ojo iwaju.

async

O dara, ni bayi jẹ ki a wo bii itẹsiwaju Async ṣe le ṣe iranlọwọ fun wa ni ilọsiwaju awọn abajade loke. Lati kọ awọn eto asynchronous, itẹsiwaju pese API ti o da lori awọn coroutines, eyiti a yoo lo. A rii ni ilodisi pe nọmba ti o dara julọ ti awọn coroutines fun agbegbe wa jẹ 25:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
“Tan” awọn iṣẹ ṣiṣe 10,000 kọja awọn coroutines 25 ki o wo ohun ti o ṣẹlẹ:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Awọn nọmba ti mosi fun keji pọ nipa diẹ ẹ sii ju 3 igba fun tarantool-php / onibara!

Ibanujẹ, asopo PECL ko bẹrẹ pẹlu ext-async.

Kini nipa SQL?

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Gẹgẹbi o ti le rii, ni ipo asynchronous iyatọ laarin ilana alakomeji ati SQL di laarin ala ti aṣiṣe.

Swoole

Lẹẹkansi a rii nọmba ti o dara julọ ti awọn coroutines, ni akoko yii fun Swoole:
Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Jẹ ki a da duro ni 25. Jẹ ki a tun ṣe ẹtan kanna gẹgẹbi pẹlu itẹsiwaju Async - pin kaakiri awọn iṣẹ ṣiṣe 10,000 laarin awọn coroutines 25. Ni afikun, a yoo ṣafikun idanwo miiran ninu eyiti a yoo pin gbogbo iṣẹ naa si awọn ilana meji meji (eyini ni, ilana kọọkan yoo ṣe awọn iṣẹ ṣiṣe 2 ni awọn coroutines 5,000). Awọn ilana yoo ṣẹda nipa lilo Ilana Swoole.

Awọn abajade:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Swole ṣe afihan abajade kekere diẹ ni akawe si Async nigba ṣiṣe ni ilana kan, ṣugbọn pẹlu awọn ilana 2 aworan naa yipada ni iyalẹnu (nọmba 2 ko yan nipasẹ aye, lori ẹrọ mi, o jẹ awọn ilana 2 ti o ṣafihan abajade to dara julọ).

Nipa ọna, itẹsiwaju Async tun ni API kan fun ṣiṣẹ pẹlu awọn ilana, ṣugbọn nibẹ Emi ko ṣe akiyesi eyikeyi iyatọ lati ṣiṣe awọn ala-ilẹ ni ọkan tabi diẹ ẹ sii awọn ilana (o ṣee ṣe pe mo ti bajẹ ni ibikan).

SQL vs Ilana alakomeji:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Gẹgẹbi pẹlu Async, iyatọ laarin alakomeji ati awọn iṣẹ SQL ti yọkuro ni ipo asynchronous.

Ni afiwe

Niwọn bi Ifaagun Parallel kii ṣe nipa awọn coroutines, ṣugbọn nipa awọn okun, jẹ ki a wọn nọmba to dara julọ ti awọn okun ti o jọra:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
O jẹ dogba si 16 lori ẹrọ mi. Jẹ ki a ṣiṣẹ awọn ipilẹ asopo lori awọn okun ti o jọra 16:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Bii o ti le rii, abajade paapaa dara julọ ju pẹlu awọn amugbooro asynchronous (kii ṣe kika Swoole ti n ṣiṣẹ lori awọn ilana 2). Ṣe akiyesi pe fun asopo PECL, awọn iṣẹ imudojuiwọn ati Upsert sofo. Eyi jẹ nitori otitọ pe awọn iṣẹ ṣiṣe wọnyi kuna pẹlu aṣiṣe kan - Emi ko mọ boya o jẹ ẹbi ext-parallel, ext-tarantool, tabi mejeeji.

Bayi jẹ ki a ṣe afiwe iṣẹ SQL:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel
Ṣe akiyesi ibajọra pẹlu ayaworan fun awọn asopọ ti nṣiṣẹ ni mimuuṣiṣẹpọ?

Papo

Ati nikẹhin, jẹ ki a ṣe akopọ gbogbo awọn abajade ni aworan kan lati wo aworan gbogbogbo fun awọn amugbooro idanwo. Jẹ ki a ṣafikun idanwo tuntun kan si chart, eyiti a ko tii ṣe sibẹsibẹ - jẹ ki a ṣiṣẹ Async coroutines ni afiwe pẹlu Parallel *. Ero ti iṣakojọpọ awọn amugbooro loke ti wa tẹlẹ a ti jiroro awọn onkọwe, ṣugbọn ko si ipohunpo ti a ti de, iwọ yoo ni lati ṣe funrararẹ.

* Ko ṣee ṣe lati ṣe ifilọlẹ awọn coroutines Swoole pẹlu Parallel;

Nitorinaa, awọn abajade ikẹhin:

Imuyara awọn asopọ PHP fun Tarantool ni lilo Async, Swoole ati Parallel

Dipo ti pinnu

Ni ero mi, awọn abajade ti jade lati jẹ ohun ti o yẹ, ati fun idi kan Mo ni idaniloju pe eyi kii ṣe opin! Boya o nilo lati pinnu eyi ni iṣẹ akanṣe gidi nikan fun ararẹ, Emi yoo kan sọ pe fun mi o jẹ idanwo ti o nifẹ ti o fun ọ laaye lati ṣe iṣiro iye ti o le “fun pọ” kuro ninu asopo TCP amuṣiṣẹpọ pẹlu ipa diẹ. Ti o ba ni awọn imọran fun ilọsiwaju awọn ala, Emi yoo dun lati gbero ibeere fifa rẹ. Gbogbo koodu pẹlu awọn ilana ifilọlẹ ati awọn abajade jẹ atẹjade ni lọtọ awọn ibi ipamọ.

orisun: www.habr.com

Fi ọrọìwòye kun