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

Go कोडिंग इंटरव्यू: Go 1.25 कंटेनरों में GOMAXPROCS की गणना कैसे करता है?

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

प्रश्न

Go 1.25 कंटेनरों में GOMAXPROCS की गणना कैसे करता है?

प्रॉम्प्ट

एक Go सर्विस 64 लॉजिकल CPUs वाले नोड पर एक Kubernetes Pod में चलती है, जबकि Pod की CPU लिमिट 2.5 है। Go 1.25 में अपग्रेड करने के बाद, डिफ़ॉल्ट GOMAXPROCS, CPU requests के साथ इसके संबंध, क्या cgroup परिवर्तनों का पालन किया जाता है, और आप टेल लेटेंसी (tail latency), थ्रूपुट और GC व्यवहार को कैसे मान्य करेंगे, इसकी व्याख्या करें। बताएं कि मैन्युअल GOMAXPROCS या GODEBUG सेटिंग्स क्या डिसेबल करती हैं।

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

यह रनटाइम समवर्तीता (concurrency), कंटेनर रिसोर्स सिमेंटिक्स और परफॉर्मेंस डायग्नोसिस का परीक्षण करता है। लॉजिकल CPUs, CPU लिमिट्स, CPU requests, प्रोसेस एफिनिटी और GOMAXPROCS के बीच अंतर स्पष्ट करें। Go 1.25 Linux cgroup औसत CPU थ्रूपुट लिमिट को पढ़ता है और समय-समय पर डिफ़ॉल्ट को अपडेट करता है, लेकिन मैन्युअल ओवरराइड्स उस व्यवहार को डिसेबल कर देते हैं। आंशिक कोटा (fractional quotas), बर्स्ट लेटेंसी और रोलबैक पर विचार किए बिना केवल "इसे 2 पर सेट करें" कहना अधूरा है।

स्पष्टीकरण के प्रश्न

  1. किस Go वर्शन, Linux cgroup वर्शन और कंटेनर रनटाइम का उपयोग किया जा रहा है?
  2. क्या Pod एक CPU लिमिट, एक request, या दोनों सेट करता है, और क्या लिमिट बदल सकती है?
  3. क्या लक्ष्य थ्रूपुट, P99 लेटेंसी, GC पॉज़ या लागत है, और क्या बर्स्ट्स की उम्मीद है?
  4. क्या GOMAXPROCS पहले से ही किसी एनवायरनमेंट वेरिएबल, स्टार्टअप फ़्लैग या कोड द्वारा सेट है?

एक 30-सेकंड का फ्रेमवर्क

डिफ़ॉल्ट मान लॉजिकल CPUs, CPU एफिनिटी और cgroup औसत CPU थ्रूपुट लिमिट के न्यूनतम मान से निकाला जाता है; फ्रैक्शनल लिमिट्स को राउंड अप किया जाता है, और रनटाइम आमतौर पर 2 से कम का चयन नहीं करेगा जब तक कि मशीन या एफिनिटी में 2 से कम CPUs न हों। Requests का उपयोग नहीं किया जाता है। इसके बाद ओवरराइड प्राथमिकता, अपडेट्स, ऑब्ज़र्वेबिलिटी और रोलबैक को कवर करें।

चरण-दर-चरण डिज़ाइन

1. डिफ़ॉल्ट को समझें

बिना किसी GOMAXPROCS एनवायरनमेंट मान या runtime.GOMAXPROCS के कॉल के, Linux पर Go 1.25 cgroup CPU quota/period को एक औसत थ्रूपुट लिमिट के रूप में पढ़ता है। यह लॉजिकल CPUs और प्रोसेस एफिनिटी पर भी विचार करता है और आमतौर पर न्यूनतम मान चुनता है। 2.5 CPU की लिमिट राउंड अप होकर 3 हो जाती है। Request एक शेड्यूलिंग गारंटी है, कोई हार्ड थ्रूपुट लिमिट नहीं है, इसलिए इसका उपयोग इस डिफ़ॉल्ट के लिए नहीं किया जाता है।

2. अपडेट्स और ओवरराइड प्राथमिकता

