Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү

Учурда PHP экосистемасында Tarantool сервери менен иштөө үчүн эки туташтыргыч бар - бул расмий PECL кеңейтүүсү tarantool/tarantool-php, С менен жазылган жана tarantool-php/client, PHP тилинде жазылган. Мен акыркысынын авторумун.

Бул макалада мен эки китепкананын тең иштешин текшерүүнүн натыйжалары менен бөлүшкүм келет жана кодго минималдуу өзгөртүүлөр менен кантип 3-5 көрсөткүчкө жетишүүгө болорун көрсөткүм келет (синтетикалык сыноолор боюнча!).

Эмнени сынайбыз?

Биз жогоруда айтылгандарды сынап көрөбүз синхрондуу асинхрондуу, параллелдүү жана асинхрондук-параллель иштеген туташтыргычтар. 🙂 Биз ошондой эле туташтыргычтардын кодуна тийгибиз келбейт. Учурда сиз каалаган нерсеге жетүү үчүн бир нече кеңейтүүлөр бар:

  • Swoole ― PHP үчүн жогорку натыйжалуу асинхрондук алкак. Alibaba жана Baidu сыяктуу интернет гиганттары тарабынан колдонулат. 4.1.0 версиясынан бери сыйкырдуу ыкма пайда болду SwooleRuntime::enableCoroutine(), бул сизге "синхрондуу PHP тармактык китепканаларын коддун бир сабы менен асинхрондуктарга айландырууга" мүмкүндүк берет.
  • Async жакында эле PHPде асинхрондук иш үчүн абдан келечектүү кеңейтүү болгон. Эмне үчүн жакында эле? Тилекке каршы, мага белгисиз себептерден улам автор репозиторийди өчүрүп салган жана долбоордун келечектеги тагдыры бүдөмүк. Мен аны колдонушум керек бир айрылардан. Swoole сыяктуу эле, бул кеңейтүү TCP жана TLS агымдарынын стандарттуу ишке ашуусун алардын асинхрондук версиялары менен алмаштыруу аркылуу асинхронияны иштетүү үчүн билегиңизди бир шилтеп коюу менен шымыңызды оңой эле кийүүгө мүмкүндүк берет. Бул параметр аркылуу ишке ашырылат "async.tcp = 1".
  • параллелдик ― phpdbg, apcu, pthreads, pcov, uopz сыяктуу китепканалардын автору, белгилүү Джо Уоткинстен жаңы кеңейтүү. Кеңейтүү PHPде көп агым үчүн API камсыз кылат жана pthreads үчүн алмаштыруучу катары жайгаштырылган. Китепкананын олуттуу чектөөсү бул PHPдин ZTS (Zend Thread Safe) версиясы менен гана иштеши.

Кантип сынайбыз?

Келгиле, алдын ала жазуу журналы өчүрүлгөн Tarantool инстанциясын ишке киргизели (wal_mode = жок) жана көбөйгөн тармак буфери (окуу алдыда = 1 * 1024 * 1024). Биринчи параметр диск менен иштөөнү жокко чыгарат, экинчиси операциялык тутумдун буферинен көбүрөөк суроо-талаптарды окууга мүмкүндүк берет жана ошону менен системалык чалуулардын санын азайтат.

Берилиштер менен иштеген эталондор үчүн (киргизүү, жок кылуу, окуу ж.б.) эталонду баштоодон мурун, 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 XNUMX кортеждери менен толтурулат.

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

Түзмөктөр кокус ачкыч маанисин колдонуу менен жеткиликтүү.

Эталондун өзү серверге бир суроо-талап, ал 10,000 5 жолу аткарылат (революция), ал өз кезегинде итерацияларда аткарылат. Итерациялар 3 итерациянын ортосундагы бардык убакыттын четтөөлөрү 1%* алгылыктуу ката чегинде болгонго чейин кайталанат. Андан кийин орточо натыйжа алынат. Процессорду дросселдештирүүнүн алдын алуу үчүн кайталоолордун ортосунда XNUMX секунддук тыныгуу бар. Луанын таштанды жыйноочусу ар бир итерациянын алдында өчүрүлөт жана ал аяктагандан кийин баштоого аргасыз болот. PHP процесси эталон үчүн керектүү кеңейтүүлөр менен гана ишке киргизилет, чыгаруу буферлөө иштетилген жана таштанды жыйноочу өчүрүлгөн.

* Айлануулардын, итерациялардын санын жана ката чегин эталондук орнотууларда өзгөртүүгө болот.

