Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel

I loko o ka kaiaola PHP i kēia manawa aia ʻelua mau mea hoʻohui no ka hana ʻana me ka server Tarantool - ʻo ia ka hoʻonui PECL mana. tarantool/tarantool-php, kakauia ma C, a tarantool-php/client, kākau ʻia ma PHP. ʻO wau ke kumu o ka hope.

Ma kēia ʻatikala, makemake wau e kaʻana like i nā hopena o ka hoʻāʻo ʻana o nā hale waihona puke ʻelua a hōʻike pehea, me nā hoʻololi liʻiliʻi i ke code, hiki iā ʻoe ke hoʻokō i kahi hoʻonui hana 3-5 (ma nā hoʻokolohua synthetic!).

He aha kā mākou e hoʻāʻo ai?

E ho'āʻo mākou i nā mea i'ōleloʻia ma luna huikau nā mea hoʻohui e holo like ʻole, ma ke ʻano like, a me asynchronously-parallel. 🙂 ʻAʻole mākou makemake e hoʻopā i ke code o nā mea hoʻohui iā lākou iho. Aia i kēia manawa he nui nā hoʻonui i hiki ke hoʻokō i kāu makemake:

  • Swoole ― he hoʻolālā asynchronous hana kiʻekiʻe no PHP. Hoʻohana ʻia e nā pilikua pūnaewele e like me Alibaba a me Baidu. Mai ka mana 4.1.0 ua puka mai kahi ala kilokilo SwooleRuntime::enableCoroutine(), hiki iā ʻoe ke "hoʻololi i nā waihona pūnaewele PHP synchronous i nā asynchronous me hoʻokahi laina code."
  • ʻO Async a hiki i kēia manawa kahi hoʻonui hoʻohiki no ka hana asynchronous ma PHP. No ke aha a hiki i kēia manawa? ʻO ka mea pōʻino, no kahi kumu ʻike ʻole iaʻu, ua kāpae ka mea kākau i ka waihona a ʻaʻole maopopo ka hopena o ka papahana. Pono wau e hoʻohana hoʻokahi mai nā lāʻau. E like me Swoole, hiki i kēia hoʻonui iā ʻoe ke hoʻohuli maʻalahi i kou pants me kahi kīwī o ka pulima e hiki ai i ka asynchrony ma o ka hoʻololi ʻana i ka hoʻokō maʻamau o nā kahawai TCP a me TLS me kā lākou mau mana asynchronous. Hana ʻia kēia ma o ke koho "async.tcp = 1".
  • Kūlike ― kahi hoʻonui hou mai ka Joe Watkins kaulana, ka mea kākau o nā hale waihona puke e like me phpdbg, apcu, pthreads, pcov, uopz. Hāʻawi ka hoʻonui i kahi API no ka multithreading ma PHP a ua hoʻonoho ʻia ma kahi pani no nā pthreads. ʻO kahi palena koʻikoʻi o ka waihona ʻo ia wale nō ka hana me ka mana ZTS (Zend Thread Safe) o PHP.

Pehea mākou e hoʻāʻo ai?

E hoʻomaka kākou i kahi hiʻohiʻona Tarantool me ka hoʻopaʻa inoa ʻana i mua (wal_mode = ʻaʻohe) a me ka hoʻonui ʻana i ka hoʻopaʻa pūnaewele (heluhelu mua = 1 * 1024 * 1024). ʻO ka koho mua e hoʻopau i ka hana me ka disk, ʻo ka lua e hiki ke heluhelu i nā noi hou aʻe mai ka buffer ʻōnaehana hana a laila e hōʻemi i ka helu o nā kelepona ʻōnaehana.

No nā hōʻailona e hana ana me ka ʻikepili (hoʻokomo, holoi ʻia, heluhelu, a me nā mea ʻē aʻe), ma mua o ka hoʻomaka ʻana i ka benchmark, e hana hou ʻia kahi memtx space, kahi i hana ʻia ai nā helu helu helu mua e ka mea hana o nā helu helu helu kauoha. (sequence).
Penei ke ano o ka space 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}})

Inā pono, ma mua o ka holo ʻana i ka benchmark, hoʻopiha ʻia ka wahi me 10,000 tuples o ke ʻano.

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