रनटाइम समय-समय पर लॉजिकल CPU काउंट, एफिनिटी और cgroup कोटा परिवर्तनों की जांच करता है, आमतौर पर प्रति सेकंड एक बार से अधिक नहीं। GOMAXPROCS एनवायरनमेंट वेरिएबल सेट करने या runtime.GOMAXPROCS को कॉल करने से स्वचालित अपडेट्स डिसेबल हो जाते हैं; runtime.SetDefaultGOMAXPROCS() रनटाइम डिफ़ॉल्ट को रीस्टोर करता है। GODEBUG=containermaxprocs=0 cgroup लिमिट्स को अनदेखा करता है, जबकि updatemaxprocs=0 अपडेट्स को डिसेबल करता है।

3. इसे शेड्यूलिंग और थ्रॉटलिंग से जोड़ें

GOMAXPROCS Go यूज़र कोड के एक साथ निष्पादन (simultaneous execution) को सीमित करता है; यह कोई कंटेनर CPU कैप नहीं है और सिस्टम कॉल्स में ब्लॉक किए गए थ्रेड्स को सीमित नहीं करता है। CPU लिमिट से काफी अधिक मान कर्नेल थ्रॉटलिंग और टेल-लेटेंसी स्पाइक्स को ट्रिगर कर सकता है। बहुत कम मान थ्रूपुट और GC पैरेलेलिज़्म को कम कर सकता है। Kubernetes लिमिट्स, requests और नोड ओवरकमिट के साथ इसका विश्लेषण करें।

4. इंस्ट्रूमेंट और सत्यापित करें

स्टार्टअप पर runtime.GOMAXPROCS(0), runtime.NumCPU(), एफिनिटी, cgroup quota/period और GODEBUG रिकॉर्ड करें। /sched/gomaxprocs:threads, CPU थ्रॉटलिंग, रन कतार (run queue), P99, GC CPU अंश, थ्रूपुट और त्रुटियों को सहसंबद्ध (correlate) करें। लिमिट बदलने के बाद, केवल एक स्टार्टअप लॉग पर निर्भर रहने के बजाय यह सत्यापित करें कि GOMAXPROCS इसका अनुसरण करता है।

5. वर्कलोड प्रयोग चलाएं

समान Go वर्शन और डेटा पर, CPU-गहन, I/O-प्रतीक्षारत और बर्स्टी लघु-अनुरोध लोड के तहत डिफ़ॉल्ट, एक स्पष्ट मान और पिछले Go वर्शन की तुलना करें। स्थिर स्थिति और बर्स्ट्स को मापें। Go का मार्गदर्शन बताता है कि कम GOMAXPROCS थ्रॉटलिंग को कम कर सकता है, जबकि पैरेलेलिज़्म सीमित होने पर स्पाइकी वर्कलोड उच्च लेटेंसी देख सकते हैं। P95/P99 और लागत दोनों को ध्यान में रखकर निर्णय लें।

6. रोल आउट और रोल बैक

Go 1.25 को एक निश्चित लिमिट और स्पष्ट गेट्स के साथ कैनरी रोलआउट करें। यदि थ्रॉटलिंग, P99, या GC में गिरावट आती है, तो इमेज को रोल बैक करें या प्रयोगात्मक रूप से उचित स्पष्ट मान का उपयोग करें, यह दस्तावेज़ित करते हुए कि यह स्वचालित अपडेट्स को डिसेबल करता है। ओवरराइड को हटाने और SetDefaultGOMAXPROCS को कॉल करने से डिफ़ॉल्ट गणना रीस्टोर हो जाती है; कोटा परिवर्तन के बाद फिर से सत्यापित करें।

7. विफलता मोड और सीमाओं का उल्लेख करें

Request को लिमिट के रूप में, runtime.NumCPU() को उपलब्ध पैरेलेलिज़्म के रूप में, या cgroups को सार्वभौमिक न मानें। गैर-Linux सिस्टम, अनुपलब्ध कोटा, मैन्युअल सेटिंग्स और पुराने Go वर्शन्स में अंतर होता है। रिलीज़ चेकलिस्ट में Go वर्शन, GODEBUG, रिसोर्स स्पेसिफिकेशन्स और रोलबैक के मालिक को रिकॉर्ड करें।

