2016-09-28 7 views
5

पर मारना नहीं है, मैं मशीन को क्रैश करने से मेरी प्रक्रिया को रोकने के लिए, लिनक्स सिस्टम पर अपने मेमोरी उपयोग को सीमित करने के लिए setrlimit का उपयोग करने का प्रयास कर रहा हूं (मेरा कोड उच्च प्रदर्शन क्लस्टर पर नोड्स को क्रैश कर रहा था, क्योंकि एक बग ने 100 जीबीबी से अधिक मेमोरी खपत का नेतृत्व किया)। मुझे setrlimit पर जाने के लिए सही संसाधन नहीं मिल रहा है; मुझे लगता है कि यह निवासी होना चाहिए, जो cannot be limited with setrlimit है, लेकिन मैं निवासी, ढेर, ढेर से उलझन में हूँ। नीचे दिए गए कोड में; अगर मैं केवल RLIMIT_AS uncomment, कोड MemoryErrornumpy.ones(shape=(1000, 1000, 10), dtype="f8") पर साथ विफल भले ही उस सरणी केवल 80 एमबी होना चाहिए। अगर मैं केवल RLIMIT_DATA, RLIMIT_RSS, या RLIMIT_STACK uncomment दोनों सरणियों सफलतापूर्वक आवंटित हो, भले ही कुल स्मृति उपयोग 2 जीबी, या दो बार वांछित अधिकतम है।स्मृति उपयोग को सीमित करने के लिए मैं 'setrlimit` का उपयोग कैसे करूं? RLIMIT_AS बहुत जल्द मारता है; RLIMIT_DATA, RLIMIT_RSS, RLIMIT_STACK सभी

मैं अपने कार्यक्रम बनाने बनाने के लिए चाहते हैं के रूप में जल्द असफल (चाहे कितने भी) के रूप में यह बहुत ज्यादा रैम आवंटित करने के लिए कोशिश करता है। क्यों RLIMIT_DATA, RLIMIT_RSS, RLIMIT_STACK और RLIMIT_AS में से कोई भी मैं क्या मतलब है क्या करते हो, और setrlimit को पारित करने के लिए सही संसाधन क्या है? RLIMIT_AS लाइन के साथ

$ cat mwe.py 
#!/usr/bin/env python3.5 

import resource 
import numpy 

#rsrc = resource.RLIMIT_AS 
#rsrc = resource.RLIMIT_DATA 
#rsrc = resource.RLIMIT_RSS 
#rsrc = resource.RLIMIT_STACK 

soft, hard = resource.getrlimit(rsrc) 
print("Limit starts as:", soft, hard) 

resource.setrlimit(rsrc, (1e9, 1e9)) 

soft, hard = resource.getrlimit(rsrc) 
print("Limit is now:", soft, hard) 
print("Allocating 80 KB, should certainly work") 
M1 = numpy.arange(100*100, dtype="u8") 

print("Allocating 80 MB, should work") 
M2 = numpy.arange(1000*1000*10, dtype="u8") 

print("Allocating 2 GB, should fail") 
M3 = numpy.arange(1000*1000*250, dtype="u8") 

input("Still here…") 

आउटपुट uncommented:

$ ./mwe.py 
Limit starts as: -1 -1 
Limit is now: 1000000000 -1 
Allocating 80 KB, should certainly work 
Allocating 80 MB, should work 
Traceback (most recent call last): 
    File "./mwe.py", line 22, in <module> 
    M2 = numpy.arange(1000*1000*10, dtype="u8") 
MemoryError 

आउटपुट जब अन्य लोगों uncommented से किसी के साथ चल रहा है:

$ ./mwe.py 
Limit starts as: -1 -1 
Limit is now: 1000000000 -1 
Allocating 80 KB, should certainly work 
Allocating 80 MB, should work 
Allocating 2 GB, should fail 
Still here… 

अंतिम पंक्ति में top रिपोर्ट है कि मेरी प्रक्रिया है 37 9 जीबी वीआईआरटी, 2.0 जीबी आरईएस का उपयोग करना।


प्रणाली विवरण:

