एप्लिकेशन मेमोरी उपयोग को कैसे सीमित करें?


10

मैंने इस मामले के बारे में प्रश्न पढ़ने में 2 घंटे बिताए हैं, और अभी भी कुछ गलतफहमी है।

मेरे पास यह प्रक्रिया है:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

यह पूरे सिस्टम मेमोरी के 19.3Mbआसपास सिस्टम रेजिडेंट मेमोरी (मेरे पास कोई स्वैप फाइल नहीं है) का उपयोग करता है । आभासी आकार है ?!?! मैंने पढ़ा है कि काम नहीं करता है। लोग इस प्रक्रिया के लिए वर्चुअल मेमोरी सेट करने की तरह उपयोग करते हैं। क्या यह वर्चुअल मेमोरी एक वीएसजेड के साथ सूचीबद्ध है ? यदि मैं सिस्टम मेमोरी का उपयोग करने के लिए इस प्रक्रिया को प्रतिबंधित करना चाहता हूं तो मुझे क्या मूल्य निर्धारित करना चाहिए । मैंने इसके लिए प्रलेखन पढ़ा है और यह कानूनी लगता है:1.8%1GB1.39GBulimit -mulimit -vps100MBsetrlimit

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

लेकिन प्रलेखन के अन्य संस्करणों पर यह RLIMIT_ASपैरामीटर वर्चुअल मेमोरी आकार सेट करता है। सच क्या है?


कृपया, फ़ॉर्मेटिंग पोस्ट करने के लिए कुछ ध्यान दें।
rozcietrzewiacz

जवाबों:


6

हां, वीएसजेड वर्चुअल मेमोरी है। RLIMIT_AS के अनुसार, आपको ऊपर उद्धृत अनुच्छेद कहां मिला? चूंकि सेटरलिमिट (2) एक लिनक्स सिस्टम कॉल है, मैं यह नहीं देखता कि यह संभवत: एक लाइब्रेरी फंक्शन मॉलॉक (3) की निगरानी कैसे कर सकता है। इसके बजाय, यह केवल brk (2), sbrk (2), और mmap (2) के साथ काम कर सकता है - यह भी यही है कि इसका मैनपेज (वैज्ञानिक लिनक्स की जाँच) क्या सुझाता है। हालांकि, इन कार्यों के माध्यम से अनुरोध किया स्मृति की कुल राशि है , आभासी स्मृति तो RLIMIT_AS वास्तव में आभासी स्मृति सीमित करता है। (यह, फिर से सेटलिमिट के अनुसार है (2) मैनपेज।)

दुर्भाग्य से, आप लिनक्स के तहत RSS को सीमित नहीं कर सकते (यह होगा ulimit -m)। आप ulimit -d(RLIMIT_DATA) को आज़मा सकते हैं , लेकिन यह mmap (2) को अनदेखा कर देगा, आमतौर पर बड़े आवंटन के लिए उपयोग किया जाता है। आभासी मेमोरी को सीमित करने के लिए एक और संभावना होगी, लेकिन आरएसएस और वीएसजेड के बीच इतने बड़े अंतर के साथ, यह मुश्किल हो सकता है।


आपके उत्तर के लिए धन्यवाद। पैराग्राफ setrlimitमैन पेज से है। IEEE/The Open Group 2003 GETRLIMIT(3P)कैसे आ psसकता है मुझे आरएसएस दिखा सकते हैं, लेकिन कर्नेल इस पर सीमा लागू नहीं कर सकता है?
ड्रैगोमिर इवानोव

6
एलन कॉक्स के अनुसार, इसके ऐतिहासिक कारण हैं: आरएसएस की गणना महंगी हुआ करती थी, इसलिए सीमा लागू करने से कर्नेल पर एक बड़ा भार पड़ेगा; स्रोत: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html । यह भी देखें stackoverflow.com/questions/3043709/…
अंसार एज़्टरमैन

समझा। मुझे लगता है कि मैं तब जाऊंगा ulimit -d। आवेदन मेरे द्वारा लिखा गया है, और मैंने उपयोग नहीं किया mmap()
ड्रैगोमिर इवानोव

2
नहीं, आप आमतौर पर नहीं (और न ही sbrk ()), लेकिन malloc () हो सकता है।
अंसार एग्ज़टरमैन

समझा। यह बहुत दुर्भाग्यपूर्ण है। तो इस सवाल का हल, या तो कुछ स्क्रिप्ट भाषा के साथ cgroups, या स्मृति उपयोग पोल है।
ड्रैगोमिर इवानोव

3

कई प्रक्रियाएँ इसकी कुछ मेमोरी को अन्य प्रक्रियाओं के साथ साझा करती हैं, जैसे कि libc का उपयोग लगभग हर प्रक्रिया द्वारा किया जाता है, लेकिन केवल एक बार मेमोरी में मैप किया जाता है, लेकिन यह हर प्रक्रिया के वर्चुअल मेमोरी उपयोग की ओर गिना जाता है। स्मृति उपयोग को सीमित करना जो केवल एक निश्चित प्रक्रिया (ज्यादातर आरएसएस) द्वारा उपयोग किया जाता है, cgroups का उपयोग करके किया जा सकता है। एक प्रक्रिया के कुल संसाधनों (स्मृति) को सीमित करने के लिए और इसे करने के लिए अपने बच्चों के लिए उत्तर देखें । यह एक प्रक्रिया और उसके बच्चों की कुल मेमोरी को सीमित कर देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.