నేను ఈ కథనాన్ని చాలా ఆసక్తికరంగా భావించాను మరియు ఎన్వోయ్ను చాలా తరచుగా "ఇస్టియో"లో భాగంగా లేదా కుబెర్నెట్స్ యొక్క "ఇన్గ్రెస్ కంట్రోలర్"గా ఉపయోగిస్తున్నందున, చాలా మందికి దానితో ఒకే విధమైన ప్రత్యక్ష పరస్పర చర్య ఉండదు, ఉదాహరణకు, సాధారణ Nginx లేదా Haproxy ఇన్స్టాలేషన్లు. అయితే, ఏదైనా విచ్ఛిన్నమైతే, అది లోపలి నుండి ఎలా పనిచేస్తుందో అర్థం చేసుకోవడం మంచిది. నేను ప్రత్యేక పదాలతో సహా వీలైనంత ఎక్కువ టెక్స్ట్ను రష్యన్లోకి అనువదించడానికి ప్రయత్నించాను; దీన్ని చూడటం బాధాకరం అని భావించే వారి కోసం, నేను మూలాలను కుండలీకరణాల్లో ఉంచాను. పిల్లికి స్వాగతం.
ఎన్వోయ్ కోడ్బేస్ కోసం తక్కువ-స్థాయి సాంకేతిక డాక్యుమెంటేషన్ ప్రస్తుతం చాలా తక్కువగా ఉంది. దీనిని పరిష్కరించడానికి, నేను ఎన్వోయ్ యొక్క వివిధ సబ్సిస్టమ్ల గురించి బ్లాగ్ పోస్ట్ల శ్రేణిని చేయాలని ప్లాన్ చేస్తున్నాను. ఇది మొదటి కథనం కాబట్టి, దయచేసి మీరు ఏమనుకుంటున్నారో మరియు భవిష్యత్ కథనాలపై మీకు ఏమి ఆసక్తి ఉందో నాకు తెలియజేయండి.
ఎన్వోయ్ గురించి నేను స్వీకరించే అత్యంత సాధారణ సాంకేతిక ప్రశ్నలలో ఒకటి అది ఉపయోగించే థ్రెడింగ్ మోడల్ యొక్క తక్కువ-స్థాయి వివరణ కోసం అడగడం. ఈ పోస్ట్లో, ఎన్వోయ్ థ్రెడ్లకు కనెక్షన్లను ఎలా మ్యాప్ చేస్తుందో, అలాగే కోడ్ను మరింత సమాంతరంగా మరియు అధిక పనితీరును చేయడానికి అంతర్గతంగా ఉపయోగించే థ్రెడ్ లోకల్ స్టోరేజ్ సిస్టమ్ను వివరిస్తాను.
థ్రెడింగ్ అవలోకనం
ఎన్వోయ్ మూడు విభిన్న రకాల స్ట్రీమ్లను ఉపయోగిస్తాడు:
ప్రధాన: ఈ థ్రెడ్ ప్రాసెస్ స్టార్టప్ మరియు టెర్మినేషన్, DNS, హెల్త్ చెకింగ్, జనరల్ క్లస్టర్ మరియు రన్టైమ్ మేనేజ్మెంట్, స్టాటిస్టిక్స్ రీసెట్, అడ్మినిస్ట్రేషన్ మరియు జనరల్ ప్రాసెస్ మేనేజ్మెంట్ - Linux సిగ్నల్స్. హాట్ రీస్టార్ట్ మొదలైన వాటితో సహా XDS (xDiscovery సర్వీస్) API యొక్క అన్ని ప్రాసెసింగ్లను నియంత్రిస్తుంది. ఈ థ్రెడ్లో అసమకాలిక మరియు "నాన్-బ్లాకింగ్" జరుగుతుంది. సాధారణంగా, ప్రధాన థ్రెడ్ అమలు చేయడానికి పెద్ద మొత్తంలో CPU అవసరం లేని అన్ని క్లిష్టమైన కార్యాచరణ ప్రక్రియలను సమన్వయం చేస్తుంది. ఇది చాలా నియంత్రణ కోడ్ను సింగిల్ థ్రెడ్గా వ్రాయడానికి అనుమతిస్తుంది.
కార్మికుడు: డిఫాల్ట్గా, సిస్టమ్లోని ప్రతి హార్డ్వేర్ థ్రెడ్ కోసం ఎన్వోయ్ వర్కర్ థ్రెడ్ను సృష్టిస్తుంది, దీన్ని ఎంపికను ఉపయోగించి నియంత్రించవచ్చు --concurrency. ప్రతి వర్కర్ థ్రెడ్ "నాన్-బ్లాకింగ్" ఈవెంట్ లూప్ను నడుపుతుంది, ఇది ప్రతి శ్రోతని వినడానికి బాధ్యత వహిస్తుంది; వ్రాసే సమయంలో (జూలై 29, 2017) శ్రోత యొక్క షేడింగ్ లేదు, కొత్త కనెక్షన్లను అంగీకరించడం, ఫిల్టర్ స్టాక్ను ఇన్స్టాంటియేట్ చేయడం కనెక్షన్, మరియు కనెక్షన్ జీవితకాలంలో అన్ని ఇన్పుట్/అవుట్పుట్ (IO) ఆపరేషన్లను ప్రాసెస్ చేస్తుంది. మళ్ళీ, ఇది చాలా కనెక్షన్ హ్యాండ్లింగ్ కోడ్ను సింగిల్ థ్రెడ్గా వ్రాయడానికి అనుమతిస్తుంది.
ఫైల్ ఫ్లషర్: ఎన్వోయ్ వ్రాసే ప్రతి ఫైల్, ప్రధానంగా యాక్సెస్ లాగ్లు, ప్రస్తుతం స్వతంత్ర బ్లాకింగ్ థ్రెడ్ని కలిగి ఉంది. ఉపయోగిస్తున్నప్పుడు కూడా ఫైల్ సిస్టమ్ ద్వారా కాష్ చేయబడిన ఫైల్లకు వ్రాయడం దీనికి కారణం O_NONBLOCK కొన్నిసార్లు నిరోధించబడవచ్చు (నిట్టూర్పు). వర్కర్ థ్రెడ్లు ఫైల్కి వ్రాయవలసి వచ్చినప్పుడు, డేటా వాస్తవానికి మెమరీలోని బఫర్కు తరలించబడుతుంది, అక్కడ అది చివరికి థ్రెడ్ ద్వారా ఫ్లష్ చేయబడుతుంది. ఫైల్ ఫ్లష్. ఇది మెమరీ బఫర్ను పూరించడానికి ప్రయత్నిస్తున్నప్పుడు సాంకేతికంగా అన్ని వర్కర్ థ్రెడ్లు ఒకే లాక్ని బ్లాక్ చేయగల కోడ్ యొక్క ఒక ప్రాంతం.
కనెక్షన్ నిర్వహణ
పైన క్లుప్తంగా చర్చించినట్లుగా, అన్ని వర్కర్ థ్రెడ్లు ఎటువంటి షేడింగ్ లేకుండా శ్రోతలందరిని వింటాయి. అందువలన, కెర్నల్ వర్కర్ థ్రెడ్లకు ఆమోదించబడిన సాకెట్లను సునాయాసంగా పంపడానికి ఉపయోగించబడుతుంది. ఆధునిక కెర్నల్లు సాధారణంగా ఇందులో చాలా మంచివి, అవి ఒకే సాకెట్లో వినే ఇతర థ్రెడ్లను ఉపయోగించడం ప్రారంభించే ముందు పనితో థ్రెడ్ను పూరించడానికి ఇన్పుట్/అవుట్పుట్ (IO) ప్రాధాన్యత బూస్టింగ్ వంటి లక్షణాలను ఉపయోగిస్తాయి మరియు రౌండ్ రాబిన్ను కూడా ఉపయోగించవు. ప్రతి అభ్యర్థనను ప్రాసెస్ చేయడానికి లాకింగ్ (స్పిన్లాక్).
వర్కర్ థ్రెడ్లో కనెక్షన్ ఆమోదించబడిన తర్వాత, అది ఆ థ్రెడ్ను ఎప్పటికీ వదిలివేయదు. కనెక్షన్ యొక్క తదుపరి ప్రాసెసింగ్ ఏదైనా ఫార్వార్డింగ్ ప్రవర్తనతో సహా పూర్తిగా వర్కర్ థ్రెడ్లో నిర్వహించబడుతుంది.
ఇది అనేక ముఖ్యమైన పరిణామాలను కలిగి ఉంది:
ఎన్వోయ్లోని అన్ని కనెక్షన్ పూల్లు వర్కర్ థ్రెడ్కు కేటాయించబడ్డాయి. కాబట్టి, HTTP/2 కనెక్షన్ పూల్లు ఒక్కో అప్స్ట్రీమ్ హోస్ట్కు ఒకేసారి ఒక కనెక్షన్ను మాత్రమే చేసినప్పటికీ, నాలుగు వర్కర్ థ్రెడ్లు ఉంటే, స్థిరమైన స్థితిలో అప్స్ట్రీమ్ హోస్ట్కు నాలుగు HTTP/2 కనెక్షన్లు ఉంటాయి.
ఎన్వోయ్ ఈ విధంగా పనిచేయడానికి కారణం ఏమిటంటే, అన్నింటినీ ఒకే వర్కర్ థ్రెడ్లో ఉంచడం ద్వారా, దాదాపు అన్ని కోడ్లను బ్లాక్ చేయకుండా మరియు సింగిల్ థ్రెడ్గా వ్రాయవచ్చు. ఈ డిజైన్ దాదాపు అపరిమిత సంఖ్యలో వర్కర్ థ్రెడ్లకు చాలా కోడ్ మరియు స్కేల్లను వ్రాయడాన్ని సులభతరం చేస్తుంది.
ఏది ఏమైనప్పటికీ, మెమొరీ పూల్ మరియు కనెక్షన్ ఎఫిషియెన్సీ దృక్కోణం నుండి కాన్ఫిగర్ చేయడం చాలా ముఖ్యం అనేది ప్రధాన టేకావేలలో ఒకటి. --concurrency. అవసరమైన దానికంటే ఎక్కువ వర్కర్ థ్రెడ్లను కలిగి ఉండటం వలన మెమరీ వృధా అవుతుంది, ఎక్కువ నిష్క్రియ కనెక్షన్లను సృష్టిస్తుంది మరియు కనెక్షన్ పూలింగ్ రేటును తగ్గిస్తుంది. లిఫ్ట్లో, మా ఎంవోయ్ సైడ్కార్ కంటైనర్లు చాలా తక్కువ కరెన్సీతో నడుస్తాయి, తద్వారా పనితీరు వారు పక్కన కూర్చున్న సేవలకు సరిపోలుతుంది. మేము ఎన్వాయ్ని ఎడ్జ్ ప్రాక్సీగా గరిష్ట సమ్మతి వద్ద మాత్రమే అమలు చేస్తాము.
నాన్-బ్లాకింగ్ అంటే ఏమిటి?
మెయిన్ మరియు వర్కర్ థ్రెడ్లు ఎలా పనిచేస్తాయో చర్చించేటప్పుడు "నాన్-బ్లాకింగ్" అనే పదం ఇప్పటివరకు చాలాసార్లు ఉపయోగించబడింది. ఏదీ ఎప్పుడూ బ్లాక్ చేయబడలేదనే భావనతో అన్ని కోడ్ వ్రాయబడింది. అయితే, ఇది పూర్తిగా నిజం కాదు (ఏది పూర్తిగా నిజం కాదు?).
రాయబారి అనేక సుదీర్ఘ ప్రక్రియ తాళాలను ఉపయోగిస్తాడు:
చర్చించినట్లుగా, యాక్సెస్ లాగ్లను వ్రాసేటప్పుడు, ఇన్-మెమరీ లాగ్ బఫర్ను పూరించడానికి ముందు అన్ని వర్కర్ థ్రెడ్లు ఒకే లాక్ని పొందుతాయి. లాక్ హోల్డింగ్ సమయం చాలా తక్కువగా ఉండాలి, కానీ అధిక సమ్మతి మరియు అధిక నిర్గమాంశతో లాక్ పోటీ చేయడం సాధ్యమవుతుంది.
థ్రెడ్లో స్థానికంగా ఉండే గణాంకాలను నిర్వహించడానికి ఎన్వోయ్ చాలా క్లిష్టమైన వ్యవస్థను ఉపయోగిస్తాడు. ఇది ప్రత్యేక పోస్ట్ యొక్క అంశంగా ఉంటుంది. అయినప్పటికీ, స్థానికంగా థ్రెడ్ గణాంకాలను ప్రాసెస్ చేయడంలో భాగంగా, సెంట్రల్ "స్టాట్స్ స్టోర్"లో లాక్ని పొందడం కొన్నిసార్లు అవసరం అని నేను క్లుప్తంగా ప్రస్తావిస్తాను. ఈ లాకింగ్ ఎప్పుడూ అవసరం లేదు.
ప్రధాన థ్రెడ్ కాలానుగుణంగా అన్ని వర్కర్ థ్రెడ్లతో సమన్వయం చేసుకోవాలి. ఇది ప్రధాన థ్రెడ్ నుండి వర్కర్ థ్రెడ్లకు మరియు కొన్నిసార్లు వర్కర్ థ్రెడ్ల నుండి ప్రధాన థ్రెడ్కు "ప్రచురణ" ద్వారా జరుగుతుంది. పంపడానికి లాక్ అవసరం, తద్వారా ప్రచురించబడిన సందేశం తర్వాత డెలివరీ కోసం క్యూలో ఉంచబడుతుంది. ఈ తాళాలు ఎప్పుడూ తీవ్రంగా పోటీ చేయకూడదు, కానీ అవి ఇప్పటికీ సాంకేతికంగా బ్లాక్ చేయబడవచ్చు.
ఎన్వోయ్ సిస్టమ్ ఎర్రర్ స్ట్రీమ్కు లాగ్ను వ్రాసినప్పుడు (ప్రామాణిక లోపం), అది మొత్తం ప్రక్రియపై లాక్ని పొందుతుంది. సాధారణంగా, ఎన్వోయ్ యొక్క స్థానిక లాగింగ్ పనితీరు దృక్కోణం నుండి భయంకరమైనదిగా పరిగణించబడుతుంది, కాబట్టి దానిని మెరుగుపరచడంపై పెద్దగా శ్రద్ధ చూపలేదు.
కొన్ని ఇతర యాదృచ్ఛిక తాళాలు ఉన్నాయి, కానీ వాటిలో ఏవీ పనితీరు క్లిష్టమైనవి కావు మరియు ఎప్పటికీ సవాలు చేయకూడదు.
థ్రెడ్ స్థానిక నిల్వ
ఎంవోయ్ ప్రధాన థ్రెడ్ యొక్క బాధ్యతలను వర్కర్ థ్రెడ్ యొక్క బాధ్యతల నుండి వేరు చేసే విధానం కారణంగా, ప్రధాన థ్రెడ్పై సంక్లిష్టమైన ప్రాసెసింగ్ను నిర్వహించి, ఆపై ప్రతి వర్కర్ థ్రెడ్కు అత్యంత ఏకకాలిక పద్ధతిలో అందించాల్సిన అవసరం ఉంది. ఈ విభాగం అధిక స్థాయిలో ఎన్వోయ్ థ్రెడ్ లోకల్ స్టోరేజ్ (TLS)ని వివరిస్తుంది. క్లస్టర్ని నిర్వహించడానికి ఇది ఎలా ఉపయోగించబడుతుందో తదుపరి విభాగంలో నేను వివరిస్తాను.
ఇప్పటికే వివరించినట్లుగా, ప్రధాన థ్రెడ్ ఎన్వోయ్ ప్రక్రియలో వాస్తవంగా అన్ని నిర్వహణ మరియు నియంత్రణ ప్లేన్ కార్యాచరణను నిర్వహిస్తుంది. కంట్రోల్ ప్లేన్ ఇక్కడ కొంచెం ఓవర్లోడ్ చేయబడింది, కానీ మీరు దానిని ఎన్వోయ్ ప్రాసెస్లోనే చూసి, వర్కర్ థ్రెడ్లు చేసే ఫార్వార్డింగ్తో పోల్చినప్పుడు, అది అర్ధమే. సాధారణ నియమం ఏమిటంటే, ప్రధాన థ్రెడ్ ప్రక్రియ కొంత పని చేస్తుంది, ఆపై ఆ పని ఫలితం ప్రకారం ప్రతి వర్కర్ థ్రెడ్ను నవీకరించడం అవసరం. ఈ సందర్భంలో, వర్కర్ థ్రెడ్ ప్రతి యాక్సెస్పై లాక్ని పొందాల్సిన అవసరం లేదు.
ఎన్వోయ్ యొక్క TLS (థ్రెడ్ లోకల్ స్టోరేజ్) సిస్టమ్ క్రింది విధంగా పనిచేస్తుంది:
ప్రధాన థ్రెడ్లో రన్ అవుతున్న కోడ్ మొత్తం ప్రక్రియ కోసం TLS స్లాట్ను కేటాయించగలదు. ఇది సంగ్రహించబడినప్పటికీ, ఆచరణలో ఇది వెక్టర్లోకి సూచికగా ఉంటుంది, ఇది O(1) యాక్సెస్ను అందిస్తుంది.
ప్రధాన థ్రెడ్ దాని స్లాట్లో ఏకపక్ష డేటాను ఇన్స్టాల్ చేయగలదు. ఇది పూర్తయినప్పుడు, డేటా ప్రతి వర్కర్ థ్రెడ్కు సాధారణ ఈవెంట్ లూప్ ఈవెంట్గా ప్రచురించబడుతుంది.
వర్కర్ థ్రెడ్లు వారి TLS స్లాట్ నుండి చదవగలవు మరియు అక్కడ అందుబాటులో ఉన్న ఏదైనా థ్రెడ్-లోకల్ డేటాను తిరిగి పొందగలవు.
ఇది చాలా సులభమైన మరియు నమ్మశక్యంకాని శక్తివంతమైన నమూనా అయినప్పటికీ, ఇది RCU (రీడ్-కాపీ-అప్డేట్) నిరోధించే భావనకు చాలా పోలి ఉంటుంది. ముఖ్యంగా, పని నడుస్తున్నప్పుడు వర్కర్ థ్రెడ్లు TLS స్లాట్లలో ఎటువంటి డేటా మార్పులను చూడవు. పని సంఘటనల మధ్య విశ్రాంతి సమయంలో మాత్రమే మార్పు జరుగుతుంది.
రాయబారి దీనిని రెండు రకాలుగా ఉపయోగిస్తాడు:
ప్రతి వర్కర్ థ్రెడ్లో వేర్వేరు డేటాను నిల్వ చేయడం ద్వారా, ఎలాంటి బ్లాక్ లేకుండా డేటాను యాక్సెస్ చేయవచ్చు.
ప్రతి వర్కర్ థ్రెడ్లో రీడ్-ఓన్లీ మోడ్లో గ్లోబల్ డేటాకు షేర్డ్ పాయింటర్ను నిర్వహించడం ద్వారా. అందువల్ల, ప్రతి వర్కర్ థ్రెడ్ డేటా రిఫరెన్స్ కౌంట్ను కలిగి ఉంటుంది, అది పని నడుస్తున్నప్పుడు తగ్గించబడదు. కార్మికులందరూ శాంతించి, కొత్త షేర్ చేసిన డేటాను అప్లోడ్ చేసినప్పుడే పాత డేటా నాశనం అవుతుంది. ఇది RCUకి సమానంగా ఉంటుంది.
క్లస్టర్ అప్డేట్ థ్రెడింగ్
ఈ విభాగంలో, క్లస్టర్ని నిర్వహించడానికి TLS (థ్రెడ్ స్థానిక నిల్వ) ఎలా ఉపయోగించబడుతుందో నేను వివరిస్తాను. క్లస్టర్ మేనేజ్మెంట్లో xDS API మరియు/లేదా DNS ప్రాసెసింగ్, అలాగే ఆరోగ్య తనిఖీ ఉంటుంది.
క్లస్టర్ ఫ్లో మేనేజ్మెంట్ కింది భాగాలు మరియు దశలను కలిగి ఉంటుంది:
క్లస్టర్ మేనేజర్ అనేది అన్ని తెలిసిన క్లస్టర్ అప్స్ట్రీమ్లు, క్లస్టర్ డిస్కవరీ సర్వీస్ (CDS) API, సీక్రెట్ డిస్కవరీ సర్వీస్ (SDS) మరియు ఎండ్పాయింట్ డిస్కవరీ సర్వీస్ (EDS) APIలు, DNS మరియు క్రియాశీల బాహ్య తనిఖీలను నిర్వహించే ఎన్వాయ్లోని ఒక భాగం. ఆరోగ్య తనిఖీ. ప్రతి అప్స్ట్రీమ్ క్లస్టర్ యొక్క "చివరికి స్థిరమైన" వీక్షణను రూపొందించడానికి ఇది బాధ్యత వహిస్తుంది, ఇందులో కనుగొనబడిన హోస్ట్లు అలాగే ఆరోగ్య స్థితి కూడా ఉంటుంది.
హెల్త్ చెకర్ యాక్టివ్ హెల్త్ చెక్ చేసి, ఆరోగ్య స్థితి మార్పులను క్లస్టర్ మేనేజర్కి నివేదిస్తాడు.
CDS (క్లస్టర్ డిస్కవరీ సర్వీస్) / SDS (సీక్రెట్ డిస్కవరీ సర్వీస్) / EDS (ఎండ్పాయింట్ డిస్కవరీ సర్వీస్) / DNS క్లస్టర్ సభ్యత్వాన్ని నిర్ణయించడానికి నిర్వహిస్తారు. రాష్ట్ర మార్పు క్లస్టర్ మేనేజర్కి తిరిగి ఇవ్వబడుతుంది.
ప్రతి వర్కర్ థ్రెడ్ నిరంతరం ఈవెంట్ లూప్ను అమలు చేస్తుంది.
క్లస్టర్ మేనేజర్ క్లస్టర్ యొక్క స్థితి మారిందని నిర్ధారించినప్పుడు, అది క్లస్టర్ స్థితికి సంబంధించిన కొత్త రీడ్-ఓన్లీ స్నాప్షాట్ను సృష్టిస్తుంది మరియు దానిని ప్రతి వర్కర్ థ్రెడ్కు పంపుతుంది.
తదుపరి నిశ్శబ్ద సమయంలో, వర్కర్ థ్రెడ్ కేటాయించిన TLS స్లాట్లో స్నాప్షాట్ను అప్డేట్ చేస్తుంది.
బ్యాలెన్స్ని లోడ్ చేయడానికి హోస్ట్ను నిర్ణయించాల్సిన I/O ఈవెంట్ సమయంలో, లోడ్ బ్యాలెన్సర్ హోస్ట్ గురించి సమాచారాన్ని పొందడానికి TLS (థ్రెడ్ లోకల్ స్టోరేజ్) స్లాట్ను అభ్యర్థిస్తుంది. దీనికి తాళాలు అవసరం లేదు. TLS కూడా అప్డేట్ ఈవెంట్లను ట్రిగ్గర్ చేయగలదని గమనించండి, తద్వారా లోడ్ బ్యాలెన్సర్లు మరియు ఇతర భాగాలు కాష్లు, డేటా స్ట్రక్చర్లు మొదలైనవాటిని తిరిగి లెక్కించగలవు. ఇది ఈ పోస్ట్ యొక్క పరిధికి మించినది, కానీ కోడ్లోని వివిధ ప్రదేశాలలో ఉపయోగించబడుతుంది.
పై విధానాన్ని ఉపయోగించి, రాయబారి ప్రతి అభ్యర్థనను ఎటువంటి నిరోధించకుండా ప్రాసెస్ చేయవచ్చు (గతంలో వివరించినవి తప్ప). TLS కోడ్ యొక్క సంక్లిష్టతను పక్కన పెడితే, బహుళ థ్రెడింగ్ ఎలా పనిచేస్తుందో మరియు సింగిల్-థ్రెడ్గా వ్రాయవచ్చో అర్థం చేసుకోవడం చాలా కోడ్కు అవసరం లేదు. ఇది అత్యుత్తమ పనితీరుతో పాటుగా చాలా కోడ్లను వ్రాయడాన్ని సులభతరం చేస్తుంది.
TLSని ఉపయోగించే ఇతర ఉపవ్యవస్థలు
ఎన్వాయ్లో TLS (థ్రెడ్ లోకల్ స్టోరేజ్) మరియు RCU (రీడ్ కాపీ అప్డేట్) విస్తృతంగా ఉపయోగించబడుతున్నాయి.
ఉపయోగించడానికి ఉదాహరణలు:
అమలు సమయంలో కార్యాచరణను మార్చడానికి మెకానిజం: ప్రారంభించబడిన కార్యాచరణ యొక్క ప్రస్తుత జాబితా ప్రధాన థ్రెడ్లో లెక్కించబడుతుంది. ప్రతి వర్కర్ థ్రెడ్కు RCU సెమాంటిక్స్ ఉపయోగించి చదవడానికి మాత్రమే స్నాప్షాట్ ఇవ్వబడుతుంది.
రూట్ టేబుల్లను భర్తీ చేస్తోంది: RDS (రూట్ డిస్కవరీ సర్వీస్) అందించిన రూట్ టేబుల్ల కోసం, రూట్ టేబుల్లు ప్రధాన థ్రెడ్లో సృష్టించబడతాయి. RCU (రీడ్ కాపీ అప్డేట్) సెమాంటిక్స్ ఉపయోగించి ప్రతి వర్కర్ థ్రెడ్కు చదవడానికి మాత్రమే స్నాప్షాట్ అందించబడుతుంది. ఇది రూట్ టేబుల్లను మార్చడాన్ని అటామిక్గా సమర్థవంతంగా చేస్తుంది.
HTTP హెడర్ కాషింగ్: ఇది ముగిసినట్లుగా, ప్రతి అభ్యర్థన కోసం HTTP హెడర్ను లెక్కించడం (కోర్కు ~25K+ RPSని అమలు చేస్తున్నప్పుడు) చాలా ఖరీదైనది. రాయబారి దాదాపు ప్రతి అర్ధ సెకనుకు హెడర్ను కేంద్రీయంగా గణిస్తారు మరియు దానిని TLS మరియు RCU ద్వారా ప్రతి కార్యకర్తకు అందిస్తారు.
ఇతర సందర్భాలు ఉన్నాయి, కానీ మునుపటి ఉదాహరణలు TLS దేనికి ఉపయోగించబడుతుందో బాగా అర్థం చేసుకోవాలి.
తెలిసిన పనితీరు ఆపదలు
ఎన్వోయ్ మొత్తంగా చాలా బాగా పనిచేసినప్పటికీ, చాలా ఎక్కువ సమ్మతి మరియు నిర్గమాంశతో ఉపయోగించినప్పుడు శ్రద్ధ వహించాల్సిన కొన్ని ముఖ్యమైన ప్రాంతాలు ఉన్నాయి:
ఈ కథనంలో వివరించినట్లుగా, యాక్సెస్ లాగ్ మెమరీ బఫర్కు వ్రాసేటప్పుడు ప్రస్తుతం అన్ని వర్కర్ థ్రెడ్లు లాక్ని పొందుతాయి. అధిక సమ్మతి మరియు అధిక నిర్గమాంశతో, తుది ఫైల్కి వ్రాసేటప్పుడు అవుట్-ఆఫ్-ఆర్డర్ డెలివరీ ఖర్చుతో మీరు ప్రతి వర్కర్ థ్రెడ్కు యాక్సెస్ లాగ్లను బ్యాచ్ చేయాలి. ప్రత్యామ్నాయంగా, మీరు ప్రతి వర్కర్ థ్రెడ్ కోసం ప్రత్యేక యాక్సెస్ లాగ్ను సృష్టించవచ్చు.
గణాంకాలు అత్యంత ఆప్టిమైజ్ చేయబడినప్పటికీ, చాలా ఎక్కువ సమ్మతి మరియు నిర్గమాంశతో వ్యక్తిగత గణాంకాలపై పరమాణు వివాదం ఉండవచ్చు. ఈ సమస్యకు పరిష్కారం సెంట్రల్ కౌంటర్ల యొక్క ఆవర్తన రీసెట్తో ప్రతి వర్కర్ థ్రెడ్కు కౌంటర్లు. ఇది తదుపరి పోస్ట్లో చర్చించబడుతుంది.
ముఖ్యమైన ప్రాసెసింగ్ వనరులు అవసరమయ్యే చాలా తక్కువ కనెక్షన్లు ఉన్న దృష్టాంతంలో ఎన్వోయ్ని నియమించినట్లయితే ప్రస్తుత నిర్మాణం సరిగ్గా పని చేయదు. వర్కర్ థ్రెడ్ల మధ్య కనెక్షన్లు సమానంగా పంపిణీ చేయబడతాయనే హామీ లేదు. వర్కర్ కనెక్షన్ బ్యాలెన్సింగ్ను అమలు చేయడం ద్వారా దీనిని పరిష్కరించవచ్చు, ఇది వర్కర్ థ్రెడ్ల మధ్య కనెక్షన్ల మార్పిడిని అనుమతిస్తుంది.
ముగింపు
ఎన్వాయ్ యొక్క థ్రెడింగ్ మోడల్ ప్రోగ్రామింగ్ సౌలభ్యాన్ని అందించడానికి మరియు సరిగ్గా కాన్ఫిగర్ చేయకుంటే వృధా అయ్యే మెమరీ మరియు కనెక్షన్ల ఖర్చుతో భారీ సమాంతరతను అందించడానికి రూపొందించబడింది. ఈ మోడల్ చాలా ఎక్కువ థ్రెడ్ గణనలు మరియు నిర్గమాంశ వద్ద చాలా బాగా పని చేయడానికి అనుమతిస్తుంది.
నేను ట్విట్టర్లో క్లుప్తంగా పేర్కొన్నట్లుగా, డిజైన్ DPDK (డేటా ప్లేన్ డెవలప్మెంట్ కిట్) వంటి పూర్తి వినియోగదారు-మోడ్ నెట్వర్కింగ్ స్టాక్పై కూడా అమలు చేయగలదు, దీని ఫలితంగా సాంప్రదాయ సర్వర్లు పూర్తి L7 ప్రాసెసింగ్తో సెకనుకు మిలియన్ల అభ్యర్థనలను నిర్వహించగలవు. రాబోయే కొన్నేళ్లలో ఏమి నిర్మించబడుతుందో చూడటం చాలా ఆసక్తికరంగా ఉంటుంది.
ఒక చివరి శీఘ్ర వ్యాఖ్య: మేము ఎన్వోయ్ కోసం C++ని ఎందుకు ఎంచుకున్నామని నన్ను చాలాసార్లు అడిగారు. ఈ పోస్ట్లో వివరించిన నిర్మాణాన్ని నిర్మించగలిగే ఏకైక పారిశ్రామిక గ్రేడ్ భాష ఇది ఇప్పటికీ దీనికి కారణం. C++ ఖచ్చితంగా అన్ని లేదా అనేక ప్రాజెక్ట్లకు తగినది కాదు, కానీ నిర్దిష్ట వినియోగ సందర్భాలలో ఇది ఇప్పటికీ పనిని పూర్తి చేయడానికి ఏకైక సాధనం.
కోడ్కి లింక్లు
ఈ పోస్ట్లో చర్చించబడిన ఇంటర్ఫేస్లు మరియు హెడర్ అమలులతో ఉన్న ఫైల్లకు లింక్లు: