জেনকিনস সিআই - মেমরি বরাদ্দ করতে পারে না


9

আমি আমার স্থানীয় কম্পিউটারে একটি উবুন্টু 10.4 (ভিএমওয়্যার ফিউশন সহ) সাফল্যের সাথে জেনকিনস-সিআই পরীক্ষা করেছি। এখন আমি এটি হোস্টেওরোপে আমার ভার্চুয়াল সার্ভারে ইনস্টল করে ব্যবহার করতে চাই। বেসিক ইনস্টলেশনটি কোনও সমস্যা ছিল না, তবে এখন আমার বিল্ড প্রকল্পে আমার সমস্যা আছে।

একটি সংগ্রহস্থল থেকে একটি মিউরিয়াল আপডেট টান দেওয়ার পরে, পিপীলিকাটি আমার অনুরোধ প্রকল্পে নিম্নলিখিত ত্রুটিটি নিক্ষেপ করা হয়:

"বিল্ডফায়াল: /var/lib/jenkins/workspace/concret5-seed-clean/build.xml [সম্পত্তি] java.io.IOEception: প্রোগ্রাম চালানো যায় না" / usr / bin / env ": java.io.IOException: error = 12, মেমরি বরাদ্দ করা যায় না "

হোস্টেওরোপে ভার্চুয়াল সার্ভারগুলিতে ( 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/ ভার্চুয়াল- সার্ভার- লিনাক্স- এল

  • উবুন্টু 10.4 এলটিএস
  • র‌্যাম: 1 জিবি / ডায়নামিক 2 জিবি

আমার প্রশ্নসমূহ: - জেনকিন্সের জন্য 1 জিবি যথেষ্ট নাকি আমাকে সার্ভার আপগ্রেড করতে হবে? - এই ত্রুটিটি পিঁপড়া বা জিনকিনসের কারণে ঘটেছে?

আপডেট: আমি এটি পিঁপড়া বিকল্পগুলি -Xmx128m -Xms128m দিয়ে চলতে পেয়েছি, তবে কখনও কখনও আবার ত্রুটি ঘটে। (এটি আমাকে প্রকাশ করে দেয়, কারণ আমি এখনই এটি পুনরুত্পাদন করতে পারি না: /)

সাহায্য অনেক প্রশংসা!

চিয়ার্স, ম্যাথিয়াস


আমি সেট জেনকিন্স কনফিগারেশন ফাইলগুলির মাধ্যমে এটি সমাধান করেছি: JENKINS_JAVA_OPTIONS = "- জাজা.ওয়ট.হেডলেস = সত্য-এক্সএমএস 500 মি-এক্সএমএক্স1000 এম"
হারবার্টডি

উত্তর:


10

ওরিয়েন সঠিক, এটি প্রসেসবিল্ডার বা রানটাইম.এক্সেক দ্বারা চালিত কাঁটাচামচ () সিস্টেম কল বা কোনও বাহ্যিক প্রক্রিয়া চালানোর জেভিএমের অন্য উপায়ে (যেমন অন্য একটি জেভিএম চলমান পিপড়া, একটি গিট কমান্ড, ইত্যাদি) call

জেনকিন্স মেলিং তালিকাগুলি সম্পর্কে এই সম্পর্কে কিছু পোস্ট রয়েছে: প্রোগ্রাম "গিট" চালানো যায় না ... ত্রুটি = 12, মেমরি বরাদ্দ করা যায় না

স্ক্যানস ডেভ তালিকায় ইস্যুটির একটি সুন্দর বর্ণনা রয়েছে: কাঁটাচামচ () + এক্সিকিউটি () বনাম পিক্সিক্স_স্পন ()

সমাধানগুলির সাথে একটি দীর্ঘস্থায়ী জেভিএম বাগ প্রতিবেদন রয়েছে: অদলবদলের ক্লান্তি এড়াতে এস 10 তে পোস্টিক্স_স্পন ব্যবহার করুন, কাঁটাচামচ নয় । তবে আমি নিশ্চিত নই যে এটি আসলে এটি জেডকে made তে পরিণত করেছে কারণ মন্তব্যগুলির প্রস্তাবিত পরিকল্পনা ছিল।

সংক্ষেপে, ইউনিক্সের মতো সিস্টেমগুলিতে, যখন একটি প্রক্রিয়া (যেমন জেভিএম) অন্য প্রক্রিয়া চালু করতে হয় (যেমন গিট) একটি সিস্টেম কল করা হয় fork()যা কার্যকরভাবে বর্তমান প্রক্রিয়াটিকে নকল করে এবং এর সমস্ত স্মৃতি (লিনাক্স এবং অন্যরা অনুলিপি সহ এটি অপ্টিমাইজ করে) -লিখুন যাতে মেমরিটি আসলে কপি করা হয় না যতক্ষণ না শিশু এতে লেখার চেষ্টা করে)। ডুপ্লিকেট প্রক্রিয়াটি পরে অন্য সিস্টেম কল করে, exec()অন্য প্রক্রিয়াটি (যেমন গিট) প্রবর্তন করার জন্য, যেখানে প্যারেন্ট প্রসেস থেকে সমস্ত অনুলিপি করা মেমরি অপারেটিং সিস্টেমের দ্বারা ফেলে দেওয়া যেতে পারে। যদি অভিভাবক প্রক্রিয়াটি প্রচুর পরিমাণে মেমরি ব্যবহার করে (যেমন জেভিএম প্রক্রিয়াগুলি প্রবণতা করে) fork()তবে অপারেটিং সিস্টেমটি নির্ধারণ করে যদি কলটি ব্যর্থ হতে পারে তবে দুটি কপি রাখতে পর্যাপ্ত মেমরি + অদলবদল নেই, এমনকি যদি শিশু প্রক্রিয়াটি আসলে কখনই না ঘটে অনুলিপি করা স্মৃতি ব্যবহার করুন।

