புரோஹோஸ்டர் > Блог > நிர்வாகம் > Async, Swoole மற்றும் Parallel ஐப் பயன்படுத்தி Tarantool க்கான PHP இணைப்பிகளை துரிதப்படுத்துகிறது
Async, Swoole மற்றும் Parallel ஐப் பயன்படுத்தி Tarantool க்கான PHP இணைப்பிகளை துரிதப்படுத்துகிறது
PHP சுற்றுச்சூழல் அமைப்பில் தற்போது டரான்டூல் சேவையகத்துடன் பணிபுரிய இரண்டு இணைப்பிகள் உள்ளன - இது அதிகாரப்பூர்வ PECL நீட்டிப்பு. tarantool/tarantool-php, C இல் எழுதப்பட்ட, மற்றும் tarantool-php/client, PHP இல் எழுதப்பட்டது. பிந்தையவற்றின் ஆசிரியர் நான்.
இந்த கட்டுரையில், இரண்டு நூலகங்களின் செயல்திறன் சோதனையின் முடிவுகளைப் பகிர்ந்து கொள்ள விரும்புகிறேன், மேலும் குறியீட்டில் குறைந்தபட்ச மாற்றங்களுடன், நீங்கள் 3-5 செயல்திறன் அதிகரிப்பை எவ்வாறு அடைய முடியும் என்பதைக் காட்ட விரும்புகிறேன் (செயற்கை சோதனைகளில்!).
எதைச் சோதிப்போம்?
மேலே குறிப்பிட்டுள்ளவற்றை நாங்கள் சோதிப்போம் ஒத்திசைவான இணைப்பிகள் ஒத்திசைவற்ற முறையில், இணையாக, மற்றும் ஒத்தியங்கா-இணையாக இயங்குகின்றன. 🙂 இணைப்பாளர்களின் குறியீட்டை நாங்கள் தொட விரும்பவில்லை. நீங்கள் விரும்புவதை அடைய தற்போது பல நீட்டிப்புகள் உள்ளன:
ஸ்வூல் PHPக்கான உயர் செயல்திறன் கொண்ட ஒத்திசைவற்ற கட்டமைப்பு. அலிபாபா மற்றும் பைடு போன்ற இணைய ஜாம்பவான்களால் பயன்படுத்தப்படுகிறது. பதிப்பு 4.1.0 முதல் ஒரு மாய முறை தோன்றியது SwooleRuntime::enableCoroutine(), இது "ஒத்திசைவான PHP நெட்வொர்க் லைப்ரரிகளை ஒரு வரி குறியீட்டுடன் ஒத்திசைவற்றதாக மாற்ற" உங்களை அனுமதிக்கிறது.
Async சமீப காலம் வரை PHP இல் ஒத்திசைவற்ற வேலைக்கான மிகவும் நம்பிக்கைக்குரிய நீட்டிப்பாக இருந்தது. ஏன் சமீப காலம் வரை? துரதிர்ஷ்டவசமாக, எனக்குத் தெரியாத காரணத்திற்காக, ஆசிரியர் களஞ்சியத்தை நீக்கிவிட்டார் மற்றும் திட்டத்தின் எதிர்கால விதி தெளிவாக இல்லை. நான் அதைப் பயன்படுத்த வேண்டும் ஒரு முட்கரண்டிகளில் இருந்து. ஸ்வூலைப் போலவே, இந்த நீட்டிப்பு TCP மற்றும் TLS ஸ்ட்ரீம்களின் நிலையான செயலாக்கத்தை அவற்றின் ஒத்திசைவற்ற பதிப்புகளுடன் மாற்றியமைப்பதன் மூலம் ஒத்திசைவை இயக்க, மணிக்கட்டில் ஒரு ஃபிளிக் மூலம் உங்கள் பேண்ட்டை எளிதாக இயக்க அனுமதிக்கிறது. இது விருப்பத்தின் மூலம் செய்யப்படுகிறது "async.tcp = 1".
இணை phpdbg, apcu, pthreads, pcov, uopz போன்ற நூலகங்களின் ஆசிரியர், நன்கு அறியப்பட்ட ஜோ வாட்கின்ஸ் என்பவரின் புதிய விரிவாக்கம். நீட்டிப்பு PHP இல் மல்டித்ரெடிங்கிற்கான API ஐ வழங்குகிறது மற்றும் pthreads க்கு மாற்றாக நிலைநிறுத்தப்படுகிறது. நூலகத்தின் குறிப்பிடத்தக்க வரம்பு என்னவென்றால், இது PHP இன் ZTS (Zend Thread Safe) பதிப்பில் மட்டுமே இயங்குகிறது.
நாம் எப்படி சோதிப்போம்?
ரைட்-அஹெட் லாக்கிங் முடக்கப்பட்ட ஒரு டரான்டூல் நிகழ்வைத் தொடங்குவோம் (wal_mode = இல்லை) மற்றும் அதிகரித்த பிணைய இடையக (readahead = 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>"}
சீரற்ற விசை மதிப்பைப் பயன்படுத்தி Tuples அணுகப்படுகிறது.
பெஞ்ச்மார்க் என்பது சேவையகத்திற்கான ஒரு கோரிக்கையாகும், இது 10,000 முறை (புரட்சிகள்) செயல்படுத்தப்படுகிறது, இது மீண்டும் மீண்டும் செயல்படுத்தப்படுகிறது. 5 மறு செய்கைகளுக்கு இடையிலான எல்லா நேர விலகல்களும் 3%* என்ற ஏற்றுக்கொள்ளக்கூடிய பிழைக்குள் இருக்கும் வரை மறு செய்கைகள் மீண்டும் மீண்டும் செய்யப்படும். இதற்குப் பிறகு, சராசரி முடிவு எடுக்கப்படுகிறது. செயலி த்ரோட்டில் செய்வதைத் தடுக்க மறு செய்கைகளுக்கு இடையில் 1 வினாடி இடைநிறுத்தம் உள்ளது. லுவாவின் குப்பை சேகரிப்பான் ஒவ்வொரு மறு செய்கைக்கு முன்பும் முடக்கப்பட்டு, அது முடிந்த பிறகு தொடங்க வேண்டிய கட்டாயத்தில் உள்ளது. PHP செயல்முறை அளவுகோலுக்குத் தேவையான நீட்டிப்புகளுடன் மட்டுமே தொடங்கப்படுகிறது, வெளியீட்டு இடையக இயக்கம் மற்றும் குப்பை சேகரிப்பான் முடக்கப்பட்டுள்ளது.
* பெஞ்ச்மார்க் அமைப்புகளில் புரட்சிகளின் எண்ணிக்கை, மறு செய்கைகள் மற்றும் பிழை வரம்பு ஆகியவற்றை மாற்றலாம்.
சோதனை சூழல்
கீழே வெளியிடப்பட்ட முடிவுகள் MacBookPro (2015), இயக்க முறைமை - Fedora 30 (கர்னல் பதிப்பு 5.3.8-200.fc30.x86_64) இல் செய்யப்பட்டன. டேரன்டூல் அளவுருவுடன் டோக்கரில் தொடங்கப்பட்டது "--network host".
* துரதிர்ஷ்டவசமாக, அதிகாரப்பூர்வ இணைப்பான் PHP பதிப்பு > 7.2 உடன் வேலை செய்யவில்லை. PHP 7.3 இல் நீட்டிப்பை தொகுத்து இயக்க, நான் பயன்படுத்த வேண்டியிருந்தது இணைப்பு.
Результаты
ஒத்திசைவு முறை
டரான்டூல் நெறிமுறை பைனரி வடிவமைப்பைப் பயன்படுத்துகிறது மெசேஜ் பேக் செய்திகளை வரிசைப்படுத்த. PECL இணைப்பியில், வரிசையாக்கம் நூலகத்தின் ஆழத்தில் மறைந்துள்ளது மற்றும் பயனர் நிலக் குறியீட்டிலிருந்து குறியாக்க செயல்முறையை பாதிக்கிறது. சாத்தியமாகத் தெரியவில்லை. ஒரு தூய PHP இணைப்பான், மாறாக, நிலையான குறியாக்கியை நீட்டிப்பதன் மூலம் அல்லது உங்கள் சொந்த செயலாக்கத்தைப் பயன்படுத்தி குறியாக்க செயல்முறையைத் தனிப்பயனாக்கும் திறனை வழங்குகிறது. பெட்டிக்கு வெளியே இரண்டு குறியாக்கிகள் உள்ளன, ஒன்றை அடிப்படையாகக் கொண்டது msgpack/msgpack-php (அதிகாரப்பூர்வ MessagePack PECL நீட்டிப்பு), மற்றொன்று இயக்கத்தில் உள்ளது rybakit/msgpack (தூய PHP இல்).
இணைப்பிகளை ஒப்பிடும் முன், PHP இணைப்பிற்கான MessagePack குறியாக்கிகளின் செயல்திறனை அளவிடுவோம், மேலும் சோதனைகளில் சிறந்த முடிவைக் காட்டும் ஒன்றைப் பயன்படுத்துவோம்:
PHP பதிப்பு (தூயமானது) வேகத்தில் PECL நீட்டிப்பை விட தாழ்ந்ததாக இருந்தாலும், உண்மையான திட்டங்களில் நான் அதைப் பயன்படுத்த பரிந்துரைக்கிறேன். rybakit/msgpack, ஏனெனில் அதிகாரப்பூர்வ MessagePack நீட்டிப்பில் வடிவமைப்பு விவரக்குறிப்பு ஓரளவு மட்டுமே செயல்படுத்தப்படுகிறது (உதாரணமாக, தனிப்பயன் தரவு வகைகளுக்கு எந்த ஆதரவும் இல்லை, இது இல்லாமல் நீங்கள் டெசிமலைப் பயன்படுத்த முடியாது - Tarantool 2.3 இல் அறிமுகப்படுத்தப்பட்ட புதிய தரவு வகை) மற்றவர்களின் எண்ணிக்கை பிரச்சனைகள் (PHP 7.4 உடன் பொருந்தக்கூடிய சிக்கல்கள் உட்பட). பொதுவாக, திட்டம் கைவிடப்பட்டதாகத் தெரிகிறது.
எனவே, ஒத்திசைவான முறையில் இணைப்பிகளின் செயல்திறனை அளவிடுவோம்:
வரைபடத்தில் இருந்து பார்க்க முடியும், PHP இணைப்பான் (கிளையண்ட்) உடன் ஒப்பிடும்போது PECL இணைப்பான் (Tarantool) சிறந்த செயல்திறனைக் காட்டுகிறது. ஆனால் இது ஆச்சரியமல்ல, பிந்தையது, மெதுவான மொழியில் செயல்படுத்தப்படுவதைத் தவிர, உண்மையில் அதிக வேலை செய்கிறது: ஒவ்வொரு அழைப்பிலும் ஒரு புதிய பொருள் உருவாக்கப்படுகிறது. வேண்டுகோள் и பதில் (தேர்வு வழக்கில் - மேலும் தேர்வளவு, மற்றும் அப்டேட்/அப்ஸர்ட் விஷயத்தில் - ஆபரேஷன்ஸ்), தனி நிறுவனங்கள் இணைப்பு, பாக்கர் и ஹேண்ட்லரைச் அவை மேல்நிலையையும் சேர்க்கின்றன. வெளிப்படையாக, நெகிழ்வுத்தன்மை ஒரு விலையில் வருகிறது. இருப்பினும், பொதுவாக, PHP மொழிபெயர்ப்பான் நல்ல செயல்திறனைக் காட்டுகிறது, வேறுபாடு இருந்தாலும், அது முக்கியமற்றது மற்றும் PHP 7.4 இல் முன் ஏற்றுதலைப் பயன்படுத்தும் போது இன்னும் குறைவாக இருக்கும், PHP 8 இல் JIT ஐக் குறிப்பிடவில்லை.
தொடரலாம். Tarantool 2.0 SQLக்கான ஆதரவைச் சேர்த்தது. SQL நெறிமுறையைப் பயன்படுத்தி, தேர்ந்தெடுக்கவும், செருகவும், புதுப்பிக்கவும் மற்றும் நீக்கவும் செயல்பாடுகளைச் செய்ய முயற்சிப்போம் மற்றும் முடிவுகளை noSQL (பைனரி) சமமானவற்றுடன் ஒப்பிடலாம்:
SQL முடிவுகள் மிகவும் சுவாரஸ்யமாக இல்லை (நாங்கள் இன்னும் ஒத்திசைவான பயன்முறையைச் சோதித்து வருகிறோம் என்பதை உங்களுக்கு நினைவூட்டுகிறேன்). இருப்பினும், இதைப் பற்றி நான் முன்கூட்டியே வருத்தப்பட மாட்டேன்; SQL ஆதரவு இன்னும் செயலில் வளர்ச்சியில் உள்ளது (ஒப்பீட்டளவில் சமீபத்தில், எடுத்துக்காட்டாக, ஆதரவு சேர்க்கப்பட்டது அறிக்கைகள் தயார்) மற்றும், பட்டியலின் மூலம் ஆராயலாம் பிரச்சினைகள், SQL இன்ஜின் எதிர்காலத்தில் பல மேம்படுத்தல்களுக்கு உட்படும்.
அசின்க்
சரி, மேலே உள்ள முடிவுகளை மேம்படுத்த Async நீட்டிப்பு எவ்வாறு உதவும் என்பதை இப்போது பார்ப்போம். ஒத்திசைவற்ற நிரல்களை எழுத, நீட்டிப்பு ஒரு API ஐ coroutines அடிப்படையில் வழங்குகிறது, அதை நாங்கள் பயன்படுத்துவோம். நமது சுற்றுச்சூழலுக்கான கரோட்டின்களின் உகந்த எண்ணிக்கை 25 என்பதை அனுபவபூர்வமாகக் கண்டறிகிறோம்:
10,000 கரோட்டின்களில் 25 செயல்பாடுகளை "பரப்பி" என்ன நடக்கிறது என்பதைப் பார்க்கவும்:
வினாடிக்கு செயல்பாடுகளின் எண்ணிக்கை 3 மடங்குக்கு மேல் அதிகரித்துள்ளது tarantool-php/client!
துரதிர்ஷ்டவசமாக, PECL இணைப்பான் ext-async உடன் தொடங்கவில்லை.
SQL பற்றி என்ன?
நீங்கள் பார்க்க முடியும் என, ஒத்திசைவற்ற முறையில் பைனரி நெறிமுறை மற்றும் SQL இடையே உள்ள வேறுபாடு பிழையின் விளிம்பிற்குள் ஆனது.
ஸ்வூல்
ஸ்வூலுக்கு இந்த முறை கரோட்டின்களின் உகந்த எண்ணிக்கையை மீண்டும் கண்டுபிடித்தோம்:
25 இல் நிறுத்துவோம். Async நீட்டிப்பைப் போலவே அதே தந்திரத்தை மீண்டும் செய்வோம் - 10,000 செயல்பாடுகளை 25 கரோட்டின்களுக்கு இடையில் விநியோகிக்கவும். கூடுதலாக, நாங்கள் மற்றொரு சோதனையைச் சேர்ப்போம், அதில் அனைத்து வேலைகளையும் 2 இரண்டு செயல்முறைகளாகப் பிரிப்போம் (அதாவது, ஒவ்வொரு செயல்முறையும் 5,000 கரோட்டின்களில் 25 செயல்பாடுகளைச் செய்யும்). பயன்படுத்தி செயல்முறைகள் உருவாக்கப்படும் SwooleProcess.
முடிவு:
ஒரு செயல்பாட்டில் இயங்கும் போது Async உடன் ஒப்பிடும்போது ஸ்வோல் சற்று குறைவான முடிவைக் காட்டுகிறது, ஆனால் 2 செயல்முறைகளில் படம் வியத்தகு முறையில் மாறுகிறது (எண் 2 தற்செயலாக தேர்ந்தெடுக்கப்படவில்லை; எனது கணினியில், 2 செயல்முறைகள் சிறந்த முடிவைக் காட்டியது).
மூலம், Async நீட்டிப்பு செயல்முறைகளுடன் பணிபுரியும் API ஐக் கொண்டுள்ளது, ஆனால் ஒன்று அல்லது அதற்கு மேற்பட்ட செயல்முறைகளில் வரையறைகளை இயக்குவதில் இருந்து எந்த வித்தியாசத்தையும் நான் கவனிக்கவில்லை (நான் எங்காவது குழப்பமடைந்திருக்கலாம்).
SQL vs பைனரி நெறிமுறை:
Async ஐப் போலவே, பைனரி மற்றும் SQL செயல்பாடுகளுக்கு இடையிலான வேறுபாடு ஒத்திசைவற்ற முறையில் நீக்கப்படும்.
இணை
இணை நீட்டிப்பு என்பது கரோட்டின்களைப் பற்றியது அல்ல, ஆனால் நூல்களைப் பற்றியது என்பதால், இணையான நூல்களின் உகந்த எண்ணிக்கையை அளவிடுவோம்:
இது எனது கணினியில் 16க்கு சமம். 16 இணையான இழைகளில் இணைப்பான் வரையறைகளை இயக்குவோம்:
நீங்கள் பார்க்கிறபடி, ஒத்திசைவற்ற நீட்டிப்புகளைக் காட்டிலும் முடிவு சிறப்பாக உள்ளது (2 செயல்முறைகளில் இயங்கும் ஸ்வூலைக் கணக்கிடவில்லை). PECL இணைப்பிக்கு, புதுப்பித்தல் மற்றும் அப்செர்ட் செயல்பாடுகள் காலியாக உள்ளன என்பதை நினைவில் கொள்ளவும். இந்தச் செயல்பாடுகள் பிழையால் தோல்வியடைந்ததே இதற்குக் காரணம் - இது ext-parallel, ext-tarantool அல்லது இரண்டின் தவறா என்று எனக்குத் தெரியவில்லை.
இப்போது SQL செயல்திறனை ஒப்பிடலாம்:
ஒத்திசைவாக இயங்கும் இணைப்பிகளுக்கான வரைபடத்துடன் உள்ள ஒற்றுமையை கவனிக்கிறீர்களா?
ஒன்றாக
இறுதியாக, சோதனை செய்யப்பட்ட நீட்டிப்புகளுக்கான ஒட்டுமொத்த படத்தைப் பார்க்க ஒரு வரைபடத்தில் அனைத்து முடிவுகளையும் சுருக்கமாகக் கூறுவோம். விளக்கப்படத்தில் ஒரே ஒரு புதிய சோதனையைச் சேர்ப்போம், அதை நாம் இதுவரை செய்யவில்லை - Parallel* ஐப் பயன்படுத்தி Async coroutines ஐ இணையாக இயக்குவோம். மேலே உள்ள நீட்டிப்புகளை ஒருங்கிணைக்கும் யோசனை ஏற்கனவே உள்ளது விவாதிக்கப்பட்டது ஆசிரியர்கள், ஆனால் ஒருமித்த கருத்து எட்டப்படவில்லை, அதை நீங்களே செய்ய வேண்டும்.
* ஸ்வூல் கரோட்டின்களை பேரலலுடன் தொடங்குவது சாத்தியமில்லை; இந்த நீட்டிப்புகள் பொருந்தாததாகத் தெரிகிறது.
எனவே, இறுதி முடிவுகள்:
அதற்கு பதிலாக, ஒரு முடிவுக்கும்
என் கருத்துப்படி, முடிவுகள் மிகவும் தகுதியானவை என்று மாறியது, சில காரணங்களால் இது வரம்பு அல்ல என்று நான் நம்புகிறேன்! உங்களுக்காக மட்டுமே ஒரு உண்மையான திட்டத்தில் இதை நீங்கள் தீர்மானிக்க வேண்டுமா, எனக்கு இது ஒரு சுவாரஸ்யமான சோதனை என்று நான் கூறுவேன், இது ஒரு ஒத்திசைவான TCP இணைப்பியிலிருந்து குறைந்த முயற்சியுடன் எவ்வளவு "கசக்க" முடியும் என்பதை மதிப்பீடு செய்ய உங்களை அனுமதிக்கிறது. அளவுகோல்களை மேம்படுத்துவதற்கான யோசனைகள் உங்களிடம் இருந்தால், உங்கள் கோரிக்கையை பரிசீலிப்பதில் மகிழ்ச்சி அடைவேன். வெளியீட்டு வழிமுறைகள் மற்றும் முடிவுகளுடன் அனைத்து குறியீடுகளும் தனித்தனியாக வெளியிடப்படுகின்றன களஞ்சியங்கள்.