Loaʻa ʻia nā Tuples me ka hoʻohana ʻana i kahi waiwai kī maʻamau.

ʻO ka benchmark ponoʻī he noi hoʻokahi i ka server, i hoʻokō ʻia i nā manawa 10,000 (revolutions), a ʻo ia hoʻi, e hoʻokō ʻia i nā iterations. Hoʻopau hou ʻia nā hoʻololi a hiki i nā manawa āpau ma waena o 5 iterations i loko o kahi hewa ʻae ʻia o 3%*. Ma hope o kēia, lawe ʻia ka hopena maʻamau. Aia kahi hoʻomaha 1 kekona ma waena o nā hoʻomaʻamaʻa ʻana e pale ai i ke kaʻina hana mai ka throttling. Ua pio ka ʻohi ʻōpala o Lua ma mua o kēlā me kēia hoʻomaka ʻana a koi ʻia e hoʻomaka ma hope o ka pau ʻana. Hoʻomaka wale ʻia ke kaʻina hana PHP me nā mea hoʻonui e pono ai no ka benchmark, me ka hoʻohana ʻana i ka buffering output a ua pio ka mea ʻohi ʻōpala.

* Hiki ke hoʻololi ʻia ka helu o nā kipi, iterations a me ka paepae hewa i nā hoʻonohonoho benchmark.

Kaiapuni hoao

Ua hana ʻia nā hopena i paʻi ʻia ma lalo nei ma kahi MacBookPro (2015), ʻōnaehana hana - Fedora 30 (kernel version 5.3.8-200.fc30.x86_64). Ua hoʻokuʻu ʻia ʻo Tarantool ma docker me ka ʻāpana "--network host".

Nā mana o ka pūʻolo:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, kūkulu a872fc2f86
PHP: 7.3.11 (cli) (kūkulu ʻia: Oct 22 2019 08:11:04)
tarantool/mea kūʻai aku: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch no 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swooole: 4.4.12
ext-parallel: 1.1.3

* ʻO ka mea pōʻino, ʻaʻole hana ka mea hoʻohui mana me ka mana PHP> 7.2. No ka hōʻuluʻulu a holo i ka hoʻonui ma PHP 7.3, pono wau e hoʻohana kāʻei.

Nā hualoaʻa

ʻO ke ʻano like ʻole

Hoʻohana ka protocol Tarantool i kahi ʻano binary MessagePack e hoʻokaʻawale i nā memo. I loko o ka mea hoʻohui PECL, hūnā ʻia ka serialization i ka hohonu o ka waihona a pili i ke kaʻina hoʻopili mai ka code userland. ʻaʻole hiki. ʻO kahi mea hoʻohui PHP maʻemaʻe, ma kahi ʻē aʻe, hāʻawi i ka hiki ke hoʻopilikino i ke kaʻina hana hoʻopili ma ka hoʻonui ʻana i ka encoder maʻamau a i ʻole ma ka hoʻohana ʻana i kāu hoʻokō ponoʻī. Loaʻa nā encoder ʻelua ma waho o ka pahu, hoʻokumu ʻia kekahi msgpack/msgpack-php (ka hoʻonui ʻia ʻo MessagePack PECL), aia kekahi rybakit/msgpack (ma ka PHP maʻemaʻe).

Ma mua o ka hoʻohālikelike ʻana i nā mea hoʻohui, e ana mākou i ka hana o nā encoders MessagePack no ka mea hoʻohui PHP a ma nā hoʻāʻo hou e hoʻohana mākou i ka mea e hōʻike ana i ka hopena maikaʻi loa:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
ʻOiai ʻoi aku ka haʻahaʻa o ka PHP version (Pure) i ka PECL extension i ka wikiwiki, ma nā papahana maoli e paipai mau wau e hoʻohana. rybakit/msgpack, no ka mea, ma ka hoʻonui MessagePack oihana, ua hoʻokō hapa wale ʻia ka kikoʻī format (no ka laʻana, ʻaʻohe kākoʻo no nā ʻano ʻikepili maʻamau, me ka ʻole e hiki ʻole iā ʻoe ke hoʻohana i ka Decimal - kahi ʻano ʻikepili hou i hoʻokomo ʻia ma Tarantool 2.3) a he helu o na mea e ae nā pilikia (me nā pilikia pili me PHP 7.4). ʻAe, ma ka laulā, ua haʻalele ʻia ka papahana.

