2017-04-10 10 views
10

अपेक्षाकृत छोटी छवि (2 एमबी) को परिवर्तित करते समय मुझे फायरबेस के लिए क्लाउड फ़ंक्शंस से स्पोरैडिक त्रुटि मिल रही है। सफल होने पर, फ़ंक्शन को समाप्त करने के लिए केवल 2000ms या उससे कम समय लगता है, और छवि मैजिक दस्तावेज़ीकरण के अनुसार मुझे किसी भी समस्या को नहीं देखना चाहिए।मेमोरी सीमा के कारण मारे गए फायरबेस के लिए क्लाउड फ़ंक्शन

मैंने कमांड के लिए बफर आकार बढ़ाने की कोशिश की, जो कि फायरबेस के भीतर से अनुमति नहीं देता है, और मैंने .spawn() के विकल्प खोजने की कोशिश की क्योंकि इसे कचरा और धीमी चीजों से नीचे लोड किया जा सकता है। कुछ भी काम नहीं करता है।

उत्तर

15

[अपडेट] एक टिप्पणीकर्ता के रूप में सुझाव दिया गया है, यह अब कोई मुद्दा नहीं होना चाहिए, क्योंकि फ़ायरबेस फ़ंक्शन अब पुन: तैनाती पर अपनी सेटिंग्स को बनाए रखते हैं। धन्यवाद फायरबेस!

बाहर निकलता है, और यह स्पष्ट या दस्तावेज नहीं है, तो आप Google Functions Console में अपने कार्यों में स्मृति आवंटन बढ़ा सकते हैं। आप लंबे समय तक चलने वाले कार्यों के लिए टाइमआउट भी बढ़ा सकते हैं। इसने स्मृति अधिभार के साथ समस्या हल की और अब सबकुछ बढ़िया काम कर रहा है।

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

+0

मैं स्मृति अल बढ़ाने के लिए जगह नहीं पा सके मेरे कार्यों के लिए स्थान। मैं कंसोल कंसोल में कहां जाना चाहिए? टी.के.एस! – Walucas

+0

@ वालुकास क्लाउड फ़ंक्शंस> {अपने फ़ंक्शन का नाम}> "संपादित करें" पर क्लिक करें> फिर "स्मृति आवंटन" में संख्या संपादित करें – Kirill

+0

फ़ंक्शन सेटिंग्स मेरे लिए फिर से रीसेट हो रही हैं। –

2

अपडेट: ऐसा लगता है कि वे अब पुनः तैनाती पर सेटिंग्स को सुरक्षित रखते हैं ताकि आप क्लाउड कंसोल में मेमोरी आवंटन को सुरक्षित रूप से बदल सकें!

+0

ओह, अच्छी खबर! कुछ भी तोड़ने से बचने के लिए, मैंने थोड़ी देर के लिए फिर से तैनात नहीं किया है। इसे एक परीक्षण परियोजना पर आज़माएगा। यह बहुत अच्छा है अगर यह फिर से काम कर रहा है! – Kirill

+0

अद्यतन: यह हर बार उन्हें मेरे लिए रीसेट कर रहा है (और तैनाती में विफल रहा है क्योंकि स्मृति सीमा __ को तैनात कर दी गई है, जो एक अजीब चिकन और अंडे की समस्या पैदा करती है)। –

10

मैं यूआई में खो गया था, स्मृति को बदलने के लिए किसी भी विकल्प नहीं मिल सकता है, लेकिन अंत में पाया यह:

  1. Google क्लाउड कंसोल (Firebase सांत्वना नहीं)
  2. का चयन करने के लिए जाओ Cloud Functions मेनू में
  3. अब यदि आप सही हैं तो आप यहां अपने फायरबेस फ़ंक्शन को देखते हैं। अन्यथा जांच करें कि आपने सही परियोजना का चयन किया है या नहीं।
  4. सभी चेकबॉक्स, बटन और मेनू आइटम को अनदेखा करें, बस फ़ंक्शन पर क्लिक करें।
  5. संपादन (शीर्ष मेनू) पर क्लिक करें और केवल आवंटित स्मृति बदलें और सहेजें पर क्लिक करें।

