लैम्ब्डा इंटर्नल - पार्ट 2: गोइंग डेपर

AWS लाम्बा रनटाइम लाइब्रेरीज़ की खोज करना

जिम ब्यूडॉइन द्वारा फोटो

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

पिछले लेख में हमें लैंबडा कंटेनर में एक शेल मिला, लैंबडा रनटाइम वातावरण डाउनलोड किया और इसके घटकों की खोज की:

  • bootstrap.py - python कोड हमारे हैंडलर को लपेटता है।
  • awslambda / runtime.so - एक पायथन-संगत साझा ऑब्जेक्ट बूटस्ट्रैप थिएरो इसके लिए उपयोग करता है, ठीक है, बहुत अच्छी तरह से सब कुछ।
  • liblambda * .so - अपनी बारी में, runtime.so अन्य साझा वस्तुओं का उपयोग करता है। हम लंबोदर लॉरेंडा के प्रबंधन में भारी भार उठाने के आरोप में liblambdaruntime.so पर ध्यान केंद्रित करेंगे।

हमें बूटस्ट्रैप थिंकपैड के साथ कुछ मज़ेदार गड़बड़ करनी थी। इस बार हम अपनी आस्तीन ऊपर चढ़ाने जा रहे हैं और लैंबडा रनटाइम वातावरण के बाइनरी लाइब्रेरी में गोता लगाने जा रहे हैं। हम लैम्ब्डा के बिलिंग सिस्टम का पता लगाएंगे और (स्पॉइलर अलर्ट) में लैम्ब्डा टाइमआउट के साथ कुछ मज़ेदार गड़बड़ियाँ हैं।

पुस्तकालयों की खोज

पुस्तकालयों (liblambda * .so) को प्रतीकों के साथ संकलित किया जाता है, इसलिए आप केवल प्रतीकों के नामों पर जाकर पुस्तकालयों के बारे में बहुत कुछ जान सकते हैं। इसके अलावा, runtime.so इन कार्यों के बहुत सारे आयात और उन्हें लपेटकर उजागर करता है, इसलिए पायथन स्क्रिप्ट (हमारे मामले में बूटस्ट्रैप एरो) उनमें से कुछ का उपयोग कर सकती है। कितना सुविधाजनक!

आंशिक कार्य सूची liblambdaruntime.so disassembly से। प्रतीकों के लिए भगवान का शुक्र है।

जिन चीज़ों के लिए मैं शुरू में वास्तव में जाँच करना चाहता था, उनमें से एक लैम्ब्डा की बिलिंग प्रणाली के दृश्यों के पीछे थी, और केवल फ़ंक्शन के नामों को देखकर, मेरे पास कुछ प्रयोग थे जिन्हें मैं आज़माना चाहता था। लेकिन पहले - लेम्बडा बिलिंग के बारे में थोड़ा बात करते हैं।

लंबोदर बिलिंग

लैंबडा का एक समय-आधारित मूल्य निर्धारण मॉडल है, और सभी विवरणों में जाने के बिना, इसका सार यह है कि आपके लैम्ब्डा को चलने में जितना अधिक समय लगेगा, आप उतना ही अधिक भुगतान करेंगे। एक लैम्ब्डा का उपयोग करते समय, आप क्लाउडवॉच लॉग्स में इसकी शुरुआत और अंत आसानी से कर सकते हैं, साथ ही इसकी अवधि और बिल की अवधि भी।

CloudWatch एक लैम्ब्डा के लिए लॉग करता है। आप लैम्ब्डा की अवधि और बिल की अवधि दोनों देख सकते हैं

हालाँकि, अधिक जटिल परिदृश्य है। निम्नलिखित लैम्ब्डा पर विचार करें:

एक ठेठ रन पर, इस लम्बे की अवधि छोटी होनी चाहिए (बिल की अवधि लगभग हमेशा 100 एमएस होनी चाहिए)। लेकिन पहले आह्वान पर क्या होता है? या ठंड शुरू होने पर (जहां मॉड्यूल फिर से आयात किया जाता है)?

