हमने हाल ही में अपने प्रोडक्शन के माहौल को कुबेरनेट्स में बदल दिया है। मैं कंटेनरों पर सीपीयू सीमा लागू करना चाहता हूं। मुझे परस्पर विरोधी CPU मेट्रिक्स मिल रहे हैं जो एक साथ फिट नहीं होते हैं। यहाँ मेरा सेटअप है:
- DataDog एजेंट एक के रूप में चल रहे हैं
Daemonset
- सीपीयू सीमा के बिना चल रहे मौजूदा अनुप्रयोग
- प्रश्न में कंटेनर रूबी अनुप्रयोगों के बहु-थ्रेडेड हैं
- दो मैट्रिक्स:
kubernetes.cpu.usage.{avg,max}
औरdocker.cpu.usage
c4.xlarge
क्लस्टर नोड्स (4 vCPU या Kubernetes शब्दों में 4000 मी)
kubernetes.cpu.usage.max
प्रश्न में कंटेनरों के लिए रिपोर्ट ~ 600 मी। docker.cpu.usage
रिपोर्ट ~ 60% यह निम्नानुसार है कि 1000 मीटर सीपीयू सीमा सामान्य ऑपरेशन के तहत पर्याप्त क्षमता से अधिक होगी।
मैंने 1000 मी की सीमा तय की। तब docker.container.throttles
काफी ऊपर जाता है kubernetes.cpu.usage.max
और docker.cpu.usage
वही रहता है। सिस्टम इस समय घुटने के बल गिर गया। इससे मुझे कोई मतलब नहीं है।
मैंने डॉकर आँकड़ों पर शोध किया। ऐसा लगता है कि docker stats
(और अंतर्निहित एपीआई) सीपीयू कोर के अनुसार लोड को सामान्य करता है। तो मेरे मामले में, docker.cpu.usage
60% (4000m * 0.60) से 2400m तक कुबेरनेट की शर्तों में आता है। हालाँकि यह किसी भी कुबेरनेट संख्या के साथ संबंध नहीं रखता है। मैंने अपनी परिकल्पना का परीक्षण करने के लिए एक और प्रयोग किया कि कुबेरनेट्स संख्या गलत हैं। मैंने 2600 मीटर (कुछ अतिरिक्त हेडरूम के लिए) सीमा निर्धारित की है। यह किसी भी गला घोंटना में परिणाम नहीं हुआ। हालांकि कुबेरनेट्स ने देखा कि सीपीयू का उपयोग नहीं बदला। यह मुझे भ्रमित करता है।
तो मेरे सवाल हैं:
- क्या यह कुबेरनेट्स में एक बग की तरह महसूस करता है (या स्टैक में कुछ?)
- क्या मेरी समझ सही है?
मेरा अनुवर्ती प्रश्न रूबी अनुप्रयोगों के लिए सीपीयू को ठीक से निर्धारित करने से संबंधित है। एक कंटेनर प्यूमा का उपयोग करता है। यह एक बहु-थ्रेडेड वेब सर्वर है जिसमें थ्रेड्स की विन्यास योग्य मात्रा है। HTTP अनुरोधों को थ्रेड्स में से एक द्वारा नियंत्रित किया जाता है। थ्रेडेड सर्वर का उपयोग करके दूसरा एप्लिकेशन एक थ्रिफ्ट सर्वर है। प्रत्येक आने वाले टीसीपी कनेक्शन को स्वयं थ्रेड द्वारा नियंत्रित किया जाता है। कनेक्शन बंद होने पर थ्रेड बाहर निकल जाता है। रूबी को जीआईएल (ग्लोबल इंटरप्रेटर लॉक) के रूप में देखा जा सकता है, ताकि एक बार में केवल एक धागा रूबी कोड को निष्पादित कर सके। यह IO को निष्पादित करने वाले कई थ्रेड्स और उस जैसी चीजों के लिए अनुमति देता है।
मुझे लगता है कि सबसे अच्छा तरीका प्रत्येक एप्लिकेशन में चलने वाले थ्रेड्स की संख्या को सीमित करना और थ्रेड्स की संख्या के आधार पर कुबेरनेट्स सीपीयू की सीमाएं लगाना है। प्रक्रियाएँ जाली नहीं हैं इसलिए कुल सीपीयू उपयोग की भविष्यवाणी करना कठिन है।
यहां सवाल यह है कि इन अनुप्रयोगों के लिए सीपीयू के उपयोग और सीमाओं का ठीक से अनुमान कैसे लगाया जाए?