$ uname -a 
Linux host.somewhere.ac.uk 2.6.32-573.3.1.el6.x86_64 #1 SMP Mon Aug 10 09:44:54 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux 

$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.7 (Santiago) 

$ free -h 
      total  used  free  shared buffers  cached 
Mem:   2.0T  1.9T  37G  1.6G  3.4G  1.8T 
-/+ buffers/cache:  88G  1.9T 
Swap:   464G  4.8M  464G 

$ python3.5 --version 
Python 3.5.0 

$ python3.5 -c "import numpy; print(numpy.__version__)" 
1.11.1 
+0

[एक अजगर स्क्रिप्ट में स्थापना stacksize] की संभावित डुप्लिकेट (https://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script) – jww

+0

'rlimit_stack' के बाद स्थापित करने के लिए प्रयास कर रहा है [ स्टैक टकराव] (http://www.openwall.com/lists/oss-security/2017/06/19/1) उपचार विफलता या संबंधित समस्याओं का परिणाम हो सकता है। Red Hat [अंक 1463241] (https://bugzilla.redhat.com/show_bug.cgi?id=1463241) – jww

उत्तर

1

ओह मैं अपने प्रश्न के लिए कोई जवाब नहीं है। लेकिन मुझे उम्मीद है कि निम्नलिखित मदद कर सकते हैं:

  • आपकी स्क्रिप्ट मेरे सिस्टम पर अपेक्षित काम करती है। सटीक कल्पना साझा करें तुम्हारा, हो सकता है के लिए वहाँ लिनक्स distro, कर्नेल या यहाँ तक कि numpy के साथ एक ज्ञात समस्या है ...
  • आप RLIMIT_AS साथ ठीक होना चाहिए। जैसा कि here समझाया गया है, इस प्रक्रिया द्वारा उपयोग की जाने वाली संपूर्ण वर्चुअल मेमोरी को सीमित करना चाहिए। और वर्चुअल मेमोरी में सभी शामिल हैं: स्वैप मेमोरी, साझा लाइब्रेरीज़, कोड और डेटा। अधिक जानकारी here
  • आप किसी भी समय वास्तविक आभासी स्मृति के उपयोग की जांच करने के लिए अपनी स्क्रिप्ट के लिए निम्न समारोह (this answer से अपनाया) जोड़ सकते हैं:

    def peak_virtual_memory_mb(): 
        with open('/proc/self/status') as f: 
         status = f.readlines() 
         vmpeak = next(s for s in status if s.startswith("VmPeak:")) 
         return vmpeak 
    
  • एक सामान्य सलाह, अक्षम स्वैप स्मृति। उच्च प्रदर्शन सर्वर के साथ अपने अनुभव में यह हल समस्याओं की तुलना में अधिक नुकसान करता है।
+0

मैंने कुछ सिस्टम विवरण भी जोड़े हैं। क्या मुझे और जोड़ने की ज़रूरत है? 'शीर्ष 'रिपोर्ट है कि मैं 37 9 जीबी वर्चुअल मेमोरी का उपयोग कर रहा हूं।मुझे नहीं पता क्यों, लेकिन शायद यह बताता है कि क्यों 'RLIMIT_AS' संस्करण प्रारंभ में विफल रहता है। एनबी: मैं सिर्फ इस सर्वर पर एक उपयोगकर्ता हूं और स्वैप मेमोरी को अक्षम करने की स्थिति में नहीं हूं। – gerrit

+0

हां, वास्तव में 37 9 जीबी वास्तव में अजीब है, और यह जल्दी विफलता की व्याख्या कर सकता है। मशीन क्या लिनक्स स्वाद है? क्या आपने स्मृति आवंटन से पहले और बाद में 'peak_virtual_memory_mb()' प्रिंट करने की कोशिश की है? बीटीडब्लू, संभवतः सार्वजनिक साइट पर होस्टनाम साझा नहीं करना सबसे अच्छा :) –

+0

@ यह रेडहाट एंटरप्राइज़ लिनक्स (संपादन देखें)। मुझे यकीन नहीं है कि चरम वर्चुअल मेमोरी को कैसे प्रिंट करें। – gerrit

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

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