प्रतिनिधि इंटरव्यू विषय

सामान्य इंटरव्यू: आप NUMA को कैसे समझाएंगे और रिमोट-मेमोरी लेटेंसी का निदान (Diagnose) कैसे करेंगे?

सामान्यकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

अपग्रेड के बाद एक मेमोरी-इंटेन्सिव सर्विस में CPU यूटिलाइज़ेशन सामान्य होने के बावजूद p99 बढ़ जाता है। NUMA को समझाएं और एक ऐसा निदान डिज़ाइन करें जो रिमोट-मेमोरी एक्सेस, गलत बाइंडिंग और ऑटोमैटिक-बैलेंसिंग के साइड इफेक्ट्स में अंतर कर सके।

प्रॉम्प्ट और संदर्भ

अपग्रेड के बाद एक मेमोरी-इंटेन्सिव सर्विस में CPU यूटिलाइज़ेशन सामान्य होने के बावजूद p99 बढ़ जाता है। होस्ट में कई NUMA नोड्स हैं और एक थ्रेड अपने पेजों से भिन्न नोड पर चल सकता है। NUMA को समझाएं और टोपोलॉजी, एफिनिटी, एलोकेशन और नियंत्रित बेंचमार्क के आधार पर निदान प्रदान करें। यह प्रश्न ऑपरेटिंग सिस्टम, परफॉर्मेंस एनालिसिस और इंजीनियरिंग रीजनिंग का परीक्षण करता है।

इंटरव्यूअर क्या टेस्ट कर रहा है

लोकैलिटी (Locality) को समझना

NUMA एक ही एड्रेसेबल सिस्टम में कई CPU और मेमोरी नोड्स को प्रस्तुत करता है। लोकल मेमोरी आमतौर पर तेज़ होती है और निकटतम अधिक बैंडविड्थ प्रदान करती है, इसलिए परफॉर्मेंस इस बात पर निर्भर करता है कि अधिकांश कैश-मिस एक्सेस लोकल रहें।

लक्षणों को सबूतों से अलग करना

सामान्य CPU यूटिलाइज़ेशन रिमोट-मेमोरी स्टॉल्स को खारिज नहीं करता है। किसी एक समग्र मेट्रिक के बजाय टोपोलॉजी, प्रोसेस प्लेसमेंट, numastat, हार्डवेयर काउंटर्स और दोहराए जाने योग्य बेसलाइन का उपयोग करें।

सुरक्षित प्रयोगों का प्रस्ताव देना

समान लोड के साथ फिक्स्ड CPU प्लेसमेंट, फिक्स्ड मेमोरी प्लेसमेंट, इंटरलीविंग और डिफॉल्ट पॉलिसी की तुलना करें। किसी बदलाव को किसी कारण से जोड़ने के लिए p50/p99, बैंडविड्थ और मिस काउंटर्स का उपयोग करें।

पहले स्पष्ट करने योग्य प्रश्न

  • होस्ट पर कितने NUMA नोड्स, CPUs, मेमोरी बैंक्स और डिवाइसेस मौजूद हैं?
  • क्या यह रिग्रेशन किसी सिंगल थ्रेड, थ्रेड पूल, कंटेनर या VM में देखा गया है?
  • क्या सर्विस huge pages, शेयर्ड मेमोरी, मेमोरी मैपिंग या GPU/NIC DMA का उपयोग करती है?
  • प्रोसेस/थ्रेड एफिनिटी, cpuset और मेमोरी पॉलिसी सेटिंग्स क्या हैं?
  • क्या ऑटोमैटिक NUMA बैलेंसिंग सक्षम है, और क्या कर्नेल या रनटाइम में बदलाव हुआ था?
  • कौन सा बेसलाइन मेमोरी लेटेंसी, बैंडविड्थ सैचुरेशन और लॉक कंटेंशन को अलग करता है?

30-सेकंड का उत्तर

