ప్రోహోస్టర్ > బ్లాగ్ > పరిపాలన > Async, Swoole మరియు Parallel ఉపయోగించి Tarantool కోసం PHP కనెక్టర్లను వేగవంతం చేయడం
Async, Swoole మరియు Parallel ఉపయోగించి Tarantool కోసం PHP కనెక్టర్లను వేగవంతం చేయడం
PHP పర్యావరణ వ్యవస్థలో ప్రస్తుతం టరాన్టూల్ సర్వర్తో పనిచేయడానికి రెండు కనెక్టర్లు ఉన్నాయి - ఇది అధికారిక PECL పొడిగింపు tarantool/tarantool-php, C లో వ్రాయబడింది మరియు tarantool-php/క్లయింట్, PHPలో వ్రాయబడింది. నేను తరువాతి రచయితను.
ఈ ఆర్టికల్లో, నేను రెండు లైబ్రరీల పనితీరు పరీక్ష ఫలితాలను భాగస్వామ్యం చేయాలనుకుంటున్నాను మరియు కోడ్లో కనీస మార్పులతో, మీరు 3-5 పనితీరు పెరుగుదలను ఎలా సాధించవచ్చో చూపించాలనుకుంటున్నాను (సింథటిక్ పరీక్షలపై!).
మేము ఏమి పరీక్షిస్తాము?
మేము పైన పేర్కొన్న వాటిని పరీక్షిస్తాము సమకాలిక కనెక్టర్లు అసమకాలికంగా, సమాంతరంగా మరియు అసమకాలికంగా-సమాంతరంగా నడుస్తున్నాయి. 🙂 మేము కూడా కనెక్టర్ల కోడ్ను తాకకూడదనుకుంటున్నాము. మీరు కోరుకున్నది సాధించడానికి ప్రస్తుతం అనేక పొడిగింపులు అందుబాటులో ఉన్నాయి:
ఊలు ― PHP కోసం అధిక-పనితీరు గల అసమకాలిక ఫ్రేమ్వర్క్. అలీబాబా మరియు బైడు వంటి ఇంటర్నెట్ దిగ్గజాలచే ఉపయోగించబడుతుంది. వెర్షన్ 4.1.0 నుండి ఒక మాయా పద్ధతి కనిపించింది స్వూల్ రన్టైమ్:: ఎనేబుల్ కొరోటిన్(), ఇది "ఒక లైన్ కోడ్తో సింక్రోనస్ PHP నెట్వర్క్ లైబ్రరీలను అసమకాలిక వాటికి మార్చడానికి" మిమ్మల్ని అనుమతిస్తుంది.
Async ఇటీవలి వరకు PHPలో అసమకాలిక పని కోసం చాలా ఆశాజనకమైన పొడిగింపు. ఇటీవలి వరకు ఎందుకు? దురదృష్టవశాత్తు, నాకు తెలియని కారణంతో, రచయిత రిపోజిటరీని తొలగించారు మరియు ప్రాజెక్ట్ యొక్క భవిష్యత్తు విధి అస్పష్టంగా ఉంది. నేను దానిని ఉపయోగించాలి ఒక ఫోర్కులు నుండి. స్వూల్ వలె, ఈ పొడిగింపు TCP మరియు TLS స్ట్రీమ్ల యొక్క ప్రామాణిక అమలును వాటి అసమకాలిక సంస్కరణలతో భర్తీ చేయడం ద్వారా అసమకాలికతను ఎనేబుల్ చేయడానికి మణికట్టు యొక్క ఫ్లిక్తో మీ ప్యాంటును సులభంగా ఆన్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఇది ఎంపిక ద్వారా చేయబడుతుంది "async.tcp = 1".
సమాంతర ― phpdbg, apcu, pthreads, pcov, uopz వంటి లైబ్రరీల రచయిత, ప్రసిద్ధ జో వాట్కిన్స్ నుండి చాలా కొత్త పొడిగింపు. పొడిగింపు PHPలో మల్టీథ్రెడింగ్ కోసం APIని అందిస్తుంది మరియు pthreadsకి ప్రత్యామ్నాయంగా ఉంచబడుతుంది. లైబ్రరీ యొక్క ముఖ్యమైన పరిమితి ఏమిటంటే ఇది PHP యొక్క ZTS (జెండ్ థ్రెడ్ సేఫ్) వెర్షన్తో మాత్రమే పని చేస్తుంది.
మేము ఎలా పరీక్షిస్తాము?
రైట్-ఎహెడ్ లాగింగ్ డిసేబుల్తో టరాన్టూల్ ఉదాహరణను ప్రారంభిద్దాం (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 టుపుల్స్ ఫారమ్తో నిండి ఉంటుంది
{id, "tuplе_<id>"}
టుపుల్స్ యాదృచ్ఛిక కీ విలువను ఉపయోగించి యాక్సెస్ చేయబడతాయి.
బెంచ్మార్క్ అనేది సర్వర్కు ఒకే అభ్యర్థన, ఇది 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లో పొడిగింపును కంపైల్ చేయడానికి మరియు అమలు చేయడానికి, నేను ఉపయోగించాల్సి వచ్చింది పాచ్.
Результаты
సిన్క్రోనస్ మోడ్
Tarantool ప్రోటోకాల్ బైనరీ ఆకృతిని ఉపయోగిస్తుంది మెసేజ్ప్యాక్ సందేశాలను సీరియలైజ్ చేయడానికి. PECL కనెక్టర్లో, సీరియలైజేషన్ లైబ్రరీ లోతుల్లో దాచబడింది మరియు యూజర్ల్యాండ్ కోడ్ నుండి ఎన్కోడింగ్ ప్రక్రియను ప్రభావితం చేస్తుంది సాధ్యం అనిపించడం లేదు. స్వచ్ఛమైన PHP కనెక్టర్, దీనికి విరుద్ధంగా, ప్రామాణిక ఎన్కోడర్ను విస్తరించడం ద్వారా లేదా మీ స్వంత అమలును ఉపయోగించడం ద్వారా ఎన్కోడింగ్ ప్రక్రియను అనుకూలీకరించగల సామర్థ్యాన్ని అందిస్తుంది. పెట్టె వెలుపల రెండు ఎన్కోడర్లు అందుబాటులో ఉన్నాయి, ఒకటి ఆధారంగా ఉంటుంది msgpack/msgpack-php (అధికారిక MessagePack PECL పొడిగింపు), మరొకటి ఆన్లో ఉంది rybakit/msgpack (స్వచ్ఛమైన PHPలో).
కనెక్టర్లను పోల్చడానికి ముందు, మేము PHP కనెక్టర్ కోసం మెసేజ్ప్యాక్ ఎన్కోడర్ల పనితీరును కొలుస్తాము మరియు తదుపరి పరీక్షలలో మేము ఉత్తమ ఫలితాన్ని చూపే దాన్ని ఉపయోగిస్తాము:
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ని అందిస్తుంది, దానిని మేము ఉపయోగిస్తాము. మన పర్యావరణానికి అనుకూలమైన కొరౌటిన్ల సంఖ్య 25 అని మేము అనుభవపూర్వకంగా కనుగొన్నాము:
10,000 కొరౌటిన్లలో 25 ఆపరేషన్లను "విస్తరించండి" మరియు ఏమి జరుగుతుందో చూడండి:
మీరు చూడగలిగినట్లుగా, అసమకాలిక మోడ్లో బైనరీ ప్రోటోకాల్ మరియు SQL మధ్య వ్యత్యాసం లోపం యొక్క మార్జిన్లో ఉంది.
ఊలు
స్వూల్ కోసం ఈసారి సరైన సంఖ్యలో కొరౌటిన్లను మేము మళ్లీ కనుగొంటాము:
25 వద్ద ఆపివేద్దాం. Async పొడిగింపుతో అదే ట్రిక్ను పునరావృతం చేద్దాం - 10,000 కొరౌటిన్ల మధ్య 25 ఆపరేషన్లను పంపిణీ చేయండి. అదనంగా, మేము మరొక పరీక్షను జోడిస్తాము, దీనిలో మేము అన్ని పనిని 2 రెండు ప్రక్రియలుగా విభజిస్తాము (అంటే, ప్రతి ప్రక్రియ 5,000 కొరౌటిన్లలో 25 ఆపరేషన్లను నిర్వహిస్తుంది). ఉపయోగించి ప్రక్రియలు సృష్టించబడతాయి స్వూల్ ప్రాసెస్.
ఫలితాలు:
ఒక ప్రక్రియలో అమలు చేసినప్పుడు Asyncతో పోలిస్తే స్వోల్ కొంచెం తక్కువ ఫలితాన్ని చూపుతుంది, కానీ 2 ప్రక్రియలతో చిత్రం నాటకీయంగా మారుతుంది (సంఖ్య 2 అనుకోకుండా ఎంపిక చేయబడలేదు; నా మెషీన్లో, ఇది 2 ప్రక్రియలు ఉత్తమ ఫలితాన్ని చూపించాయి).
మార్గం ద్వారా, Async పొడిగింపు ప్రక్రియలతో పని చేయడానికి APIని కూడా కలిగి ఉంది, కానీ అక్కడ నేను ఒకటి లేదా అంతకంటే ఎక్కువ ప్రాసెస్లలో బెంచ్మార్క్లను అమలు చేయడం నుండి ఎటువంటి తేడాను గమనించలేదు (నేను ఎక్కడో గందరగోళానికి గురయ్యే అవకాశం ఉంది).
SQL vs బైనరీ ప్రోటోకాల్:
Async మాదిరిగా, బైనరీ మరియు SQL ఆపరేషన్ల మధ్య వ్యత్యాసం అసమకాలిక మోడ్లో తొలగించబడుతుంది.
సమాంతర
సమాంతర పొడిగింపు అనేది కొరౌటిన్ల గురించి కాదు, థ్రెడ్ల గురించి కాబట్టి, సమాంతర థ్రెడ్ల యొక్క సరైన సంఖ్యను కొలుద్దాం:
ఇది నా మెషీన్లో 16కి సమానం. 16 సమాంతర థ్రెడ్లపై కనెక్టర్ బెంచ్మార్క్లను అమలు చేద్దాం:
మీరు చూడగలిగినట్లుగా, అసమకాలిక పొడిగింపుల కంటే ఫలితం మరింత మెరుగ్గా ఉంటుంది (2 ప్రక్రియలలో నడుస్తున్న స్వూల్ను లెక్కించడం లేదు). PECL కనెక్టర్ కోసం, అప్డేట్ మరియు అప్సర్ట్ ఆపరేషన్లు ఖాళీగా ఉన్నాయని గమనించండి. ఈ ఆపరేషన్లు ఎర్రర్తో విఫలం కావడమే దీనికి కారణం - ఇది ఎక్స్ట్-పారలల్, ఎక్స్ట్-టారంటూల్ లేదా రెండింటిలో తప్పా అని నాకు తెలియదు.
ఇప్పుడు SQL పనితీరును సరిపోల్చండి:
సమకాలీకరించబడిన కనెక్టర్ల కోసం గ్రాఫ్తో సారూప్యతను గమనించారా?
కలిసి
చివరగా, పరీక్షించిన పొడిగింపుల కోసం మొత్తం చిత్రాన్ని చూడటానికి ఒక గ్రాఫ్లో అన్ని ఫలితాలను సంగ్రహిద్దాం. చార్ట్కు కేవలం ఒక కొత్త పరీక్షను జోడిద్దాం, ఇది మనం ఇంకా పూర్తి చేయలేదు - సమాంతరంగా Async కొరోటిన్లను సమాంతరంగా అమలు చేద్దాం*. పై పొడిగింపులను ఏకీకృతం చేయాలనే ఆలోచన ఇప్పటికే ఉంది అనే చర్చ జరిగింది రచయితలు, కానీ ఏకాభిప్రాయం కుదరలేదు, మీరు దీన్ని మీరే చేయాలి.
* సమాంతరంగా స్వూల్ కరోటిన్లను ప్రారంభించడం సాధ్యం కాదు; ఈ పొడిగింపులు అననుకూలంగా ఉన్నట్లు తెలుస్తోంది.
కాబట్టి, తుది ఫలితాలు:
ముగింపుకు బదులుగా
నా అభిప్రాయం ప్రకారం, ఫలితాలు చాలా విలువైనవిగా మారాయి మరియు కొన్ని కారణాల వల్ల ఇది పరిమితి కాదని నేను ఖచ్చితంగా అనుకుంటున్నాను! మీరు దీన్ని మీ కోసం మాత్రమే నిజమైన ప్రాజెక్ట్లో నిర్ణయించాల్సిన అవసరం ఉందా, నాకు ఇది ఒక ఆసక్తికరమైన ప్రయోగం అని మాత్రమే చెబుతాను, ఇది తక్కువ ప్రయత్నంతో సింక్రోనస్ TCP కనెక్టర్ నుండి మీరు ఎంత “స్క్వీజ్” చేయగలరో అంచనా వేయడానికి మిమ్మల్ని అనుమతిస్తుంది. బెంచ్మార్క్లను మెరుగుపరచడానికి మీకు ఆలోచనలు ఉంటే, మీ పుల్ రిక్వెస్ట్ని పరిగణనలోకి తీసుకోవడానికి నేను సంతోషిస్తాను. ప్రయోగ సూచనలు మరియు ఫలితాలతో కూడిన మొత్తం కోడ్ విడిగా ప్రచురించబడుతుంది రిపోజిటరీలు.