सादर, पीटर

0

यह Firebase बादल कार्य में डिफ़ॉल्ट ImageMagick संसाधन config वास्तविक स्मृति समारोह के लिए आवंटित से मेल नहीं खाता है। - डिफ़ॉल्ट ImageMagick उदाहरण सोचता है कि यह 2GB है और इसलिए डिस्क से बफर आवंटित नहीं करता

File  Area   Memory  Map  Disk Thread Throttle  Time 
-------------------------------------------------------------------------------- 
18750 4.295GB  2GiB  4GiB unlimited  8   0 unlimited 

डिफ़ॉल्ट स्मृति एक FCF के लिए आवंटित 256MB है:

एक Firebase बादल समारोह पैदावार के संदर्भ में identify -list resource चल रहा है और Error: memory limit exceeded. Function killed.

एक तरीका है जैसा कि ऊपर सुझाए गए अनुसार आवश्यक स्मृति को बढ़ाने का एक तरीका है - हालांकि अभी भी जोखिम है आईएम आपके उपयोग के मामले और आउटलाइर्स के आधार पर आवंटित करने का प्रयास करेगा।

सुरक्षित अभी तक -limit memory [your limit] का उपयोग कर छवि मैनिपुलेशन प्रक्रिया के हिस्से के रूप में आईएम को सही मेमोरी सीमा निर्धारित करना होगा।आप अपने आईएम लॉजिक को '-debug कैश' के साथ चलाकर अपने लगभग मेमोरी उपयोग को समझ सकते हैं - यह आपको आवंटित सभी बफर, उनके आकार और यदि वे स्मृति या डिस्क थे, दिखाएंगे।

यदि आईएम मेमोरी सीमा को हिट करता है तो यह डिस्क पर बफर आवंटित करना शुरू कर देगा (मेमोरी मैप किए गए और फिर नियमित डिस्क बफर। आपको आई/ओ प्रदर्शन बनाम मेमोरी लागत के बीच अपनी विशिष्ट शेष राशि पर विचार करना होगा। प्रत्येक अतिरिक्त बाइट की कीमत स्मृति आप अपने FCF आवंटित उपयोग के 100ms से गुणा किया जाता -।। ताकि जल्दी से बढ़ सकता है

0

यहाँ एक अन्य विकल्प .spawn() का उपयोग पूरी तरह से बचने के लिए किया जाएगा

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

वैकल्पिक रूप से, ImageMagick (और GraphicsMagick) के लिए एक नोड रैपर है जिसे gm कहा जाता है। यह आईएम को आपकी संसाधन सीमाओं की रिपोर्ट करने के लिए -limit विकल्प का भी समर्थन करता है।

+0

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

+1

आपको कुछ नई स्थानीय परीक्षण सुविधाओं को देखना चाहिए जो अभी जोड़े गए थे। अब आप स्थानीय रूप से ट्रिगर किए गए कार्यों का परीक्षण करते हैं और उन पर इकाई परीक्षण चलाते हैं। https://firebase.google.com/docs/functions/local-emulator#invoke_storage_and_auth_functions – Kiana

2

नवीनतम फायरबेस डिप्लॉय कमांड डिफ़ॉल्ट 256 एमबी और 60 के दशक तक टाइमआउट तक स्मृति आवंटन को ओवरराइट करता है।

वैकल्पिक रूप से, वांछित स्मृति आवंटन और अधिकतम समय समाप्ति निर्दिष्ट करने के लिए, मैं gcloud आदेश का उपयोग करें जैसे:

gcloud बीटा कार्यों YourFunctionName --memory = 2048MB --timeout = 540s

तैनात अन्य विकल्प देखें करने के लिए:

https://cloud.google.com/sdk/gcloud/reference/beta/functions/deploy

संबंधित मुद्दे