Сыноо чөйрөсү

Төмөндө жарыяланган жыйынтыктар MacBookPro (2015) операциялык тутумунда жасалган - Fedora 30 (ядро версиясы 5.3.8-200.fc30.x86_64). Tarantool докерде "параметри менен ишке киргизилген.--network host".

Пакет версиялары:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, куруу a872fc2f86
PHP: 7.3.11 (cli) (курулган: 22-окт. 2019-ж. 08:11:04)
tarantool/кардар: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ 7.3 үчүн патч)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
экс-параллель: 1.1.3

* Тилекке каршы, расмий туташтыргыч PHP версиясы > 7.2 менен иштебейт. PHP 7.3 боюнча кеңейтүүнү компиляциялоо жана иштетүү үчүн мен колдонууга туура келди жамаачы.

натыйжалары

Синхрондуу режим

Tarantool протоколу экилик форматты колдонот MessagePack билдирүүлөрдү сериялаштыруу үчүн. PECL туташтыргычында сериялаштыруу китепкананын тереңинде жашырылган жана колдонуучу жердин кодунан коддоо процессине таасир этет мүмкүн эместей көрүнөт. Таза PHP туташтыргычы, тескерисинче, стандарттык коддогучту кеңейтүү же өзүңүздүн ишке ашырууну колдонуу менен коддоо процессин ыңгайлаштыруу мүмкүнчүлүгүн берет. Кутудан чыккан эки коддоочу бар, бири ага негизделген msgpack/msgpack-php (расмий MessagePack PECL кеңейтүүсү), экинчиси күйгүзүлгөн rybakit/msgpack (таза PHPде).

Туташтыргычтарды салыштыруудан мурун, биз PHP туташтыргычы үчүн MessagePack коддоочуларынын өндүрүмдүүлүгүн өлчөйбүз жана андан аркы сыноолордо эң жакшы натыйжаны көрсөткөндү колдонобуз:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
PHP версиясы (Pure) ылдамдыгы боюнча PECL кеңейтүүсүнөн төмөн болсо да, чыныгы долбоорлордо мен аны колдонууну сунуштайм rybakit/msgpack, анткени расмий MessagePack кеңейтүүсүндө форматтын спецификациясы жарым-жартылай гана ишке ашырылган (мисалы, ыңгайлаштырылган маалымат түрлөрүн колдоо жок, ансыз сиз Decimal - Tarantool 2.3 киргизилген жаңы маалымат түрүн колдоно албайсыз) жана башкалардын саны көйгөйлөр (анын ичинде PHP 7.4 менен шайкештик маселелери). Жалпысынан алганда, долбоор ташталган окшойт.

Ошентип, синхрондуу режимде туташтыргычтардын иштешин өлчөйбүз:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
Графиктен көрүнүп тургандай, PECL туташтыргычы (Tarantool) PHP туташтыргычына (Клиент) салыштырмалуу жакшыраак иштешин көрсөтөт. Бирок бул таң калыштуу эмес, анткени акыркысы жайыраак тилде ишке ашырылгандан тышкары, иш жүзүндө көбүрөөк иш аткарат: ар бир чалуу менен жаңы объект түзүлөт. өтүнүч и жооп (Тандоо учурда - ошондой эле критерийлер, жана Жаңыртуу/Жаңыртуу учурда ― иш), өзүнчө субъектилер байланыш, Packer и Handler алар дагы кошумча чыгымдарды кошот. Албетте, ийкемдүүлүк баада келет. Бирок, жалпысынан алганда, PHP котормочу жакшы өндүрүмдүүлүктү көрсөтөт, айырмачылык болсо да, бул анча деле маанилүү эмес жана PHP 7.4де JITти айтпаганда да, PHP 8те алдын ала жүктөөнү колдонууда андан да азыраак болушу мүмкүн.

Келгиле, уланталы. Tarantool 2.0 SQL үчүн колдоо кошту. Келгиле, SQL протоколунун жардамы менен Select, Insert, Update жана Delete операцияларын аткарып, натыйжаларды noSQL (бинардык) эквиваленттери менен салыштырып көрөлү:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
SQL натыйжалары анча деле таасирдүү эмес (биз дагы эле синхрондук режимди сынап жатканыбызды эскерте кетейин). Бирок, мен буга чейин капа болбос элем; SQL колдоосу дагы эле активдүү иштеп чыгууда (салыштырмалуу жакында, мисалы, колдоо кошулду билдирүүлөр даярдалган) жана тизмеге ылайык маселелер, SQL кыймылдаткычы келечекте бир катар оптималдаштыруудан өтөт.

