2011-06-07 10 views
19

के साथ मेमोरी खपत सीमा निर्धारित करना हाल ही में मैंने अपस्टार्ट का बहुत शौकिया बन गया है। पहले मैं भगवान, मॉनीट और ब्लूपिल का उपयोग कर रहा हूं लेकिन मुझे वास्तव में इन समाधानों को पसंद नहीं है इसलिए मैं एक स्टार्ट अपस्टार्ट दे रहा हूं।अपस्टार्ट

मैं /etc/init में अपनी प्रक्रियाओं के लिए कुछ मूल अपस्टार्ट कॉन्फ़िगरेशन फ़ाइलों को उत्पन्न करने के लिए फोरमैन मणि का उपयोग कर रहा हूं। हालांकि, ये जेनरेट की गई फाइलें केवल क्रैश प्रक्रिया की श्वसन को संभालती हैं। मैं सोच रहा था कि क्या मॉनिट, ईश्वर या ब्लूपिल के साथ उदाहरण के लिए > 150mb स्मृति के लिए उपभोग करने वाली प्रक्रिया को पुनरारंभ करने के लिए अपस्टार्ट को बताना संभव है।

मैंने Upstart docs और this के माध्यम से पढ़ा है जो मैं देख रहा हूं जैसा दिखता है। हालांकि मुझे कोई संकेत नहीं है कि इस तरह कुछ कॉन्फ़िगर कैसे करें।

जो मैं मूल रूप से चाहता हूं वह काफी सरल है। यदि मेमोरी उपयोग > 150mb रैम है तो मैं अपनी web प्रक्रिया को पुनरारंभ करना चाहता हूं। ये मेरे पास फ़ाइलें हैं:

|-- myapp-web-1.conf 
|-- myapp-web-2.conf 
|-- myapp-web-3.conf 
|-- myapp-web.conf 
|-- myapp.conf 

और उनकी सामग्री हैं:

myapp.conf

pre-start script 

bash << "EOF" 
    mkdir -p /var/log/myapp 
    chown -R deployer /var/log/myapp 
EOF 

end script 

MyApp-web.conf

start on starting myapp 
stop on stopping myapp 

MyApp-w EB-1.conf/MyApp-वेब-2.conf/MyApp-वेब-3.conf

start on starting myapp-web 
stop on stopping myapp-web 
respawn 

exec su - deployer -c 'cd /var/applications/releases/20110607140607; cd myapp && bundle exec unicorn -p $PORT >> /var/log/myapp/web-1.log 2>&1' 

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

उत्तर

10

myapp-web-*.conf के अंत करने के लिए इस जोड़ किसी भी आवंटन स्मृति से अधिक 150mbENOMEM वापस जाने के लिए आवंटित करने के लिए कोशिश कर कॉल का कारण होगा:

limit rss 157286400 157286400 

प्रक्रिया इस बिंदु पर क्रैश हो सकता है, या यह नहीं हो सकता है। यह प्रक्रिया पर निर्भर है!

Here's a test for this in the Upstart Source

+0

अरे, आपके उत्तर के लिए धन्यवाद। मैं इन सब से बहुत परिचित नहीं हूं लेकिन अगर मैं सही ढंग से समझता हूं, तो मेरा (रूबी) आवेदन 150 एमबी रैम से अधिक के बाद मेमोरी आवंटित करने का प्रयास करेगा, जिस बिंदु पर (परिभाषित करते समय: 'सीमा आरएसएस 157286400 157286400' सीमा) यह एक अपवाद उठाएगा (रूबी के कुछ शोध करने के बाद मामले में, मुझे लगता है कि यह अपवाद उठाया जाएगा: 'एरर्नो :: ईओएनएमएम') और आमतौर पर प्रक्रिया को दुर्घटनाग्रस्त कर देगा। हालांकि रेल फ्रेम ढांचे में शायद नहीं। मुझे उसमें देखना होगा। धन्यवाद! मुझे लगता है कि मैं आपके जवाब के लिए धन्यवाद का पता लगाने में सक्षम हो जाऊंगा! –

+1

क्या आपको पता चला कि यह रूबी/रेल के साथ कैसे काम करेगा? मुझे हमारे सेवा कमान के लिए यह कोशिश करने में बहुत दिलचस्पी है। – localshred

+0

@ जेनवेलैंड रेल ऐप के साथ कोई प्रगति? – Autodidact

3

अपस्टार्ट दस्तावेज़ों से, सीमा rlimit सिस्टम कॉल विकल्पों से आती है। (http://upstart.ubuntu.com/cookbook/#limit)

चूंकि लिनक्स 2.4+ आरएसएस (निवासी सेट आकार) को सेट करने से कोई प्रभाव नहीं पड़ता है।

अन्य उत्तरों में पहले से ही सुझाए गए विकल्प के रूप में है जो वर्चुअल मेमोरी पता स्पेस आकार सीमा निर्धारित करता है। इसका 'असली' मेमोरी सीमा निर्धारित करने का बहुत अलग प्रभाव होगा। setrlimit के लिए आदमी पृष्ठों से

limit as <soft limit> <hard limit> 

अंश:

RLIMIT_AS प्रक्रिया के आभासी स्मृति (पता स्थान) बाइट में का अधिकतम आकार।यह सीमा ब्रैक (2), एमएमएपी (2), और mremap (2), पर कॉल को प्रभावित करती है जो इस सीमा से अधिक होने पर त्रुटि ENOMEM के साथ विफल हो जाती है। इसके अलावा स्वचालित स्टैक विस्तार विफल हो जाएगा (और एक SIGSEGV उत्पन्न करें जो प्रक्रिया को मारता है अगर सिग्ल्टस्टैक (2) के माध्यम से कोई वैकल्पिक स्टैक उपलब्ध नहीं किया गया है)। चूंकि मान एक लंबा है, 32-बिट लंबे मशीनों पर या तो यह सीमा अधिकतम 2 जीबीबी है, या यह संसाधन असीमित है।

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