Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ

በ PHP ሥነ-ምህዳር ውስጥ በአሁኑ ጊዜ ከ Tarantool አገልጋይ ጋር ለመስራት ሁለት ማገናኛዎች አሉ - ይህ ኦፊሴላዊው የ PECL ቅጥያ ነው። tarantool/tarantool-phpበ C የተፃፈ እና tarantool-php/ደንበኛ፣ በPHP የተጻፈ። እኔ የኋለኛው ደራሲ ነኝ።

በዚህ ጽሑፍ ውስጥ የሁለቱም ቤተ-መጻሕፍት የአፈፃፀም ሙከራ ውጤቶችን ማካፈል እና በኮዱ ላይ አነስተኛ ለውጦች ሲደረጉ የ3-5 የአፈፃፀም ጭማሪ እንዴት ማግኘት እንደሚችሉ ማሳየት እፈልጋለሁ (በሰው ሠራሽ ሙከራዎች ላይ!).

ምን እንሞክራለን?

ከላይ የተጠቀሱትን እንፈትሻለን የተመሳሰለ ሳይመሳሰል፣ በትይዩ እና በማይመሳሰል-ትይዩ የሚሰሩ ማገናኛዎች። 🙂 በተጨማሪም የማገናኛዎቹን ኮድ እራሳቸው መንካት አንፈልግም። የሚፈልጉትን ለማግኘት በአሁኑ ጊዜ በርካታ ቅጥያዎች አሉ፡-

  • ስዎል - ለPHP ከፍተኛ አፈጻጸም ያልተመሳሰለ ማዕቀፍ። እንደ አሊባባ እና ባይዱ ባሉ የኢንተርኔት ግዙፍ ኩባንያዎች ጥቅም ላይ ይውላል። ከስሪት 4.1.0 ጀምሮ አስማታዊ ዘዴ ታይቷል SwooleRuntime::Coroutine() አንቃ“የተመሳሰለ የPHP አውታረ መረብ ቤተ-መጻሕፍትን ወደ አልተመሳሰለ አንድ የኮድ መሾመር እንዲቀይሩ ያስችልዎታል።
  • Async እስከ ቅርብ ጊዜ ድረስ በPHP ውስጥ ለተመሳሰለ ሼል በጣም ተስፋ ሰጪ ቅጥያ ነበር። ለምን እስከ ቅርብ ጊዜ ድረስ? እንደ አለመታደል ሆኖ እኔ በማላውቀው ምክንያት ደራሲው ማከማቻውን ሰርዘዋል እና የፕሮጀክቱ የወደፊት እጣ ፈንታ ግልፅ አይደለም ። መጠቀም አለብኝ አንድ ከሹካዎች. ልክ እንደ ስዎል፣ ይህ ቅጥያ መደበኛውን የTCP እና TLS ዥረቶችን ባልተመሳሰሉ ስሪቶች በመተካት ተመሳሳይነት ለማንቃት ሱሪዎን በእጅ አንጓ በቀላሉ እንዲያበሩ ያስችልዎታል። ይህ የሚደረገው በምርጫው ነው "async.tcp = 1".
  • ተመሳሳይ - ከታዋቂው ጆ ዋትኪንስ የተገኘ አዲስ ቅጥያ፣ እንደ phpdbg፣ apcu፣ pthreads፣ pcov፣ uopz ያሉ ቤተ-መጻሕፍት ደራሲ። ቅጥያው በPHP ውስጥ ለመልቲ-ክርክር ኤፒአይ ያቀርባል እና ለ phreads ምትክ ተቀምጧል። የቤተ መፃህፍቱ ጉልህ ገደብ የሚሠራው ከ ZTS (Zend Thread Safe) የPHP ስሪት ጋር ብቻ መሆኑ ነው።

እንዴት እንሞክራለን?

