पर मारना नहीं है, मैं मशीन को क्रैश करने से मेरी प्रक्रिया को रोकने के लिए, लिनक्स सिस्टम पर अपने मेमोरी उपयोग को सीमित करने के लिए setrlimit
का उपयोग करने का प्रयास कर रहा हूं (मेरा कोड उच्च प्रदर्शन क्लस्टर पर नोड्स को क्रैश कर रहा था, क्योंकि एक बग ने 100 जीबीबी से अधिक मेमोरी खपत का नेतृत्व किया)। मुझे setrlimit
पर जाने के लिए सही संसाधन नहीं मिल रहा है; मुझे लगता है कि यह निवासी होना चाहिए, जो cannot be limited with setrlimit है, लेकिन मैं निवासी, ढेर, ढेर से उलझन में हूँ। नीचे दिए गए कोड में; अगर मैं केवल RLIMIT_AS
uncomment, कोड MemoryError
numpy.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
[एक अजगर स्क्रिप्ट में स्थापना stacksize] की संभावित डुप्लिकेट (https://stackoverflow.com/questions/5061582/setting-stacksize-in-a-python-script) – jww
'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