Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel

Katika mfumo wa ikolojia wa PHP kwa sasa kuna viunganishi viwili vya kufanya kazi na seva ya Tarantool - hii ndio kiendelezi rasmi cha PECL. tarantool/tarantool-php, iliyoandikwa katika C, na tarantool-php/mteja, iliyoandikwa katika PHP. Mimi ndiye mwandishi wa mwisho.

Katika nakala hii, ningependa kushiriki matokeo ya upimaji wa utendaji wa maktaba zote mbili na kuonyesha jinsi, na mabadiliko madogo kwa nambari, unaweza kufikia ongezeko la utendaji 3-5 (kwenye vipimo vya syntetisk!).

Tutajaribu nini?

Tutajaribu zilizotajwa hapo juu ya kusawazisha viunganishi vinavyoendesha kwa usawa, kwa sambamba, na kwa usawa-sambamba. πŸ™‚ Pia hatutaki kugusa msimbo wa viunganishi wenyewe. Kwa sasa kuna viendelezi kadhaa vinavyopatikana ili kufikia kile unachotaka:

  • Swoole ― mfumo wa utendaji wa hali ya juu wa asynchronous kwa PHP. Inatumiwa na makampuni makubwa ya mtandao kama Alibaba na Baidu. Tangu toleo la 4.1.0 njia ya uchawi imeonekana SwooleRuntime ::wezeshaCoroutine(), ambayo hukuruhusu "kubadilisha maktaba za mtandao za PHP zilizosawazishwa kuwa zisizo sawa na safu moja ya nambari."
  • Async ilikuwa hadi hivi majuzi kiendelezi cha kuahidi sana kwa kazi ya asynchronous katika PHP. Kwa nini hadi hivi karibuni? Kwa bahati mbaya, kwa sababu isiyojulikana kwangu, mwandishi alifuta hazina na hatima ya baadaye ya mradi haijulikani. Itabidi niitumie moja kutoka kwa uma. Kama vile Swoole, kiendelezi hiki hukuruhusu kuwasha suruali yako kwa urahisi kwa kuzungusha mkono ili kuwezesha ulandanishi kwa kubadilisha utekelezaji wa kawaida wa mitiririko ya TCP na TLS na matoleo yao yasiyolingana. Hii inafanywa kupitia chaguo "async.tcp = 1".
  • Sambamba ― kiendelezi kipya kutoka kwa Joe Watkins anayejulikana, mwandishi wa maktaba kama vile phpdbg, apcu, pthreads, pcov, uopz. Kiendelezi hutoa API ya usomaji mwingi katika PHP na imewekwa kama uingizwaji wa pthreads. Kizuizi kikubwa cha maktaba ni kwamba inafanya kazi tu na toleo la ZTS (Zend Thread Safe) la PHP.

Tutapima vipi?

Wacha tuzindue mfano wa Tarantool na ukataji miti wa mbele umezimwa (wal_mode = hakuna) na kuongezeka kwa buffer ya mtandao (soma mbele = 1 * 1024 * 1024) Chaguo la kwanza litaondoa kazi na diski, pili itafanya iwezekanavyo kusoma maombi zaidi kutoka kwa buffer ya mfumo wa uendeshaji na hivyo kupunguza idadi ya simu za mfumo.

Kwa alama zinazofanya kazi na data (kuingiza, kufuta, kusoma, n.k.), kabla ya kuanza alama, nafasi ya memtx itaundwa (re) ambayo maadili ya msingi ya faharisi huundwa na jenereta ya nambari kamili zilizoamriwa. (mlolongo).
Nafasi ya DL inaonekana kama hii:

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

Ikiwa ni lazima, kabla ya kuendesha alama, nafasi imejazwa na nakala 10,000 za fomu.

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

Nakala hufikiwa kwa kutumia thamani ya ufunguo nasibu.

Benchmark yenyewe ni ombi moja kwa seva, ambayo inatekelezwa mara 10,000 (mapinduzi), ambayo, kwa upande wake, yanatekelezwa kwa kurudia. Marudio yanarudiwa hadi mikengeuko ya wakati wote kati ya marudio 5 iwe ndani ya hitilafu inayokubalika ya 3%*. Baada ya hayo, matokeo ya wastani yanachukuliwa. Kuna kusitisha kwa sekunde 1 kati ya marudio ili kuzuia kichakataji kusukuma. Kikusanya taka cha Lua kimezimwa kabla ya kila marudio na hulazimika kuanza baada ya kukamilika. Mchakato wa PHP huzinduliwa tu na viendelezi vinavyohitajika kwa kielelezo, na uakibishaji wa pato umewezeshwa na kikusanya takataka kimezimwa.