የTarantool ምሳሌን እናስጀምር ቀደም ብሎ መፃፍ ተሰናክሏል (wal_mode = ምንም) እና የአውታረ መረብ ቋት መጨመር (readhead = 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 ቱፕል ቅጹ ተሞልቷል.

{id, "tuplĐľ_<id>"}

ቱፕልስ በዘፈቀደ ቁልፍ እሴት በመጠቀም ይደርሳል።

መለኪያው ራሱ 10,000 ጊዜ (አብዮቶች) ለሚፈፀመው የአገልጋዩ ነጠላ ጥያቄ ነው ፣ እሱም በተራው ፣ በድግግሞሽ ይከናወናል። በ5 ድግግሞሾች መካከል ያለው የሁሉም ጊዜ ልዩነት ተቀባይነት ባለው የ3% ስህተት ውስጥ እስኪሆን ድረስ ድግግሞሾቹ ይደጋገማሉ። ከዚህ በኋላ አማካይ ውጤቱ ይወሰዳል. አንጎለ ኮምፒውተር እንዳይበሰብስ ለመከላከል 1 ሰከንድ ባለበት ማቆም በድግግሞሽ መካከል አለ። የሉአ ቆሻሻ ሰብሳቢ ከእያንዳንዱ ድግግሞሽ በፊት ተሰናክሏል እና ከተጠናቀቀ በኋላ ለመጀመር ይገደዳል። የPHP ሂደቱ የሚጀመረው ለማመሳከሪያው አስፈላጊ በሆኑ ማራዘሚያዎች ብቻ ነው፣ ውፅዓት ማቋት በነቃ እና ቆሻሻ ሰብሳቢው ተሰናክሏል።

* የአብዮቶች ብዛት ፣ ድግግሞሾች እና የስህተት ገደቦች በቤንችማርክ ቅንጅቶች ውስጥ ሊቀየሩ ይችላሉ።

የሙከራ አካባቢ

ከዚህ በታች የታተሙት ውጤቶች በ MacBookPro (2015) ፣ ኦፕሬቲንግ ሲስተም - Fedora 30 (የከርነል ስሪት 5.3.8-200.fc30.x86_64) ላይ ተደርገዋል። ታራንቶል በዶከር ተጀመረ ከመለኪያው ጋር"--network host".

የጥቅል ስሪቶች:

Tarantool: 2.3.0-115-g5ba5ed37e
ዶከር፡ 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 (+ patch for 7.3)*
ext-msgpack፡ 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-ትይዩ፡ 1.1.3

* እንደ አለመታደል ሆኖ ኦፊሴላዊው ማገናኛ ከ PHP ስሪት> 7.2 ጋር አይሰራም። ቅጥያውን በ PHP 7.3 ላይ ለማጠናቀር እና ለማስኬድ፣ መጠቀም ነበረብኝ ጠጋኝ.

ውጤቶች

የተመሳሰለ ሁነታ

የ Tarantool ፕሮቶኮል ሁለትዮሽ ቅርጸት ይጠቀማል መልእክት ፓክ መልዕክቶችን ተከታታይ ለማድረግ. በ PECL አያያዥ ውስጥ ተከታታይነት በቤተ-መጽሐፍት ጥልቀት ውስጥ ተደብቋል እና ከተጠቃሚ አገር ኮድ የመቀየሪያ ሂደቱን ይነካል የሚቻል አይመስልም. ንጹህ ፒኤችፒ ማገናኛ በተቃራኒው መደበኛ ኢንኮደርን በማራዘም ወይም የእራስዎን ትግበራ በመጠቀም የመቀየሪያ ሂደቱን የማበጀት ችሎታ ይሰጣል። ከሳጥኑ ውስጥ ሁለት ኢንኮድሮች አሉ, አንደኛው በ ላይ የተመሰረተ ነው msgpack/msgpack-php (ኦፊሴላዊ የመልእክት ፓክ PECL ቅጥያ) ፣ ሌላኛው በርቷል። rybakit/msgpack (በንፁህ ፒኤችፒ)።

ማገናኛዎችን ከማነፃፀር በፊት የመልእክት ፓክ ኢንኮደሮችን አፈጻጸም ለ PHP አያያዥ እንለካለን እና በቀጣይ ሙከራዎች ምርጡን ውጤት የሚያሳየውን እንጠቀማለን።

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
ምንም እንኳን የ PHP ስሪት (ንፁህ) ከ PECL ማራዘሚያ በፍጥነት ያነሰ ቢሆንም ፣ በእውነተኛ ፕሮጀክቶች ውስጥ አሁንም እንዲጠቀሙበት እመክራለሁ rybakit/msgpack, ምክንያቱም በኦፊሴላዊው የ MessagePack ቅጥያ ውስጥ የቅርጸት ዝርዝር መግለጫው በከፊል ብቻ ነው የሚተገበረው (ለምሳሌ, ለ ብጁ የውሂብ አይነቶች ምንም ድጋፍ የለም, ያለሱ አስርዮሽ መጠቀም አይችሉም - በ Tarantool 2.3 ውስጥ የገባው አዲስ የውሂብ አይነት) እና አለው. ሌሎች ቁጥር ችግሮች (ከ PHP 7.4 ጋር የተኳሃኝነት ጉዳዮችን ጨምሮ)። ደህና, በአጠቃላይ, ፕሮጀክቱ የተተወ ይመስላል.

ስለዚህ የማገናኛዎችን አፈጻጸም በተመሳሰለ ሁኔታ እንለካ፡

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
ከግራፉ ላይ እንደሚታየው የ PECL አያያዥ (Tarantool) ከ PHP አያያዥ (ደንበኛ) ጋር ሲወዳደር የተሻለ አፈጻጸም ያሳያል። ግን ይህ አያስገርምም ፣ የኋለኛው ፣ በቀስታ ቋንቋ ከመተግበሩ በተጨማሪ ፣ በእውነቱ ብዙ ስራዎችን ይሰራል-በእያንዳንዱ ጥሪ አዲስ ነገር ተፈጠረ። ጥያቄ и መልስ (በምረጥ ጉዳይ - ደግሞ መስፈርትእና በዝማኔ/ማሳደጊያ ሁኔታ - ክወናዎች), የተለዩ አካላት ግንኙነት, አሻጊ и ተቆጣጣሪ በተጨማሪም በላይ ይጨምራሉ. ተለዋዋጭነት በዋጋ እንደሚመጣ ግልጽ ነው። ሆኖም በአጠቃላይ የPHP ተርጓሚው ጥሩ አፈጻጸም ያሳያል፣ ምንም እንኳን ልዩነት ቢኖርም፣ እዚህ ግባ የሚባል አይደለም እና ምናልባትም በ PHP 7.4 ውስጥ ቀድሞ መጫን ሲጠቀሙ የበለጠ ያነሰ ይሆናል፣ በ PHP 8 ውስጥ JIT ሳይጠቀስ።

እንቀጥል። Tarantool 2.0 ለ SQL ድጋፍ አክሏል። የSQL ፕሮቶኮሉን ተጠቅመን ምረጥ፣ አስገባ፣ አዘምን እና ሰርዝ ስራዎችን ለመስራት እንሞክር እና ውጤቱን ከ noSQL (ሁለትዮሽ) አቻዎች ጋር እናወዳድር።

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
የSQL ውጤቶቹ በጣም አስደናቂ አይደሉም (አሁንም የተመሳሰለ ሁነታን እየሞከርን መሆኑን ላስታውስዎ)። ሆኖም፣ በዚህ ጉዳይ አስቀድሞ አልከፋኝም፤ የ SQL ድጋፍ አሁንም በንቃት ልማት ላይ ነው (በአንፃራዊነት በቅርብ ጊዜ ለምሳሌ ድጋፍ ተጨምሯል። የተዘጋጁ መግለጫዎች) እና በዝርዝሩ በመመዘን ጉዳዮች, የ SQL ሞተር ለወደፊቱ በርካታ ማመቻቸትን ያካሂዳል.

አኒኒክ

ደህና፣ አሁን የAsync ቅጥያ እንዴት ከላይ ያሉትን ውጤቶች ለማሻሻል እንደሚረዳን እንይ። ያልተመሳሰሉ ፕሮግራሞችን ለመጻፍ፣ ቅጥያው በኮሮቲን ላይ የተመሠረተ ኤፒአይ ይሰጣል፣ እሱም የምንጠቀመው። ለአካባቢያችን በጣም ጥሩው የኮርኦቲኖች ብዛት 25 መሆኑን በተጨባጭ ተረድተናል፡-

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
10,000 ክዋኔዎችን በ25 ኮሮጆዎች ላይ “ያሰራጭ” እና ምን እንደተፈጠረ ይመልከቱ፡-

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
በሴኮንድ የክዋኔዎች ብዛት ከ 3 ጊዜ በላይ ጨምሯል ለ tarantool-php/ደንበኛ!

በሚያሳዝን ሁኔታ፣ የPECL ማገናኛ በext-async አልተጀመረም።

ሾለ SQLሾ?

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
እንደሚመለከቱት፣ ባልተመሳሰል ሁነታ በሁለትዮሽ ፕሮቶኮል እና በ SQL መካከል ያለው ልዩነት በስህተት ህዳግ ውስጥ ሆነ።

ስዎል

በዚህ ጊዜ ለ Swoole በጣም ጥሩውን የኮርቲኖች ብዛት እንደገና አግኝተናል፡-
Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
በ 25 ላይ እናቆማለን. ከአሲንክ ማራዘሚያ ጋር ተመሳሳይ ዘዴን እንድገመው - 10,000 ኦፕሬሽኖችን በ 25 ኮሮጆዎች መካከል ያሰራጩ. በተጨማሪም, ሁሉንም ስራዎች በ 2 ሁለት ሂደቶች የምንከፍልበት ሌላ ፈተና እንጨምራለን (ይህም እያንዳንዱ ሂደት በ 5,000 ኮሮጆዎች ውስጥ 25 ስራዎችን ያከናውናል). በመጠቀም ሂደቶች ይፈጠራሉ። Swoole ሂደት.

ውጤቶች

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
Swole በአንድ ሂደት ውስጥ ሲሄድ ከአሲንክ ጋር ሲነጻጸር ትንሽ ዝቅተኛ ውጤት ያሳያል, ነገር ግን በ 2 ሂደቶች ስዕሉ በከፍተኛ ሁኔታ ይቀየራል (ቁጥር 2 በአጋጣሚ አልተመረጠም, በእኔ ማሽን ላይ, ጥሩውን ውጤት ያሳዩ 2 ሂደቶች ናቸው).

በነገራችን ላይ የአሲንክ ኤክስቴንሽን ከሂደቶች ጋር አብሮ ለመስራት ኤፒአይ አለው ፣ ግን እዚያ በአንድ ወይም ከዚያ በላይ ሂደቶች ውስጥ ማመሳከሪያዎችን ከማሄድ ምንም ልዩነት አላስተዋልኩም (አንድ ቦታ አበላሽቼ ሊሆን ይችላል)።

SQL vs ሁለትዮሽ ፕሮቶኮል፡-

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
ልክ እንደ Async፣ በሁለትዮሽ እና በ SQL ኦፕሬሽኖች መካከል ያለው ልዩነት ባልተመሳሰል ሁነታ ይወገዳል።

ተመሳሳይ

ትይዩ ማራዘሚያው ስለ ኮርቲኖች ሳይሆን ስለ ክሮች ስለሆነ ትክክለኛውን የትይዩ ክሮች ብዛት እንለካ።

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
በእኔ ማሽን ላይ ከ 16 ጋር እኩል ነው. የማገናኛ መለኪያዎችን በ16 ትይዩ ክሮች ላይ እናካሂድ፡

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
እንደሚመለከቱት, ውጤቱ ከተመሳሰሉ ቅጥያዎች (ስዎል በ 2 ሂደቶች ላይ እየሮጠ ሳይቆጠር) እንኳን የተሻለ ነው. ለ PECL አያያዥ የዝማኔ እና የማሳደጊያ ስራዎች ባዶ መሆናቸውን ልብ ይበሉ። ይህ የሆነበት ምክንያት እነዚህ ክዋኔዎች በስህተት ስላልተሳካላቸው ነው - የ ext-parallel፣ ext-tarantool ወይም የሁለቱም ስህተት መሆኑን አላውቅም።

አሁን የ SQL አፈጻጸምን እናወዳድር፡-

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ
በተመሳሳይ ጊዜ ለሚሄዱ ማገናኛዎች ከግራፉ ጋር ያለውን ተመሳሳይነት አስተውል?

አንድ ላየ

እና በመጨረሻም, ለሙከራ ማራዘሚያዎች አጠቃላይ ምስልን ለማየት ሁሉንም ውጤቶች በአንድ ግራፍ እናጠቃልል. እስካሁን ያላደረግነውን አንድ አዲስ ሙከራ ወደ ገበታው እንጨምር - Parallel*ን በመጠቀም Async coroutines በትይዩ እናካሂድ። ከላይ ያሉትን ማራዘሚያዎች የማዋሃድ ሀሳብ ቀድሞውኑ ነው የሚል ውይይት ተደርጎበታል። ደራሲዎች ፣ ግን ምንም ስምምነት ላይ አልደረሱም ፣ እርስዎ እራስዎ ማድረግ አለብዎት።

* ስዎል ኮርቲኖችን በParallel ማስጀመር አልተቻለም፤ እነዚህ ቅጥያዎች የማይጣጣሙ ይመስላሉ።

ስለዚህ, የመጨረሻ ውጤቶች:

Async፣ Swoole እና Parallelን በመጠቀም የPHP ማገናኛዎችን ለ Tarantool በማፋጠን ላይ

ከዚህ ይልቅ አንድ መደምደሚያ

በእኔ አስተያየት ውጤቶቹ በጣም ብቁ ሆነው ተገኝተዋል ፣ እና በሆነ ምክንያት ይህ ገደብ እንዳልሆነ እርግጠኛ ነኝ! ይህንን በእውነተኛ ፕሮጀክት ውስጥ ለራስህ ብቻ መወሰን ያስፈልግህ እንደሆነ፣ ለእኔ ብቻ ነው የምለው፣ ከተመሳሰለ TCP አያያዥ በትንሹ ጥረት ምን ያህል “መጭመቅ” እንደምትችል ለመገምገም የሚያስችል አስደሳች ሙከራ ነበር። ቤንችማርኮችን ለማሻሻል ሀሳቦች ካሉዎት፣የእርስዎን የመሳብ ጥያቄ በማገናዘብ ደስተኛ ነኝ። የማስጀመሪያ መመሪያዎች እና ውጤቶች ያሉት ሁሉም ኮድ በተለየ ታትሟል ማከማቻዎች.

ምንጭ: hab.com

አስተያየት ያክሉ