Асинхрондук

Келгиле, келгиле, Async кеңейтүүсү жогорудагы натыйжаларды жакшыртууга кандайча жардам берерин карап көрөлү. Асинхрондук программаларды жазуу үчүн кеңейтүү биз колдоно турган корутиндерге негизделген API берет. Биздин айлана-чөйрө үчүн корутиндердин оптималдуу саны 25 экенин эмпирикалык түрдө аныктайбыз:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
10,000 корутинге 25 XNUMX операцияны “жайып”, эмне болорун көрүңүз:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
үчүн секундасына операциялардын саны 3 эседен ашык өстү tarantool-php/client!

Тилекке каршы, 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 корутинде XNUMX операцияны аткарат). Процесстер аркылуу түзүлөт SwooleProcess.

жыйынтыгы:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
Swole бир процессте иштегенде Async менен салыштырганда бир аз төмөн натыйжаны көрсөтөт, бирок 2 процессте сүрөт кескин өзгөрөт (2 саны кокустан тандалган эмес; менин машинамда эң жакшы натыйжаны көрсөткөн 2 процесс).

Айтмакчы, Async кеңейтүүсүндө процесстер менен иштөө үчүн API да бар, бирок ал жерде мен бир же бир нече процесстерде эталондорду иштетүүдөн эч кандай айырмачылыкты байкаган жокмун (мүмкүн, мен бир жерден ката кетиргенмин).

SQL жана экилик протокол:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
Async сыяктуу эле, экилик жана SQL операцияларынын ортосундагы айырма асинхрондук режимде жок кылынат.

параллелдик

Параллель кеңейтүү корутиндер жөнүндө эмес, жиптер жөнүндө болгондуктан, параллелдүү жиптердин оптималдуу санын өлчөйбүз:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
Бул менин машинамда 16га барабар. 16 параллелдүү жипте туташтыргыч көрсөткүчтөрдү иштетели:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
Көрүнүп тургандай, натыйжа асинхрондук кеңейтүүлөрдөн да жакшыраак (2 процессте иштеген Swooleну эсепке албаганда). PECL туташтыргычы үчүн Жаңыртуу жана Upsert операциялары бош экенин эске алыңыз. Бул бул операциялар ката менен ишке ашпай калгандыгына байланыштуу - бул экс-параллель, экс-tarantool же экөө тең күнөөлүүбү, билбейм.

Эми SQL иштешин салыштырып көрөлү:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү
Синхрондуу иштеген туташтыргычтар үчүн графиктин окшоштугуна көңүл буруңузбу?

Бардыгы бирге

Акыр-аягы, сыналган кеңейтүүлөрдүн жалпы сүрөтүн көрүү үчүн бардык натыйжаларды бир графикте жалпылайлы. Келгиле, диаграммага бир гана жаңы тестти кошолу, аны биз жасай элекпиз - келгиле, Parallel* аркылуу параллелдүү Async coroutines иштетели. Жогорудагы кеңейтүүлөрдү интеграциялоо идеясы мурунтан эле бар талкуулашты авторлор, бирок консенсуска жетишилген жок, муну өзүңүз жасашыңыз керек.

* Parallel менен Swoole корутиндерин ишке киргизүү мүмкүн болгон жок; бул кеңейтүүлөр туура келбейт окшойт.

Ошентип, акыркы жыйынтыктар:

Async, Swoole жана Parallel аркылуу Tarantool үчүн PHP туташтыргычтарын тездетүү

Ордуна корутундусу

Менин оюмча, натыйжалар абдан татыктуу болуп чыкты жана эмнегедир мен бул чек эмес экенине ишенем! Сиз муну чыныгы долбоордо өзүңүз үчүн чечишиңиз керекпи, мен үчүн бул кызыктуу эксперимент болду деп айтам, ал сиз синхрондук TCP туташтыргычынан минималдуу күч менен канчалык “кысып” ала турганыңызды баалоого мүмкүндүк берет. Эгерде сизде эталондорду жакшыртуу боюнча идеяларыңыз болсо, мен сиздин тартуу өтүнүчүңүздү карап чыгууга кубанычта болом. Ишке киргизүү нускамалары жана натыйжалары менен бардык код өзүнчө жарыяланды репозиторийлер.

Source: www.habr.com

Комментарий кошуу