ठंड शुरू होने पर लाम्बा लॉग होते हैं। एक नियमित आह्वान की तुलना में अवधि बहुत अधिक है

अनुभवजन्य परीक्षणों से पता चलता है कि पहले लैंबडा आह्वान (या ठंड शुरू) की अवधि में आरंभीकरण अवधि शामिल है। लेकिन मैं यह जाँचना चाहता था कि लैम्बडा इसे कैसे लागू करता है।

पुस्तकालयों का आयात करना

Bootstrap.py में, द्विआधारी पुस्तकालयों से आयातित निम्नलिखित कार्यों के लिए कॉल हैं:

  • lambda_runtime.receive_start () या lambda_runtime.receive_invoke () - जब एक नया ट्रिगर प्राप्त होता है।
  • lambda_runtime.report_done () -जब भी एक लैम्ब्डा किया जाता है

अब मैं पिछले लेख में जिस स्लाइसर का जिक्र कर रहा था, उसके बारे में कुछ और जानकारी देने का एक अच्छा समय हो सकता है। स्लाइसर लैंबडा में एक घटक है जो कंटेनर पर चल रहे विभिन्न उपयोगकर्ता लैंबडास को रनटाइम आवंटित करने के लिए है। जब लाम्बा निष्पादन किया जाता है या नए आरंभ किए गए निष्पादन के बारे में जानकारी प्राप्त करता है तो ये कार्य स्लाइसर (और अन्य लैंबडा प्रबंधन घटकों) को एक सूचना भेजते हैं।

इसलिए जब हमने lambda_runtime से कॉल्स की पहचान की, और यह जान लिया कि स्लाइसर क्या है, तो कुछ ऐसा था जिसे मैंने आजमाया था: खुद रनटाइम लाइब्रेरी आयात करना और उसके साथ कुछ मज़ेदार होना! (ये प्रयोग हैं कि कैसे मुझे स्लाइसर पर सामान मिला, ज्यादातर डिसएस्पेक्शन और कुछ परीक्षण और त्रुटि को पढ़कर)। जो परीक्षण मैं आपके साथ साझा करना चाहता हूं, वह पहला प्रयास भी है: मेरे लंबोदर के अंदर से lambda_runtime.report_done () कॉलिंग। यह वह कोड है जिसका मैंने उपयोग किया है:

मुझे जो आश्चर्यजनक बात लगी, वह यह थी कि इस उदाहरण को चलाते समय, "कोडिंग" को केवल प्रिंट करने के बाद मेरा कोड बंद हो गया। फिर, जब मैंने अपने लम्बोदर को फिर से ट्रिगर किया, तो उसने इसके निष्पादन को फिर से शुरू कर दिया, जहाँ से हमने छोड़ा था - और "पहले काम के बाद" मुद्रित किया! (मैंने नींद को जोड़ा क्योंकि कभी-कभी मेरा लैम्ब्डा एक "प्रिंट" खींचने में कामयाब रहा, इससे पहले कि स्लासर ने इसे रोक दिया)। यह बार-बार हुआ जब तक लैंबडा निष्पादन समाप्त नहीं हुआ।

मेघवाड़ा मेम्ने के निष्पादन के लिए लॉगआउट करता है। ध्यान दें, हमारे पास एक ही लैम्बडा के लिए कई अनुरोध आईडी हैं!

तो इसने मेरे लिए यह निश्चित कर दिया - जब तक हमारे लम्बे समय के लिए सीपीयू का समय मिलता है, तब तक यह स्लाइसर हमें बिल देता है। इसका मतलब है कि हमारी बिल की अवधि दो भागों से बनी है:

  1. मॉड्यूल आरंभीकरण समय (केवल पहले आह्वान / ठंड शुरू होने पर)
  2. हमारी वास्तविक कार्य अवधि