* Idadi ya mapinduzi, marudio na kiwango cha juu cha makosa kinaweza kubadilishwa katika mipangilio ya benchmark.

Mazingira ya mtihani

Matokeo yaliyochapishwa hapa chini yalifanywa kwenye MacBookPro (2015), mfumo wa uendeshaji - Fedora 30 (toleo la kernel 5.3.8-200.fc30.x86_64). Tarantool ilizinduliwa katika docker na parameta "--network host".

Matoleo ya kifurushi:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, jenga a872fc2f86
PHP: 7.3.11 (cli) (iliyojengwa: Oktoba 22 2019 08:11:04)
tarantool/mteja: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ kiraka kwa 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-sambamba: 1.1.3

* Kwa bahati mbaya, kiunganishi rasmi haifanyi kazi na toleo la PHP> 7.2. Kukusanya na kuendesha kiendelezi kwenye PHP 7.3, ilibidi nitumie kiraka.

Matokeo

Hali ya Usawazishaji

Itifaki ya Tarantool hutumia umbizo la binary MessagePack kuratibu ujumbe. Kwenye kiunganishi cha PECL, usakinishaji hufichwa ndani kabisa ya kina cha maktaba na huathiri mchakato wa usimbaji kutoka kwa nambari ya mtumiaji. haionekani kuwa inawezekana. Kiunganishi safi cha PHP, kinyume chake, hutoa uwezo wa kubinafsisha mchakato wa usimbaji kwa kupanua kisimbaji cha kawaida au kwa kutumia utekelezaji wako mwenyewe. Kuna visimbaji viwili vinavyopatikana nje ya kisanduku, kimoja kinategemea msgpack/msgpack-php (kiendelezi rasmi cha MessagePack PECL), nyingine imewashwa rybakit/msgpack (katika PHP safi).

Kabla ya kulinganisha viunganishi, tutapima utendakazi wa visimbaji vya MessagePack kwa kiunganishi cha PHP na katika majaribio zaidi tutatumia ile inayoonyesha matokeo bora zaidi:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Ingawa toleo la PHP (Safi) ni duni kwa ugani wa PECL kwa kasi, katika miradi halisi bado ningependekeza kuitumia. rybakit/msgpack, kwa sababu katika kiendelezi rasmi cha MessagePack vipimo vya umbizo hutekelezwa kwa sehemu tu (kwa mfano, hakuna msaada kwa aina za data maalum, bila ambayo hutaweza kutumia Desimali - aina mpya ya data iliyoletwa katika Tarantool 2.3) na ina a idadi ya wengine matatizo (pamoja na maswala ya utangamano na PHP 7.4). Kweli, kwa ujumla, mradi unaonekana kutelekezwa.

Kwa hivyo, wacha tupime utendaji wa viunganishi katika hali ya kusawazisha:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Kama inavyoonekana kutoka kwa grafu, kiunganishi cha PECL (Tarantool) kinaonyesha utendaji bora ikilinganishwa na kiunganishi cha PHP (Mteja). Lakini hii haishangazi, ikizingatiwa kwamba mwisho, pamoja na kutekelezwa kwa lugha polepole, kwa kweli hufanya kazi zaidi: kitu kipya huundwa kwa kila simu. Kuomba ΠΈ Majibu (katika kesi ya Chagua - pia Vigezo, na kwa upande wa Sasisha/Upsert ― uendeshaji), vyombo tofauti Connection, Packer ΠΈ Handler pia huongeza juu. Ni wazi, kubadilika huja kwa bei. Walakini, kwa ujumla, mkalimani wa PHP anaonyesha utendaji mzuri, ingawa kuna tofauti, sio muhimu na, labda, itakuwa kidogo wakati wa kutumia upakiaji wa mapema katika PHP 7.4, bila kutaja JIT katika PHP 8.

Hebu tuendelee. Tarantool 2.0 iliongeza usaidizi kwa SQL. Wacha tujaribu kufanya Teua, Ingiza, Sasisha na Futa shughuli kwa kutumia itifaki ya SQL na kulinganisha matokeo na sawa na noSQL (binary):

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Matokeo ya SQL sio ya kuvutia sana (wacha nikukumbushe kuwa bado tunajaribu hali ya kusawazisha). Walakini, nisingekasirika juu ya hili kabla ya wakati; Usaidizi wa SQL bado uko chini ya maendeleo hai (hivi karibuni, kwa mfano, msaada uliongezwa. taarifa zilizoandaliwa) na, kwa kuzingatia orodha masuala ya, injini ya SQL itapitia uboreshaji kadhaa katika siku zijazo.

Usawazishaji