No laila, e ana kākou i ka hana o nā mea hoʻohui ma ke ʻano synchronous:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
E like me ka ʻike ʻia mai ka pakuhi, hōʻike ka mea hoʻohui PECL (Tarantool) i ka hana ʻoi aku ka maikaʻi ma mua o ka mea hoʻohui PHP (Client). Akā ʻaʻole kēia he mea kupanaha, no ka mea, ʻo ka mea hope, me ka hoʻokō ʻana i ka ʻōlelo lohi, ʻoi aku ka nui o ka hana: hana ʻia kahi mea hou me kēlā me kēia kelepona. noi и pane (i ka hihia o Select - also Nā kulekele, a i ka hihia o Hoʻohou/Upsert ― ana), nā hui kaʻawale Hoʻohui, nā mea hoʻopuka и Handler hoʻohui pū lākou i luna. ʻIke loa, hiki mai ka maʻalahi ma ke kumukūʻai. Eia nō naʻe, ma ka laulā, hōʻike ka mea unuhi PHP i ka hana maikaʻi, ʻoiai he ʻokoʻa, ʻaʻohe mea nui a, ʻoi aku paha ka liʻiliʻi i ka wā e hoʻohana ai i ka preloading ma PHP 7.4, ʻaʻole e haʻi iā JIT ma PHP 8.

E neʻe kāua. Hoʻohui ʻo Tarantool 2.0 i ke kākoʻo no SQL. E ho'āʻo kākou e hana i nā hana koho, Hoʻokomo, Hoʻohou a Holoi me ka hoʻohana ʻana i ka protocol SQL a hoʻohālikelike i nā hopena me nā mea like noSQL (binary):

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
ʻAʻole maikaʻi loa nā hopena SQL (e hoʻomanaʻo wau iā ʻoe ke hoʻāʻo nei mākou i ke ʻano synchronous). Eia naʻe, ʻaʻole wau e huhū e pili ana i kēia ma mua o ka manawa; Ke hoʻomau nei ke kākoʻo SQL i ka hoʻomohala ʻana (i kēia manawa, no ka laʻana, ua hoʻohui ʻia ke kākoʻo. nā ʻōlelo i hoʻomākaukau ʻia) a, e hoʻoholo ana ma ka papa inoa helu, e loaʻa ana ka ʻenekini SQL i kekahi mau optimizations i ka wā e hiki mai ana.

ʻAnncnc

ʻĀ, e ʻike kākou pehea e hiki ai i ka extension Async ke kōkua iā mākou e hoʻomaikaʻi i nā hopena ma luna. No ke kākau ʻana i nā polokalamu asynchronous, hāʻawi ka hoʻonui i kahi API e pili ana i nā coroutines, a mākou e hoʻohana ai. Ua ʻike mākou i ka helu ʻoi loa o nā coroutines no ko mākou kaiapuni ʻo 25:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
"Hoʻolaha" 10,000 mau hana ma 25 coroutine a ʻike i ka mea e hana nei:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
Ua hoʻonui ʻia ka helu o nā hana i kēlā me kēia kekona ma mua o 3 mau manawa no tarantool-php/client!

ʻO ka mea kaumaha, ʻaʻole i hoʻomaka ka mea hoʻohui PECL me ext-async.

Pehea e pili ana iā SQL?

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
E like me kāu e ʻike ai, ma ke ʻano asynchronous ka ʻokoʻa ma waena o ka protocol binary a me SQL i loko o ka palena o ka hewa.

Swoole

ʻIke hou mākou i ka helu kūpono o nā coroutine, i kēia manawa no Swoole:
Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
E kū kāua ma 25. E hana hou i ka hoʻopunipuni like me ka hoʻonui Async - e puʻunaue i 10,000 mau hana ma waena o 25 coroutines. Eia hou, e hoʻohui mākou i kahi hoʻokolohua hou a mākou e puʻunaue ai i nā hana a pau i 2 mau kaʻina hana (ʻo ia hoʻi, e hana ana kēlā me kēia kaʻina hana i nā hana 5,000 ma 25 coroutines). E hana ʻia nā kaʻina hana me ka hoʻohana ʻana Kaʻina Hana.