लाम्बा टाइमआउट से बचना

बहुत शांत होने के अलावा, इस खोज में एक व्यावहारिक (अच्छी तरह से ... व्यावहारिक देखने वाले की नज़र में है, लेकिन यह निश्चित रूप से दिलचस्प है) का उपयोग करें: लैम्ब्डा टाइमआउट को संभालना! निम्नलिखित लैम्ब्डा पर विचार करें:

मैंने लैम्बडा को एक बार ट्रिगर किया, और यह लाइन 13. पर रुका। फिर मैंने कुछ समय इंतजार किया और इसे फिर से ट्रिगर किया। इसका परिणाम यह हुआ कि शेष समय संदर्भ ऑब्जेक्ट की विधि 0 पर वापस आ गया, लेकिन लैम्बडा ने समय नहीं निकाला! लैम्ब्डा का टाइमआउट रीसेट कर दिया गया क्योंकि यह एक अलग आह्वान है, और अब हमने अपने लैम्ब्डा के टाइमआउट (और हमारे एडब्ल्यूएस बिल, निश्चित रूप से) को दोगुना कर दिया है! इसके लिए एक उपयोगी मामला, उदाहरण के लिए, एक लूप हो सकता है जो कई रिकॉर्ड और कभी-कभी कई बार प्रक्रिया करता है। अब हम देख सकते हैं कि क्या हम एक टाइमआउट के निकट आ रहे हैं, और यदि ऐसा है तो lambda_runtime.report_done () को कॉल करें और अगले ट्रिगर के लिए प्रतीक्षा करें जहां से हम रुके थे!

क्लाउडवाच लैम्बडा इनवोकेशन से लॉग होता है। शेष समय: 0

इस मुद्दे पर काम करते समय मेरे साथ हुई एक और बात यह है कि AWS इस व्यवहार के आधार पर एक वास्तविक सुविधा की आपूर्ति कर सकता है, जहां एक उपयोगकर्ता अपने लैम्ब्डा को निलंबित कर सकता है और अपने अगले आह्वान में उसी स्थान से फिर से शुरू कर सकता है। यह न केवल डेटा की महत्वपूर्ण मात्रा को संसाधित करने और बीच में समय समाप्त करने के लिए उपयोगी हो सकता है। एक अन्य उपयोग का मामला, उदाहरण के लिए, अपने लैम्ब्डा के निष्क्रिय समय के लिए भुगतान करने के बजाय एक महंगे आईओ / कुछ अन्य कार्य परिणामों की प्रतीक्षा करते हुए, अपने लैम्ब्डा को निलंबित कर सकता है! क्या वे ऐसा करेंगे? पता नहीं क्या वह अल्ट्रा कूल है? Defo।

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

निष्कर्ष

हमने एडब्ल्यूएस लाम्बा इंटर्नल के बारे में बहुत कुछ सीखा है। हमने रनटाइम वातावरण और लैम्ब्डा बिलिंग सिस्टम में बाइनरी लाइब्रेरी की खोज की। हमने लैंबडा रनटाइम लाइब्रेरी का भी आयात किया, और इसका उपयोग टाइमआउट को संभालने के लिए किया! हालाँकि, AWS और अन्य विक्रेताओं पर अभी भी बहुत कुछ खोजा जाना बाकी है। आगे की चुनौतियों के लिए, अगर आपके पास कोई अनुरोध है - मुझे बताएं!

मैंने अपने द्वारा किए गए विभिन्न प्रयोगों से मुक्त स्रोत पुस्तकालय को भी अपडेट किया है, आशा है कि आप इसे उपयोगी पाएंगे!

यहाँ एप्सागन में हम सर्वर रहित अनुप्रयोगों के लिए एक निगरानी उपकरण दर्जी विकसित करते हैं। सर्वरहित का उपयोग करना और अधिक सुनने में रुचि? हमारी वेबसाइट पर पधारें!