"NUMA, CPUs, मेमोरी और इंटरकनेक्ट्स को नोड्स में समूहित करता है; लोकल मेमोरी आमतौर पर तेज़ होती है, जबकि रिमोट एक्सेस लेटेंसी बढ़ाती है और इंटरकनेक्ट बैंडविड्थ की खपत करती है। मैं numactl --hardware, एफिनिटी, numastat -p और /proc/<pid>/numa_maps का निरीक्षण करूंगा, फिर उसी वर्कलोड पर डिफॉल्ट, लोकल बाइंडिंग और इंटरलीविंग की तुलना करूंगा। मैं p99 को numa_miss, बैंडविड्थ, रिमोट-एक्सेस काउंटर्स और माइग्रेशन्स के साथ सहसंबंधित (correlate) करूंगा। इसका समाधान थ्रेड्स और डेटा को संरेखित करना, वर्कलोड को शार्ड करना, पेज प्लेसमेंट को ट्यून करना या ऑटोमैटिक बैलेंसिंग को रोलबैक करना हो सकता है, जिसे एक रिवर्सिबल रोलआउट के साथ लागू किया जाएगा।"

चरण-दर-चरण विस्तृत उत्तर

हार्डवेयर और सॉफ्टवेयर टोपोलॉजी को मैप करें

नोड्स, CPUs, मेमोरी, PCIe डिवाइसेस और डिस्टेंस की जानकारी रिकॉर्ड करें। लिनक्स कर्नेल इंटरकनेक्ट द्वारा जुड़े NUMA सेल्स का वर्णन करता है: प्रत्येक CPU ग्लोबल मेमोरी को एड्रेस कर सकता है, लेकिन डिस्टेंस लेटेंसी और बैंडविड्थ को बदल देती है।

प्रोसेस और थ्रेड प्लेसमेंट की जांच करें

CPU एफिनिटी, cpusets, कंटेनर लिमिट्स और थ्रेड माइग्रेशन का निरीक्षण करें। नोड 0 पर चलने वाला थ्रेड जो बार-बार नोड 1 के पेजों को पढ़ रहा है, उसने लोकैलिटी खो दी है; थ्रेड-पूल स्केलिंग भी फर्स्ट-टच (first-touch) प्लेसमेंट को बदल सकती है।

पेज डिस्ट्रीब्यूशन और हिट स्टैटिस्टिक्स की जांच करें

numastat पसंदीदा नोड पर संतुष्ट हुए एलोकेशन्स के लिए numa_hit, उस प्राथमिकता का उपयोग न कर पाने वाले एलोकेशन्स के लिए numa_miss, और निष्पादित हो रहे CPU की लोकैलिटी से local_node/other_node की रिपोर्ट करता है। सिस्टम के कुल योग को सर्विस का प्रमाण मानने के बजाय प्रति-प्रोसेस डेटा और /proc/<pid>/numa_maps का निरीक्षण करें।

दोहराने योग्य A/B पॉलिसियाँ चलाएँ

इनपुट, थ्रेड काउंट और लोड को स्थिर रखते हुए डिफॉल्ट पॉलिसी, --cpunodebind और --membind फिक्स्ड पॉलिसियों और --interleave की तुलना करें। लोकल बाइंडिंग के साथ सुधार लोकैलिटी परिकल्पना का समर्थन करता है; इंटरलीविंग के साथ सुधार सिंगल-नोड बैंडविड्थ हॉटस्पॉट का संकेत दे सकता है।

ऑटोमैटिक NUMA बैलेंसिंग का मूल्यांकन करें

ऑटोमैटिक बैलेंसिंग एक्सेस पैटर्न्स को स्कैन करती है और पेजों को माइग्रेट कर सकती है। यह लंबे समय तक चलने वाली लोकैलिटी में सुधार कर सकती है, लेकिन स्कैनिंग और माइग्रेशन छोटे अनुरोधों या हाई चर्न (churn) के लिए जिटर (jitter) जोड़ सकते हैं। नियंत्रित टॉगल के तहत माइग्रेशन्स, फॉल्ट्स, स्कैन्स और रिक्वेस्ट टेल्स को मापें।

शेयर्ड डेटा और लॉक्स की जांच करें