বেশ কয়েকটি সমাধান রয়েছে:

  • মেশিনে আরও শারীরিক স্মৃতি / র‌্যাম যুক্ত করুন।

  • কারও কারও কাছে অদলবদল করার প্রয়োজন নেই fork()এমন সময়েও কাজটি চালানোর জন্য আরও অদলবদল যুক্ত করুন । এটি সমাধানটি আমি বেছে নিয়েছিলাম কারণ এটি সোয়াপফাইলে যুক্ত করা মোটামুটি সহজ এবং আমি ওভারকমিটের কারণে প্রক্রিয়াগুলি হারাতে পারার সম্ভাবনা নিয়ে বেঁচে থাকতে চাই না।

  • লিনাক্সে, overcommit_memoryভিএম সিস্টেমের বিকল্প সক্ষম করুন ( / proc / sys / vm / overcommit_memory )। ওভারকমিটের মাধ্যমে, কলটি fork()সর্বদা সফল হবে এবং যেহেতু শিশু প্রক্রিয়াটি আসলে মেমরির সেই অনুলিপিটি ব্যবহার করবে না, তাই সব ঠিক আছে। অবশ্যই, এটি সম্ভব যে অতিরিক্ত কমিটের সাহায্যে আপনার প্রক্রিয়াগুলি উপলব্ধতার চেয়ে বেশি মেমরি ব্যবহার করার চেষ্টা করবে এবং কার্নেলের দ্বারা নিহত হবে। এটি উপযুক্ত কিনা তা মেশিনের অন্যান্য ব্যবহারের উপর নির্ভর করে। মিশন সমালোচনামূলক মেশিনগুলি সম্ভবত স্মৃতি ছাড়িয়ে থাকা মেমরি ঘাতকটিকে ঝুঁকিপূর্ণ করা উচিত নয়। তবে একটি অভ্যন্তরীণ বিকাশ সার্ভার যা কিছুটা ডাউনটাইম সহ্য করতে পারে ওভারকমিট সক্ষম করার জন্য এটি ভাল জায়গা।

  • JVM টি fork()+ ব্যবহার করতে নয় exec()তবে posix_spawn()উপলভ্য হলে ব্যবহার করতে পরিবর্তন করুন । এটি উপরের জেভিএম বাগ রিপোর্টে অনুরোধ করা সমাধান এবং এসসিএনস মেলিং তালিকায় উল্লিখিত সমাধান is এটি জাভা_পসিক্স_স্পনেও প্রয়োগ করা হয় ।

    আমি যদি ফিক্সটি এটি JDK7 এ পরিণত করেছিলাম তা অনুসন্ধান করার চেষ্টা করছি। যদি তা না হয় তবে আমি অবাক হয়েছি যে জেনকিন্সের লোকেরা জাভা_পোসিক্স_স্পানের মতো কোনও কাজের প্রতি আগ্রহী হবে কিনা। এটি অ্যাপাচি কমন্স-এক্সিকিউটে সংহত করার চেষ্টা হয়েছে বলে মনে হয় ।

    প্রোগ্রামিফেরেফ, আমি ১০০% নিশ্চিত নই, তবে আপনার লিঙ্কটি বোঝায় যে ফিক্সটি JDK7 এবং JDK6 1.6.0_23 এবং তার পরে রয়েছে। রেকর্ডটির জন্য, আমি ওপেনজেডিকে 1.6.0_18 চালিয়ে যাচ্ছিলাম।

Https://stackoverflow.com/questions/1124771/how-to-solve-java-io-ioexception-error-12-cannot-allocon-memory-calling-run দেখুন


বিস্তারিত উত্তরের জন্য ধন্যবাদ! সংশ্লিষ্ট পোস্টে আলফ Høgemark বলছেন যে এই এখন সংশোধন করা হয়েছে: ( stackoverflow.com/a/9127548/809939 ) CAN কারো নিশ্চিত এই? আমি আমার জাভা সংস্করণটিও আপডেট করার চেষ্টা করব।
প্রোগ্রামমিরাফি

অতিরিক্ত প্রশ্ন: আপনি কী প্রস্তাব করবেন? Overcommit-মেমরি-সেটিং? শুভেচ্ছা, ম্যাথিয়াস
প্রোগ্রামি

1
একটি swapfile যোগ করা সহজ এবং সোজা-এগিয়ে। উবুন্টু 12.04 এর জন্য (যদিও এটি সাধারণভাবে লিনাক্সের ক্ষেত্রে বেশিরভাগ ক্ষেত্রে প্রয়োগ করা উচিত), এই নিবন্ধটি সহজ ছিল:
ডিজিটালসোশন

1

ব্যতিক্রম বার্তাটি নোট করুন: Cannot run program "/usr/bin/env": java.io.IOException: error=12, Cannot allocate memory"জাভা প্রক্রিয়া কমান্ডটি চালানোর জন্য একটি নতুন প্রক্রিয়া তৈরি করার চেষ্টা করছে /usr/bin/envতবে অপারেটিং সিস্টেমটি একটি নতুন প্রক্রিয়া তৈরি করতে মেমরির সংস্থানগুলি শেষ হয়ে গেছে। এটি জাভা ভিএম এর মেমরির বাইরে চলে আসার মত নয় তাই এটি -Xmx পতাকাগুলির সাথে পরিমাণ মতো ফিডলিং ঠিক করবে না। আপনার বিল্ডটি চালানোর সময় আপনার স্মৃতি সংস্থানগুলি পর্যবেক্ষণ করতে হবে। অদলবদল স্থান বাড়ানো সম্ভবত আপনার সমস্যার সমাধান করবে।


এটি জাভা ভার্চুয়াল মেশিন (কোনও এক স্তূপ) বা হোস্ট কম্পিউটার সিস্টেমের স্মৃতি নেই of
এমডিপিসি

আমার আসল উত্তরের বক্ষতা ক্ষমা করুন। আমি কেন জেভিএমের স্মৃতিশক্তি ছাড়ছে না তা বর্ণনা করার জন্য এটি আপডেট করেছি।
ওরিয়ান

0

এটি সম্ভবত জেনকিন্স দ্বারা ANT_OPTS ওভাররাইড করা হয়েছে। আপনি নিজের বিল্ড ফাইলে সরাসরি অপশনও সেট করতে পারেন যাতে আপনি পরিবেশ থেকে স্বাধীনভাবে মেমরি বরাদ্দকে নিয়ন্ত্রণ করতে পারেন (শেল, জেনকিনস, ...)। আপনার বিল্ড ফাইলে (উদাহরণ:

<java fork="true" classname="..." >
    <jvmarg line="-Xms512M -Xmx512M" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.