Sasa hebu tuone jinsi kiendelezi cha Async kinaweza kutusaidia kuboresha matokeo hapo juu. Ili kuandika programu za asynchronous, ugani hutoa API kulingana na coroutines, ambayo tutatumia. Tunagundua kwa nguvu kwamba idadi kamili ya coroutines kwa mazingira yetu ni 25:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
"Eneza" operesheni 10,000 kwenye coroutines 25 na uone kitakachotokea:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Idadi ya shughuli kwa sekunde iliongezeka kwa zaidi ya mara 3 kwa tarantool-php/mteja!

Cha kusikitisha ni kwamba, kiunganishi cha PECL hakikuanza na ext-async.

Vipi kuhusu SQL?

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Kama unavyoona, katika hali ya asynchronous tofauti kati ya itifaki ya binary na SQL ikawa ndani ya ukingo wa makosa.

Swoole

Tena tunapata idadi kamili ya coroutines, wakati huu kwa Swoole:
Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Wacha tusimame kwa 25. Wacha turudie ujanja sawa na ugani wa Async - tusambaze shughuli 10,000 kati ya coroutines 25. Kwa kuongeza, tutaongeza mtihani mwingine ambao tutagawanya kazi yote katika taratibu 2 mbili (yaani, kila mchakato utafanya shughuli 5,000 katika coroutines 25). Taratibu zitaundwa kwa kutumia SwooleProcess.

Matokeo:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Swole inaonyesha matokeo ya chini kidogo ikilinganishwa na Async wakati inaendeshwa katika mchakato mmoja, lakini kwa michakato 2 picha inabadilika sana (nambari ya 2 haikuchaguliwa kwa bahati; kwenye mashine yangu, ilikuwa michakato 2 iliyoonyesha matokeo bora).

Kwa njia, kiendelezi cha Async pia kina API ya kufanya kazi na michakato, lakini hapo sikuona tofauti yoyote kutoka kwa kuweka alama katika mchakato mmoja au zaidi (inawezekana kwamba nilichanganya mahali pengine).

SQL dhidi ya itifaki ya binary:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Kama ilivyo kwa Async, tofauti kati ya shughuli za binary na SQL huondolewa katika hali ya asynchronous.

Sambamba

Kwa kuwa upanuzi wa Sambamba sio juu ya coroutines, lakini juu ya nyuzi, wacha tupime idadi kamili ya nyuzi zinazofanana:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Ni sawa na 16 kwenye mashine yangu. Wacha tuendeshe alama za kiunganishi kwenye nyuzi 16 zinazofanana:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Kama unavyoona, matokeo ni bora zaidi kuliko upanuzi wa asynchronous (bila kuhesabu Swoole inayoendesha michakato 2). Kumbuka kuwa kwa kiunganishi cha PECL, shughuli za Usasishaji na Upsert ni tupu. Hii ni kwa sababu ya ukweli kwamba shughuli hizi zilishindwa na hitilafu - sijui ikiwa ilikuwa kosa la ext-parallel, ext-tarantool, au zote mbili.

Sasa hebu tulinganishe utendaji wa SQL:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel
Je! ungependa kuona ulinganifu na grafu ya viunganishi vinavyofanya kazi sawasawa?

Pamoja

Na hatimaye, hebu tufanye muhtasari wa matokeo yote katika grafu moja ili kuona picha ya jumla ya viendelezi vilivyojaribiwa. Hebu tuongeze jaribio moja jipya kwenye chati, ambalo bado hatujafanya - wacha tuendeshe coroutines za Async sambamba kwa kutumia Parallel*. Wazo la kuunganisha viendelezi hapo juu tayari ilijadiliwa waandishi, lakini hakuna makubaliano yaliyofikiwa, itabidi uifanye mwenyewe.

* Haikuwezekana kuzindua coroutines za Swoole kwa Sambamba; inaonekana kwamba viendelezi hivi havioani.

Kwa hivyo, matokeo ya mwisho:

Kuharakisha viunganishi vya PHP kwa Tarantool kwa kutumia Async, Swoole na Parallel

Badala ya hitimisho

Kwa maoni yangu, matokeo yaligeuka kuwa yanafaa kabisa, na kwa sababu fulani nina hakika kuwa hii sio kikomo! Ikiwa unahitaji kuamua hili katika mradi wa kweli kwako mwenyewe, nitasema tu kwamba kwangu ilikuwa jaribio la kupendeza ambalo hukuruhusu kutathmini ni kiasi gani unaweza "kubana" kutoka kwa kiunganishi cha TCP kinachosawazishwa kwa bidii kidogo. Ikiwa una mawazo ya kuboresha viwango, nitafurahi kuzingatia ombi lako la kuvuta. Nambari zote zilizo na maagizo ya uzinduzi na matokeo huchapishwa kwa njia tofauti hazina.

Chanzo: mapenzi.com

Kuongeza maoni