शेयर्ड क्यू, एलोकेटर मेटाडेटा और क्रॉस-नोड लॉक्स रिमोट एक्सेस और कैश-लाइन कंटेंशन दोनों पैदा कर सकते हैं। केवल CPU बाइंडिंग से मदद नहीं मिल सकती है, इसलिए फॉल्स शेयरिंग या लॉक कंटेंशन को खारिज करने के लिए लॉक वेट, बैंडविड्थ और कैश-मिस काउंटर्स को सहसंबंधित करें।

डायग्नोस्टिक स्यूडोकोड

~~~text record topology, affinity, numa_maps, numastat, p99 run baseline with fixed workload for policy in [default, local_bind, interleave]: run same workload and collect latency, bandwidth, misses, migrations compare deltas and check confidence intervals apply the least invasive policy; keep rollback switch ~~~

जटिलता, जोखिम और सत्यापन

बाइंडिंग कोई जटिलता की समस्या नहीं है; जोखिम कम शेड्यूलिंग लचीलापन, नोड-लोकल मेमोरी की कमी और क्रॉस-नोड डिवाइस DMA हैं। कोल्ड स्टार्ट, स्थिर स्थिति (steady state), स्केलिंग, कंटेनर माइग्रेशन और नोड विफलताओं का परीक्षण करें। प्रत्येक परिवर्तन के लिए p50/p99, थ्रूपुट, बैंडविड्थ, मिसेज, माइग्रेशन्स और OOM संकेतों को ट्रैक करें।

साक्ष्य (Evidence)अर्थसंभावित अगला कदम
numa_miss / other_node का बढ़नाप्लेसमेंट और प्राथमिकता में भिन्नता हैएफिनिटी और मेमोरी पॉलिसी की जांच करें
बैंडविड्थ सीमा के करीब रिमोट एक्सेस का बढ़नाइंटरकनेक्ट एक बाधा (bottleneck) हैडेटा को शार्ड करें या प्लेसमेंट बदलें
माइग्रेशन्स और फॉल्ट्स का बढ़नाबैलेंसिंग या फर्स्ट-टच व्यवहार बदल गयावार्म-अप, पॉलिसी या लेआउट को ट्यून करें
लोकल बाइंडिंग से p99 में सुधारलोकैलिटी का कारणात्मक प्रमाण हैबाइंडिंग का कैनरी डिप्लॉयमेंट करें और निरीक्षण करें

मॉडल उत्तर

"NUMA गैर-समान दूरी (non-uniform distance) के साथ साझा एड्रेसेबिलिटी है: CPUs, मेमोरी और डिवाइसेस को नोड्स में समूहित किया जाता है, और लोकल एक्सेस आमतौर पर तेज़ होता है। मैं सबसे पहले टोपोलॉजी, प्रोसेस/थ्रेड एफिनिटी, कंटेनर cpusets, numastat -p और /proc/<pid>/numa_maps रिकॉर्ड करूंगा। फिर मैं डिफॉल्ट, CPU/मेमोरी-लोकल और इंटरलीव्ड पॉलिसियों के तहत समान वर्कलोड चलाऊंगा, जिसमें p99, बैंडविड्थ, रिमोट एक्सेस, numa_miss, माइग्रेशन्स और फॉल्ट्स एकत्र किए जाएंगे। यदि लोकल बाइंडिंग टेल लेटेंसी में सुधार करती है, तो पूल और डेटा शार्ड्स को नोड के अनुसार संरेखित करें; यदि एक नोड सैचुरेट हो जाता है, तो इंटरलीविंग या शार्डिंग पर विचार करें। ऑटोमैटिक बैलेंसिंग, शेयर्ड क्यू और लॉक कंटेंशन को अलग करने के लिए प्रयोगों का उपयोग करें, फिर रोलबैक थ्रेसहोल्ड के साथ एक रिवर्सिबल पॉलिसी शिप करें।"

सामान्य गलतियाँ

NUMA को केवल कम कुल मेमोरी के रूप में देखना

NUMA दूरी और बैंडविड्थ के बारे में है, केवल कुल क्षमता के बारे में नहीं। एक असंतुलित नोड लोकल OOM का सामना कर सकता है जबकि होस्ट के पास अन्यत्र अभी भी खाली मेमोरी उपलब्ध हो।

केवल CPU यूटिलाइज़ेशन को देखना