Nā hopena:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
Hōʻike ʻo Swole i kahi hopena haʻahaʻa haʻahaʻa i hoʻohālikelike ʻia me Async i ka wā e holo ai i hoʻokahi kaʻina hana, akā me nā kaʻina 2 ke loli nui ke kiʻi (ʻaʻole i koho ʻia ka helu 2 ma ka manawa; ma kaʻu mīkini, he 2 mau kaʻina i hōʻike i ka hopena maikaʻi loa).

Ma ke ala, he API no ka hoʻonui ʻia ʻana o Async no ka hana ʻana me nā kaʻina hana, akā ma laila ʻaʻole wau i ʻike i kahi ʻokoʻa mai ka holo ʻana i nā benchmarks i hoʻokahi a ʻoi aku paha nā kaʻina hana (hiki paha iaʻu ke hana hewa ma kahi).

SQL vs binary protocol:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
E like me Async, hoʻopau ʻia ka ʻokoʻa ma waena o nā hana binary a me SQL ma ke ʻano asynchronous.

Kūlike

No ka mea, ʻaʻole pili ka hoʻonui ʻia ʻana o Parallel i nā coroutines, akā e pili ana i nā kaula, e ana kākou i ka helu maikaʻi loa o nā kaula like ʻole:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
Ua like ia me 16 ma kaʻu mīkini. E holo kāua i nā hōʻailona hoʻohui ma 16 mau lola like:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
E like me kāu e ʻike ai, ʻoi aku ka maikaʻi o ka hopena ma mua o nā hoʻonui asynchronous (ʻaʻole helu ʻo Swoole e holo ana ma nā kaʻina 2). E hoʻomanaʻo, no ka mea hoʻohui PECL, ʻaʻohe kaʻina hana hou a me Upsert. Ma muli o ka hemahema o kēia mau hana me ka hewa - ʻaʻole au i ʻike inā he hewa ia o ext-parallel, ext-tarantool, a i ʻole nā ​​mea ʻelua.

I kēia manawa e hoʻohālikelike i ka hana SQL:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel
E ʻike i ka like me ka pakuhi no nā mea hoʻohui e holo like ana?

Hui pu

A ʻo ka hope, e hōʻuluʻulu mākou i nā hopena āpau i hoʻokahi pakuhi e ʻike i ke kiʻi holoʻokoʻa no nā hoʻonui i hoʻāʻo ʻia. E hoʻohui i hoʻokahi hoʻāʻo hou i ka pakuhi, ʻaʻole mākou i hana i kēia manawa - e holo kāua Async coroutines i ka like me ka hoʻohana ʻana iā Parallel*. ʻO ka manaʻo o ka hoʻohui ʻana i nā hoʻonui i luna ua kūkākūkā ʻia nā mea kākau, akā ʻaʻohe manaʻo i loaʻa, pono ʻoe e hana iā ʻoe iho.

* ʻAʻole hiki ke hoʻomaka i nā coroutine Swoole me Parallel; me he mea lā ʻaʻole kūpono kēia mau hoʻonui.

No laila, nā hopena hope loa:

Hoʻonui i nā mea hoʻohui PHP no Tarantool me ka hoʻohana ʻana iā Async, Swoole a me Parallel

Ma kahi o ka hopena

I koʻu manaʻo, ua kūpono nā hopena, a no kekahi kumu maopopo iaʻu ʻaʻole kēia ka palena! Inā pono ʻoe e hoʻoholo i kēia ma kahi papahana maoli no ʻoe wale nō, e ʻōlelo wale wau noʻu he hoʻokolohua hoihoi e hiki ai iā ʻoe ke loiloi i ka nui o kāu hiki ke "koki" mai kahi konohiki TCP synchronous me ka hoʻoikaika liʻiliʻi. Inā loaʻa iā ʻoe nā manaʻo no ka hoʻomaikaʻi ʻana i nā benchmarks, e hauʻoli wau e noʻonoʻo i kāu noi huki. Hoʻopuka ʻia nā code āpau me nā ʻōlelo kuhikuhi a me nā hopena i kahi kaʻawale hale waihona.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka