जेनकिंस CI - मेमोरी आवंटित नहीं कर सकता


9

मैंने अपने स्थानीय कंप्यूटर पर ubuntu 10.4 (vmware संलयन के साथ) पर सफलतापूर्वक जेनकिंस-सीआई का परीक्षण किया। अब मैं इसे अपने वर्चुअल सर्वर पर hosteurope पर स्थापित और उपयोग करना चाहता हूं। मूल स्थापना कोई समस्या नहीं थी, लेकिन अब मुझे अपनी बिल्ड परियोजना के साथ समस्या है।

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

"Buildfile: /var/lib/jenkins/workspace/concrete5-seed-clean/build.xml [प्रॉपर्टी] java.io.IOException: प्रोग्राम नहीं चला सकता" / usr / bin / env ": java.io.IOException: error = 12, मेमोरी आवंटित नहीं कर सकता है "

Hosteurope ( http://faq.hosteurope.de/index.php?cpid=13918 ) पर वर्चुअल सर्वर पर ढेर आकार के साथ एक ज्ञात समस्या है , इसलिए मैंने मैन्युअल रूप से ढेर आकार सेट करने की कोशिश की:

# for ant
export ANT_OPTS="-Xms512m -Xmx512m"

# jenkins
# edited /etc/default/jenkins, added line 
JAVA_ARGS="-Xms512m -Xmx512m"
# restarted jenkins via /etc/init.d/jenkins restart 

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

सर्वर-विवरण: - http://www.hosteurope.de/produkt/Virtual-Server-Linux-L

  • उबंटू 10.4 एलटीएस
  • RAM: 1GB / डायनामिक 2GB

मेरे सवाल: - क्या जेनकिन्स के लिए 1GB पर्याप्त है या मुझे सर्वर को अपग्रेड करना है? - क्या यह त्रुटि चींटी या जेनकींस के कारण हुई है?

अद्यतन: मुझे यह चींटी विकल्पों के साथ चल रहा है -Xmx128m -Xms128m, लेकिन कभी-कभी त्रुटि फिर से होती है। (यह मुझे बाहर निकालता है, क्योंकि मैं अब तक इसे पुन: पेश नहीं कर सकता: /)

बहुत सराहना की मदद करो!

चीयर्स, मैथियस


मैंने इसे सेट जेनकिन्स कॉन्फिग फाइल्स द्वारा हल किया: JENKINS_JAVA_OPTIONS = "- Djava.awt.headless = true -Xms500m -Xmx1000m"
herbertD

जवाबों:


10

ओरिएन सही है, यह कांटा है () सिस्टमबेल या रंटिम.एक्सईके द्वारा शुरू किया गया सिस्टम कॉल या जेवीएम के अन्य साधनों को एक बाहरी प्रक्रिया निष्पादित करना (जैसे कि एक और जेवीएम चींटी चींटी, एक गिट कमांड, आदि)।

इस बारे में जेनकिंस की मेलिंग सूचियों पर कुछ पोस्ट किए गए हैं: प्रोग्राम "git" नहीं चला सकता ... त्रुटि = 12, मेमोरी आवंटित नहीं कर सकता

SCON देव सूची पर मुद्दे का एक अच्छा वर्णन है: कांटा () + निष्पादन () बनाम posix_spawn)

समाधान के साथ एक लंबे समय तक खड़ी जेवीएम बग रिपोर्ट है: पसीने की थकावट से बचने के लिए एस 10 पर पॉज़िक्स_स्पॉट का उपयोग करें । लेकिन मुझे यकीन नहीं है कि यह वास्तव में JDK7 में बना है क्योंकि टिप्पणियों का सुझाव योजना था।

सारांश में, यूनिक्स जैसी प्रणालियों पर, जब एक प्रक्रिया (जैसे JVM) को एक और प्रक्रिया शुरू करने की आवश्यकता होती है (जैसे git) एक सिस्टम कॉल किया जाता है, fork()जो प्रभावी रूप से वर्तमान प्रक्रिया को दोहराता है और इसकी सभी मेमोरी (लिनक्स और अन्य इसे कॉपी के साथ अनुकूलित करते हैं) -ऑन-राइट इसलिए मेमोरी को वास्तव में कॉपी नहीं किया जाता है जब तक कि बच्चा इसे लिखने का प्रयास नहीं करता है)। डुप्लिकेट प्रक्रिया तब एक और सिस्टम कॉल करती है, exec()दूसरी प्रक्रिया (जैसे git) को लॉन्च करने के लिए, जिस पर सभी मूल प्रक्रिया से कॉपी की गई मेमोरी को ऑपरेटिंग सिस्टम द्वारा छोड़ा जा सकता है। यदि मूल प्रक्रिया बड़ी मात्रा में मेमोरी का उपयोग कर रही है (जैसा कि जेवीएम प्रक्रियाएं करते हैं), तो कॉल fork()विफल हो सकती है यदि ऑपरेटिंग सिस्टम यह निर्धारित करता है कि उसके पास दो मेमोरी रखने के लिए पर्याप्त मेमोरी + स्वैप नहीं है, भले ही बच्चा प्रक्रिया वास्तव में कभी न हो। उस कॉपी की गई मेमोरी का उपयोग करें।

कई समाधान हैं:

  • मशीन में अधिक भौतिक मेमोरी / रैम जोड़ें।

  • fork()काम करने के लिए और अधिक स्वैप स्पेस जोड़ें , भले ही स्वैप स्पेस को किसी चीज की सख्त जरूरत न हो। यह मेरे द्वारा चुना गया समाधान है क्योंकि इसमें स्वैपफाइल जोड़ना काफी आसान है, और मैं ओवरकम के कारण होने वाली प्रक्रियाओं के लिए क्षमता के साथ नहीं जीना चाहता था।

  • लिनक्स पर, overcommit_memoryvm सिस्टम ( / proc / sys / vm / overcommit_memory ) का विकल्प सक्षम करें । Overcommit के साथ, कॉल fork()हमेशा सफल होगी, और चूंकि चाइल्ड प्रोसेस वास्तव में मेमोरी की उस कॉपी का उपयोग नहीं करने वाला है, इसलिए सब ठीक है। बेशक, यह संभव है कि ओवरकमिट के साथ, आपकी प्रक्रिया वास्तव में उपलब्ध की तुलना में अधिक मेमोरी का उपयोग करने का प्रयास करेगी और कर्नेल द्वारा मार दी जाएगी। यह उपयुक्त है या नहीं यह मशीन के अन्य उपयोगों पर निर्भर करता है। मिशन क्रिटिकल मशीनों को संभवत: बाहर चल रहे स्मृति हत्यारे को जोखिम में नहीं डालना चाहिए। लेकिन एक आंतरिक विकास सर्वर जो कुछ डाउनटाइम खर्च कर सकता है, वह ओवरकमिट को सक्षम करने के लिए एक अच्छी जगह होगी।

  • JVM बदले का उपयोग नहीं करने के लिए fork()+ exec()लेकिन उपयोग करने के लिए posix_spawn()जब उपलब्ध। यह ऊपर JVM बग रिपोर्ट में अनुरोधित समाधान है और SCons मेलिंग सूची में उल्लिखित है। यह java_posix_spawn में भी लागू किया गया है

    मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या उस फिक्स ने इसे JDK7 में बनाया है। यदि नहीं, तो मुझे आश्चर्य है कि अगर जेनकींस के लोग java_posix_spawn जैसे किसी काम में दिलचस्पी लेंगे। लगता है कि अपाचे कॉमन्स-एक्ज़ीक्यूट में एकीकृत करने के प्रयास किए गए हैं ।

    प्रोग्राममेरीफ़, मुझे 100% यकीन नहीं है, लेकिन आपका लिंक बताता है कि फिक्स JDK7 और JDK6 1.6.0_23 और बाद में है। रिकॉर्ड के लिए, मैं OpenJDK 1.6.0_18 चला रहा था।

Https://stackoverflow.com/questions/1124771/how-to-solve-java-io-ioexception-error-12-cannot-allocate-memory-calling-run देखें


अलग जवाब के लिए धन्यवाद! संबंधित पोस्ट में अल्फ़ होगमार्क का कहना है कि यह अब तय हो गया है: ( stackoverflow.com/a/9127548/809939 ) क्या कोई इसकी पुष्टि कर सकता है? मैं अपने जावा संस्करण को भी अपडेट करने की कोशिश करूंगा।
प्रोग्राममेरीफ

अतिरिक्त प्रश्न: आप क्या प्रस्ताव देंगे? ओवरकमिट-मेमोरी-स्थापना? सादर, माथियास
प्रोग्राममेरीफ़

1
स्वैफाइल जोड़ना आसान और सीधा-आगे है। उबंटू 12.04 के लिए (हालांकि यह सामान्य रूप से लिनक्स में बड़े पैमाने पर लागू होना चाहिए), यह आलेख सरल था: digitalocean.com/community/articles/…
davemyron

1

अपवाद संदेश पर ध्यान दें: Cannot run program "/usr/bin/env": java.io.IOException: error=12, Cannot allocate memory"जावा प्रक्रिया कमांड को चलाने के लिए एक नई प्रक्रिया के लिए प्रयास कर रही है, /usr/bin/envलेकिन एक नई प्रक्रिया बनाने के लिए ऑपरेटिंग सिस्टम मेमोरी संसाधनों से बाहर चला गया है। यह जावा वीएम मेमोरी से बाहर चलने के समान नहीं है, इसलिए -Xmx झंडे के साथ फ़िडलिंग की कोई भी राशि इसे ठीक नहीं करेगी। आपको अपने निर्माण को चलाते समय अपने स्मृति संसाधनों पर नजर रखने की आवश्यकता होगी। स्वैप स्पेस बढ़ाने से आपकी समस्या ठीक हो जाएगी।


यह जावा वर्चुअल मशीन (ढेर में से एक या स्टैक) है जो मेमोरी से बाहर है मेजबान कंप्यूटर सिस्टम नहीं।
mdpc 22

मेरे मूल उत्तर की संक्षिप्तता का बहाना करो। मैंने यह वर्णन करने के लिए इसे अपडेट किया है कि यह मेमोरी से बाहर चलने वाला जेवीएम क्यों नहीं है।
orien

0

यह संभावना है कि ANT_OPTS जेनकिन्स द्वारा ओवरराइड किया गया हो। आप अपनी बिल्ड फ़ाइल में सीधे विकल्प भी सेट कर सकते हैं ताकि आप पर्यावरण से स्वतंत्र रूप से मेमोरी आवंटन को नियंत्रित कर सकें (शेल, जेनकिंस, ...)। अपनी बिल्ड फ़ाइल में (उदाहरण:

<java fork="true" classname="..." >
    <jvmarg line="-Xms512M -Xmx512M" />
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.