एक मजबूत उत्तर का उदाहरण

"बिना किसी स्पष्ट ओवरराइड के, Linux पर Go 1.25 cgroup quota/period को पढ़ता है और उस थ्रूपुट लिमिट, लॉजिकल CPUs और एफिनिटी का न्यूनतम मान लेता है; 2.5 CPUs राउंड होकर 3 हो जाता है, और requests का उपयोग नहीं किया जाता है। रनटाइम समय-समय पर कोटा परिवर्तनों की जांच करता है, लेकिन एक एनवायरनमेंट मान, runtime.GOMAXPROCS, या GODEBUG=containermaxprocs=0/updatemaxprocs=0 व्यवहार को बदल देता है। मैं GOMAXPROCS, cgroup डेटा, /sched/gomaxprocs, थ्रॉटलिंग, P99, थ्रूपुट और GC को रिकॉर्ड करूंगा, फिर CPU-गहन और बर्स्टी लोड के तहत डिफ़ॉल्ट, स्पष्ट मानों और पुराने वर्शन की तुलना करूंगा। यदि कैनरी किसी गेट को पार करती है तो उसे रोल बैक किया जाता है, और ओवरराइड करते समय रनबुक स्वचालित अपडेट्स के नुकसान को रिकॉर्ड करती है।"

सामान्य विफलता मोड

  • यह दावा करना कि Go सीधे CPU requests का उपयोग करता है।
  • आंशिक कोटा और न्यूनतम नियम की व्याख्या किए बिना लिमिट को राउंड करना।
  • यह भूल जाना कि एनवायरनमेंट मान, कोड कॉल्स और GODEBUG स्वचालित अपडेट्स को डिसेबल करते हैं।
  • थ्रॉटलिंग, P99, GC और बर्स्ट लेटेंसी की अनदेखी करते हुए केवल थ्रूपुट मापना।
  • GOMAXPROCS को कंटेनर CPU कैप या सिस्टम-कॉल थ्रेड लिमिट मानना।

फॉलो-अप दिशाएं

2.5 CPUs 3 क्यों बन सकता है?

GOMAXPROCS एक सकारात्मक पूर्णांक है, इसलिए रनटाइम पूर्ण कोटा का उपयोग करने के लिए आंशिक थ्रूपुट लिमिट को राउंड अप करता है।

CPU request को क्यों बाहर रखा गया है?

Request एक सॉफ्ट शेड्यूलिंग गारंटी है जिसे क्षमता खाली होने पर पार किया जा सकता है; यह कोई स्थिर हार्ड थ्रूपुट सीमा नहीं है।

आप स्वचालित अपडेट्स को कैसे सत्यापित करते हैं?

cgroup कोटा बदलें और एनवायरनमेंट मान और GODEBUG सेटिंग्स की जांच करते हुए लॉग्स के साथ /sched/gomaxprocs:threads की निगरानी करें।

आप इसे मैन्युअल रूप से कब सेट करेंगे?

इसे तब सेट करें जब प्रयोग दिखाते हैं कि वर्कलोड, प्लेटफ़ॉर्म या लेटेंसी लक्ष्य द्वारा एक निश्चित पैरेलेलिज़्म की आवश्यकता है, और एक स्पष्ट रोलबैक कॉन्फ़िगरेशन बनाए रखें।

Go 1.24 के बारे में क्या?

एक ब्रिज के रूप में एक स्पष्ट मान या cgroup-सचेत अनुकूलता दृष्टिकोण का उपयोग करें, फिर Go 1.25 में अपग्रेड करने के बाद लिमिट्स, एफिनिटी और थ्रॉटलिंग का पुनः परीक्षण करें।

संदर्भ

Go 1.25 "Release Notes", Go Blog "Container-aware GOMAXPROCS", और pkg.go.dev "runtime"।

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

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

संबंधित इंटरव्यू टूल

कोडिंग प्रॉम्प्ट के लिए स्क्रीनशॉट का उपयोग करें

समस्या को कैप्चर करें, फिर क्रम से प्रतिबंधों (constraints), समाधान, कोड, एज केस और जटिलता पर काम करें।

टूल देखें