क्या प्रक्रियाओं की स्मृति खपत पर किसी प्रकार की नरम सीमा को लागू करना संभव है?


10

मुझे लगता है कि यह ऐसी असामान्य समस्या नहीं है: एक प्रक्रिया भारी मात्रा में मेमोरी आवंटित करती है (यह एक मेमोरी-लीक बग के कारण होती है, क्योंकि आप एक असीम रूप से बड़े इनपुट फ़ाइल, या जो कुछ भी संसाधित करने की कोशिश करते हैं)। RAM भर जाता है, और कुछ बिंदु पर लिनक्स को स्वैप पर स्विच करना पड़ता है। खैर, कभी-कभी यह सिर्फ अंतिम उपाय होता है: यदि मेरे पास एक महंगी संगणना है, तो मैं डेटा को खोना नहीं चाहता हूं यदि अंत में मैं रैम से बाहर चला जाता हूं।

बल्कि अधिक बार हालांकि (मेरे अनुभव में), मेमोरी की खपत एक बदमाश, शायद छोटी गाड़ी की प्रक्रिया से निर्बाध है। यानी, मैं केवल कुछ कम जरूरी डेटा को स्वैप करने के लिए स्थानांतरित नहीं करता हूं , लेकिन ओएस को डेटा के भार को स्वैप करने के लिए मजबूर किया जाता है। और यह दुर्भाग्य से केवल भारी प्रक्रिया को तोड़ता नहीं है, लेकिन पूरे सिस्टम को लगभग एक ठहराव तक ला सकता है (यह एसएसडी के साथ मशीनों पर अब उतना बुरा नहीं है, लेकिन ओटीओएच ने मुझे चिंता में डाल दिया है कि क्या गीगाबाइट और गीगाबाइट के कचरा डेटा लिखना संभव हो सकता है) लंबे समय तक फ़्लैश कोशिकाओं को नुकसान पहुंचाता है)।
जब तक मैं समस्या को नोटिस करता हूं और मैन्युअल रूप से प्रक्रिया को मार देता हूं (एक बार वास्तव में मिनट लगते हैं जब तक कि मैंने खुद को वर्चुअल टर्मिनल में लॉग इन नहीं किया था!), मेरा आधा चलने का सत्र स्वैप में है, और जब तक सिस्टम सुचारू नहीं चलता तब तक मुझे काफी इंतजार करने की जरूरत है फिर।

समस्या का एक कठिन समाधान है: एक कठिन स्मृति सीमा लागू करना। लेकिन यह सिस्टम-वाइड करने से कभी-कभी उन प्रक्रियाओं को मार दिया जाता है जिनकी मुझे अभी भी आवश्यकता है, और अगर मुझे मैन्युअल रूप ulimitसे एक अपमानजनक प्रक्रिया शुरू करने से पहले ... ठीक है, तो मैं अक्सर भूल जाऊंगा जब तक कि बहुत देर हो चुकी हो।

संभव प्रकार के समाधान से मुझे खुशी होगी:

  • यदि कोई प्रक्रिया एक निश्चित मेमोरी उपयोग से अधिक हो जाती है, तो यह कृत्रिम रूप से थ्रॉटल हो जाता है ताकि बाकी सिस्टम उत्तरदायी रहे।
  • यदि कोई प्रक्रिया एक निश्चित मेमोरी उपयोग से अधिक है, तो यह SIGSTOPपेड है इसलिए मेरे पास यह जानने का समय है कि आगे क्या करना है।
  • यदि कोई प्रक्रिया रैम सीमा तक पहुंचती है, तो मुझे एक चेतावनी मिलती है, महान स्वैपिंग शुरू होने से पहले

क्या ऐसा व्यवहार पाने का कोई तरीका है, या समान है?


2
आप एक प्रक्रिया या प्रक्रियाओं के समूह द्वारा cgroups का उपयोग करके RAM की मात्रा को सीमित कर सकते हैं। stackoverflow.com/questions/3043709/…
मार्क प्लॉटनिक

2
यह वस्तुतः सही प्रकार की चीज ulimitहै।
डोपघोटी

1
उलिमित-एम का उपयोग करने की चीज होगी, सिवाय इसके कि यह 2.4.30 के बाद से लिनक्स पर काम नहीं करता है, और इससे पहले केवल कुछ स्थितियों में ही काम करता है। unix.stackexchange.com/questions/129587/…
मार्क प्लॉटनिक

निकेलैड
ओले तांगे

जवाबों:


6

niceload --noswap yourprg बिल्कुल उसी स्थिति के लिए बनाया गया है: यह स्वैपिंग गतिविधि को देखता है:

  • यदि स्वैपिंग हो रही है: प्रक्रिया को चलने दें
  • यदि इसमें स्वैपिंग होती है: प्रक्रिया चलने दें
  • यदि स्वैपिंग इन और आउट: स्वैपिंग बंद होने तक प्रक्रिया को स्थगित करें और जब स्वैपिंग बंद हो जाए तो प्रक्रिया को फिर से शुरू करें

यह स्वैपिंग शुरू होने से पहले की प्रक्रिया को स्थगित नहीं करता है, लेकिन अभिनय करने से पहले स्वैपिंग को 1 सेकंड तक चलने देता है।

niceload --mem 1G yourprgइसी तरह काम करता है: यदि 1 जीबी से कम है तो आप फ्री हैं। जब अधिक है तो 1GB मुफ्त है आपका फिर से शुरू हो गया है।


0

हाँ। यह काफी आसानी से व्यावहारिक रूप से किसी भी आधुनिक शेल के साथ किया जाता है।

sh -c 'ulimit -S -m "$1"
       shift; exec your_command "$@"
' -- some_size args

आप -lलॉक की गई मेमोरी सीमा के लिए विकल्प का उपयोग कर सकते हैं । यदि सीमा पार हो गई है तो आपकी प्रक्रिया का संकेत दिया जाएगा।


-1

कैश साफ़ करने के लिए क्रोनजोब: लिनक्स में मेमोरी कैश कैसे साफ़ करें

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

सरल और आलसी।


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

क्लीयरिंग कैश आमतौर पर प्रदर्शन समस्याओं का परिचय देते हैं। कभी-कभी वे प्रदर्शन समस्याओं को हल करते हैं। लेकिन जब यह नहीं होगा तो वे स्मृति को उपलब्ध नहीं करेंगे।
गाइल्स 'एसओ- बुराई को रोकना'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.