मेमोरी लेटेंसी, इंटरकनेक्ट बैंडविड्थ और स्टॉल्स किसी एक CPU प्रतिशत में स्पष्ट रूप से मैप नहीं होते हैं। टेल लेटेंसी, बैंडविड्थ और मेमोरी काउंटर्स एकत्र करें।

मेमोरी के बिना केवल CPUs को बाइंड करना

थ्रेड के स्थानांतरित होने के बाद फर्स्ट-टच और एलोकेशन पॉलिसी पेजों को कहीं और रख सकती है। CPU एफिनिटी और मेमोरी पॉलिसी को एक साथ सत्यापित करें।

एक मिस काउंटर के आधार पर बैलेंसिंग को अक्षम करना

शेयर्ड डेटा या मेमोरी प्रेशर के लिए मिसेज अपेक्षित हो सकते हैं। बैलेंसिंग को अक्षम करने से दीर्घकालिक लोकैलिटी खराब हो सकती है; एक नियंत्रित A/B चलाएं और माइग्रेशन लागत को मापें।

कंटेनरों और VMs को अनदेखा करना

होस्ट टोपोलॉजी, वर्चुअल NUMA, cpusets और डिवाइस प्लेसमेंट प्रोसेस व्यू से भिन्न हो सकते हैं। परिनियोजन (deployment) परत पर टोपोलॉजी को सत्यापित करें।

एक छोटे बेंचमार्क से निष्कर्ष निकालना

वार्म-अप, माइग्रेशन, कैश और लोड का स्वरूप NUMA को प्रभावित करते हैं। बार-बार परीक्षणों के साथ स्थिर स्थिति (steady state), पीक और मेमोरी रिक्लेमेशन को कवर करें।

फॉलो-अप प्रश्न और उत्तर

NUMA स्केलेबिलिटी में सुधार कैसे कर सकता है?

प्रत्येक नोड लोकल मेमोरी बैंडविड्थ का योगदान देता है, जिससे कुल बैंडविड्थ को नोड्स के बीच स्केल करने की अनुमति मिलती है। इसका नकारात्मक पहलू यह है कि सॉफ्टवेयर को लोकैलिटी बनाए रखनी चाहिए।

numa_hit और local_node के बीच क्या अंतर है?

numa_hit प्रोसेस के पसंदीदा नोड पर आधारित है; local_node CPU के लोकल नोड पर आधारित है। मेमोरी पॉलिसी उनके सिग्नल्स को भिन्न बना सकती है।

आप इंटरलीविंग का उपयोग कब करेंगे?

इसका उपयोग तब करें जब वर्किंग सेट व्यापक रूप से साझा किया गया हो, एक नोड की बैंडविड्थ अपर्याप्त हो, या थ्रेड्स को पेजों के साथ जोड़ना अव्यावहारिक हो। यह सिंगल-एक्सेस लेटेंसी को कम नहीं भी कर सकता है।

आप फर्स्ट-टच (first touch) को कैसे संभालते हैं?

उन पेजों को उन्हीं थ्रेड्स से वार्म करें जो उनका उपयोग करेंगे, या एक स्पष्ट मेमोरी पॉलिसी लागू करें। अन्यथा इनिशियलाइज़र प्लेसमेंट निर्धारित कर सकता है।

क्या पेज माइग्रेशन हमेशा अच्छा होता है?

माइग्रेशन लोकैलिटी में सुधार कर सकता है लेकिन बैंडविड्थ की खपत करता है और रुकावटें पैदा करता है। केवल माइग्रेशन्स को अधिकतम करने के बजाय माइग्रेशन लागत, एक्सेस लाभ और टेल लेटेंसी की तुलना करें।

आप निदान को कैसे लागू (ship) करते हैं?

एक रिवर्सिबल स्टार्टअप या पॉलिसी स्विच को कैनरी के रूप में रोल आउट करें। p99, नोड हेडरूम, रिमोट एक्सेस, माइग्रेशन्स और OOM के लिए थ्रेसहोल्ड सेट करें, और साक्ष्य स्वस्थ रहने के बाद ही इसका विस्तार करें।

सार्वजनिक स्रोत

संबंधित प्रश्न