पायथन सबप्रोसेस। "OSError: [Errno 12] मेमोरी को आवंटित नहीं कर सकता है"


114

नोट: यह प्रश्न मूल रूप से यहां पूछा गया था, लेकिन एक स्वीकार्य उत्तर वास्तव में नहीं मिलने के बावजूद, समय समाप्त हो गया था। मैं मूल प्रश्न में दिए गए सभी विवरणों सहित इस प्रश्न को फिर से पूछ रहा हूं।

एक पायथन स्क्रिप्ट शेड्यूल मॉड्यूल का उपयोग करके प्रत्येक 60 सेकंड में क्लास फ़ंक्शंस का एक सेट चला रही है :

# sc is a sched.scheduler instance
sc.enter(60, 1, self.doChecks, (sc, False))

स्क्रिप्ट यहां कोड का उपयोग करते हुए एक निर्धारित प्रक्रिया के रूप में चल रही है

वर्ग के तरीकों की एक संख्या है कि doChecks के भाग का उपयोग के रूप में कहा जाता है उपप्रक्रिया मॉड्यूल क्रम में सिस्टम फ़ंक्शन कॉल करने के लिए प्रणाली आंकड़े प्राप्त कर सकते:

ps = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE).communicate()[0]

यह निम्न त्रुटि के साथ पूरी स्क्रिप्ट क्रैश होने से पहले की अवधि के लिए ठीक चलता है:

File "/home/admin/sd-agent/checks.py", line 436, in getProcesses
File "/usr/lib/python2.4/subprocess.py", line 533, in __init__
File "/usr/lib/python2.4/subprocess.py", line 835, in _get_handles
OSError: [Errno 12] Cannot allocate memory

स्क्रिप्ट के दुर्घटनाग्रस्त होने के बाद सर्वर पर मुफ्त-एम का उत्पादन होता है:

$ free -m
                  total       used       free     shared     buffers    cached
Mem:                894        345        549          0          0          0
-/+ buffers/cache:  345        549
Swap:                 0          0          0

सर्वर CentOS 5.3 चला रहा है। मैं अपने स्वयं के CentOS बक्से पर पुन: पेश करने में असमर्थ हूं और न ही किसी अन्य उपयोगकर्ता के साथ समान समस्या की रिपोर्ट कर रहा हूं।

मैंने इसे डिबग करने के लिए कई चीजों की कोशिश की है जैसा कि मूल प्रश्न में सुझाया गया है:

  1. Popen कॉल से पहले और बाद में free -m का आउटपुट लॉग करना। मेमोरी के उपयोग में कोई महत्वपूर्ण बदलाव नहीं है, यानी स्क्रिप्ट के चलने के दौरान मेमोरी का धीरे-धीरे उपयोग नहीं किया जा रहा है।

  2. मैंने close_fds = को Popen कॉल में जोड़ा, लेकिन इससे कोई फर्क नहीं पड़ा - स्क्रिप्ट अभी भी उसी त्रुटि के साथ क्रैश हो गई। यहाँ और यहाँ का सुझाव दिया

  3. मैं rlimits के रूप में सुझाव दिया है जो दोनों RLIMIT_DATA और RLIMIT_AS पर पता चला है (-1, -1) की जाँच की यहाँ

  4. एक लेख में सुझाव दिया गया था कि बिना स्वैप स्थान होने का कारण हो सकता है, लेकिन स्वैप वास्तव में मांग पर उपलब्ध है (वेब ​​होस्ट के अनुसार) और यह भी यहां एक फर्जी कारण के रूप में सुझाया गया था ।

  5. प्रक्रियाओं को बंद किया जा रहा है क्योंकि यह पायथन स्रोत कोड और टिप्पणियों के अनुसार समर्थित .communicate () का उपयोग करने का व्यवहार है

पूरे चेक को GitHub पर लाइन 442 से परिभाषित गेटप्रोसेस फ़ंक्शन के साथ पाया जा सकता है । इसे doChecks () द्वारा लाइन 520 पर शुरू किया जाता है।

क्रैश से पहले निम्न आउटपुट के साथ स्क्रिप्ट को स्ट्रेस के साथ चलाया गया था:

recv(4, "Total Accesses: 516662\nTotal kBy"..., 234, 0) = 234
gettimeofday({1250893252, 887805}, NULL) = 0
write(3, "2009-08-21 17:20:52,887 - checks"..., 91) = 91
gettimeofday({1250893252, 888362}, NULL) = 0
write(3, "2009-08-21 17:20:52,888 - checks"..., 74) = 74
gettimeofday({1250893252, 888897}, NULL) = 0
write(3, "2009-08-21 17:20:52,888 - checks"..., 67) = 67
gettimeofday({1250893252, 889184}, NULL) = 0
write(3, "2009-08-21 17:20:52,889 - checks"..., 81) = 81
close(4)                                = 0
gettimeofday({1250893252, 889591}, NULL) = 0
write(3, "2009-08-21 17:20:52,889 - checks"..., 63) = 63
pipe([4, 5])                            = 0
pipe([6, 7])                            = 0
fcntl64(7, F_GETFD)                     = 0
fcntl64(7, F_SETFD, FD_CLOEXEC)         = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f12708) = -1 ENOMEM (Cannot allocate memory)
write(2, "Traceback (most recent call last"..., 35) = 35
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/agent."..., 52) = 52
open("/home/admin/sd-agent/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/daemon.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/home/admin/sd-agent/dae"..., 60) = 60
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/agent.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/agent."..., 54) = 54
open("/usr/lib/python2.4/sched.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/sched"..., 55) = 55
fstat64(8, {st_mode=S_IFREG|0644, st_size=4054, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "\"\"\"A generally useful event sche"..., 4096) = 4054
write(2, "    ", 4)                     = 4
write(2, "void = action(*argument)\n", 25) = 25
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/checks"..., 60) = 60
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/bin/sd-agent/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python24.zip/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/plat-linux2/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOMEM (Cannot allocate memory)
open("/usr/lib/python2.4/lib-tk/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/lib-dynload/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
open("/usr/lib/python2.4/site-packages/checks.py", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
write(2, "  File \"/usr/bin/sd-agent/checks"..., 64) = 64
open("/usr/lib/python2.4/subprocess.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/subpr"..., 65) = 65
fstat64(8, {st_mode=S_IFREG|0644, st_size=39931, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "# subprocess - Subprocesses with"..., 4096) = 4096
read(8, "lso, the newlines attribute of t"..., 4096) = 4096
read(8, "code < 0:\n        print >>sys.st"..., 4096) = 4096
read(8, "alse does not exist on 2.2.0\ntry"..., 4096) = 4096
read(8, " p2cread\n        # c2pread    <-"..., 4096) = 4096
write(2, "    ", 4)                     = 4
write(2, "errread, errwrite)\n", 19)    = 19
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
open("/usr/lib/python2.4/subprocess.py", O_RDONLY|O_LARGEFILE) = 8
write(2, "  File \"/usr/lib/python2.4/subpr"..., 71) = 71
fstat64(8, {st_mode=S_IFREG|0644, st_size=39931, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7d28000
read(8, "# subprocess - Subprocesses with"..., 4096) = 4096
read(8, "lso, the newlines attribute of t"..., 4096) = 4096
read(8, "code < 0:\n        print >>sys.st"..., 4096) = 4096
read(8, "alse does not exist on 2.2.0\ntry"..., 4096) = 4096
read(8, " p2cread\n        # c2pread    <-"..., 4096) = 4096
read(8, "table(self, handle):\n           "..., 4096) = 4096
read(8, "rrno using _sys_errlist (or siml"..., 4096) = 4096
read(8, " p2cwrite = None, None\n         "..., 4096) = 4096
write(2, "    ", 4)                     = 4
write(2, "self.pid = os.fork()\n", 21)  = 21
close(8)                                = 0
munmap(0xb7d28000, 4096)                = 0
write(2, "OSError", 7)                  = 7
write(2, ": ", 2)                       = 2
write(2, "[Errno 12] Cannot allocate memor"..., 33) = 33
write(2, "\n", 1)                       = 1
unlink("/var/run/sd-agent.pid")         = 0
close(3)                                = 0
munmap(0xb7e0d000, 4096)                = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x589978}, {0xb89a60, [], SA_RESTORER, 0x589978}, 8) = 0
brk(0xa022000)                          = 0xa022000
exit_group(1)                           = ?

1
रनवेग 'पाइप' या फ़ाइसेस्क्रिप्ट्स या इनसे संबंधित कर्नेल-रिसोर्स?
ब्लोहोह्र

जाँच /var/log/messages, या dmesgआज्ञा।
mark4o

इस के लिए प्रासंगिक लॉग में कुछ भी नहीं है।
davidmytton

क्या आपको कभी इसका समाधान मिला? मेरे बहुत ही समान लक्षण हैं। मेरे पास बहुत सारी अतिरिक्त मेमोरी है, लेकिन स्वैप जोड़ने के बाद (जैसे आपके कुछ सुझाव सुझाते हैं), समस्या दूर हो जाती है। बस के बाद से और अब के महीनों में कुछ भी पता चला तो आश्चर्य हुआ। -- धन्यवाद!
dpb

मैं एक ही समस्या में चल रहा हूं लेकिन कोई संकल्प नहीं - कोई विचार?

जवाबों:


88

एक सामान्य नियम के (यानी में वेनिला कर्नेल) के रूप में, fork/ cloneसाथ विफलताओं ENOMEM विशेष रूप से पाए जाते हैं , क्योंकि दोनों में से किसी बाहर के स्मृति हालत भगवान से एक ईमानदार ( dup_mm, dup_task_struct, alloc_pid, mpol_dup, mm_initआदि कर्कश), या क्योंकि security_vm_enough_memory_mmतुम असफल जबकि लागू करने ओवरकमिट नीति

कांटा प्रयास के समय कांटा बनाने में विफल रही प्रक्रिया के vmsize की जांच करके शुरू करें, और फिर मुफ्त मेमोरी (भौतिक और स्वैप) की मात्रा की तुलना करें क्योंकि यह ओवरकमिट पॉलिसी (प्लग इन नंबर) से संबंधित है।

अपने विशेष मामले में, ध्यान दें कि Virtuozzo के पास ओवरकॉमिट प्रवर्तन में अतिरिक्त चेक हैं । इसके अलावा, मुझे यकीन नहीं है कि आपके कंटेनर के भीतर , स्वैप और ओवरकमिट कॉन्फ़िगरेशन (प्रवर्तन के परिणाम को प्रभावित करने के लिए) से आपके पास वास्तव में कितना नियंत्रण है ।

अब, वास्तव में आगे बढ़ने के लिए मैं कहूंगा कि आप दो विकल्पों के साथ बचे हैं :

  • बड़े उदाहरण के लिए स्विच करें, या
  • अपनी स्क्रिप्ट की मेमोरी फ़ुटप्रिंट को अधिक प्रभावी ढंग से नियंत्रित करने के लिए कुछ कोडिंग प्रयास करें

ध्यान दें कि कोडिंग प्रयास सभी के लिए शून्य हो सकता है अगर यह पता चला कि यह आप नहीं हैं, लेकिन कुछ अन्य व्यक्ति एक ही उदाहरण पर एक ही उदाहरण में एक सर्वर से टकरा रहे हैं जैसे कि आप अमॉक चला रहे हैं।

मेमोरी-वार, हम पहले से ही जानते हैं कि subprocess.Popenउपयोग करता है fork/ clone हुड के नीचे , जिसका अर्थ है कि हर बार जब आप इसे कॉल करते हैं तो आप एक बार और अधिक मेमोरी के लिए अनुरोध कर रहे हैं जैसे कि पायथन पहले से ही खा रहा है , यानी सैकड़ों अतिरिक्त एमबी में, तब तक सभी execएक दंड 10kB निष्पादन योग्य जैसे freeया ps। एक प्रतिकूल ओवरकम नीति के मामले में, आप जल्द ही देखेंगे ENOMEM

इसके विकल्प के forkपास यह मूल पृष्ठ सारणी नहीं है आदि प्रतिलिपि समस्या है vforkऔर posix_spawn। लेकिन आप का हिस्सा फिर से लिखने का मन नहीं है subprocess.Popenके मामले में vfork/ posix_spawn, उपयोग करने पर विचार suprocess.Popenअपनी स्क्रिप्ट की शुरुआत में (जब अजगर की स्मृति पदचिह्न कम है) में, केवल एक बार, के लिए एक खोल स्क्रिप्ट है कि तब रन अंडे free/ ps/ sleepऔर जो कुछ भी एक में आपकी स्क्रिप्ट के समानांतर लूप ; स्क्रिप्ट के आउटपुट को पोल करें या इसे एक अलग धागे से पढ़ें, संभवतः एक अलग थ्रेड से अगर आपके पास एसिंक्रोनस रूप से देखभाल करने के लिए अन्य सामान हैं - तो अपने डेटा को पायथन में क्रंचिंग करें लेकिन अधीनस्थ प्रक्रिया के लिए फोर्किंग छोड़ दें।

कैसे , अपने विशेष मामले में आप पूरी तरह से छोड़ सकते हैं psऔर freeपूरी तरह से; यह जानकारी आपको सीधे पाइथन में आसानी से उपलब्ध हैprocfs , चाहे आप इसे स्वयं या मौजूदा पुस्तकालयों और / या पैकेजों के माध्यम से एक्सेस करना चुनते हों । तो psऔर freeथे ही उपयोगिताओं आप चल रहे थे, तो आप कर सकते हैं को दूर कर subprocess.Popenपूरी तरह से

अंत में, आप जो कुछ भी करते हैं subprocess.Popenवह चिंतित है, यदि आपकी स्क्रिप्ट मेमोरी लीक करती है तो आप अभी भी दीवार को अंततः मारेंगे। उस पर नज़र रखें, और मेमोरी लीक की जांच करें


7
मैंने पाया है कि उन मामलों में मदद करने gc.collect()से पहले subprocess.Popenजब कचरा कलेक्टर थोड़ी देर के लिए नहीं चला था।
लेटैमिक

मैंने सहायक स्क्रिप्ट रणनीति को संभालने के लिए एक बहाना लिखा: github.com/SeanHayes/errand-boy मैं अपने एक ग्राहक के साथ उत्पादन में इसका उपयोग कर रहा हूं और हमारी "मेमोरी आवंटित नहीं कर सकता" परेशानियां दूर हो गई हैं।
सियान हेस

मैं एक साधारण डायग्नोस्टिक की सराहना करूंगा, उदाहरण के /proc/fd/mapsलिए निर्धारित करने के लिए कि क्या ओवरकमेज्ड मेमोरी वास्तव में समस्या है
दिमा तिस्नेक

18

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

यदि कोई स्वैप मेमोरी सक्षम है तो आप पहले देख सकते हैं।

$sudo swapon -s

यदि यह खाली है, तो इसका मतलब है कि आपके पास कोई स्वैप सक्षम नहीं है। 1GB स्वैप जोड़ने के लिए:

$sudo dd if=/dev/zero of=/swapfile bs=1024 count=1024k
$sudo mkswap /swapfile
$sudo swapon /swapfile

fstabस्वैप को स्थायी बनाने के लिए निम्न पंक्ति जोड़ें ।

$sudo vim /etc/fstab

     /swapfile       none    swap    sw      0       0 

स्रोत और अधिक जानकारी यहां पाई जा सकती है


1
क्या उसने वही समस्या ठीक की या कुछ और?
दिमा तिस्नेक

यह मेरे लिए CentOS 6.4 पर हुआ। आवेश स्थापित करते समय त्रुटि हुई, धन्यवाद।
रुसलान अबुजेंट

हालाँकि यह मुझे कोड निष्पादित करने देता है, लेकिन यह वास्तव में समस्या का समाधान नहीं करता है, जो संभवतः मेरे द्वारा उपयोग की जाने वाली लाइब्रेरी में निहित है।

1
आपने मेरी समस्या ठीक कर दी। धन्यवाद! +1
sscirrus

8

पूर्व में सुझाई गई लाल हेरिंग नहीं हो सकती है। प्रश्न के ठीक पहले अजगर प्रक्रिया कितनी बड़ी है ENOMEM?

कर्नेल 2.6 के तहत, /proc/sys/vm/swappiness नियंत्रित करता है कि आक्रामक रूप से कर्नेल स्वैप में overcommit*कैसे बदल जाएगा, और फाइल कर्नेल को पलक और सिर के साथ कितना और कितना सटीक रूप से याद दिला सकती है। आपके फेसबुक रिश्ते की स्थिति की तरह, यह जटिल है

... लेकिन स्वैप वास्तव में मांग पर उपलब्ध है (वेब ​​होस्ट के अनुसार) ...

लेकिन आपके free(1)कमांड के आउटपुट के अनुसार नहीं , जो आपके सर्वर इंस्टेंस द्वारा मान्यता प्राप्त कोई स्वैप स्थान नहीं दिखाता है। अब, आपका वेब होस्ट निश्चित रूप से इस विषय के बारे में मुझसे अधिक जान सकता है, लेकिन मैंने जो वर्चुअल RHEL / CentOS सिस्टम का उपयोग किया है, उसने अतिथि OS को स्वैप की सूचना दी है।

अनुकूल Red Hat KB अनुच्छेद 15252 को :

Red Hat Enterprise Linux 5 सिस्टम बिना किसी स्वैप स्पेस के बिल्कुल ठीक चलेगा जब तक कि अनाम मेमोरी और सिस्टम V शेयर्ड मेमोरी का योग रैम की मात्रा लगभग 3/4 से कम हो। .... 4GB RAM या उससे कम वाले सिस्टम लिए न्यूनतम 2GB स्वैप स्पेस की सिफारिश की जाती है।

/proc/sys/vmएक सादे CentOS 5.3 स्थापना के लिए अपनी सेटिंग्स की तुलना करें । एक स्वैप फ़ाइल जोड़ें। शाफ़्ट नीचे swappinessऔर देखें कि क्या आप किसी भी लंबे समय तक रहते हैं।


अजगर प्रक्रिया के आकार की जांच करने का सबसे अच्छा तरीका क्या है? ps?
davidmytton

ऐसा कुछ ps -o user,pid,vsz="Mem(Kb)" -o cmd $PYTHON_PID, या शीर्ष (1), करना चाहिए।
1

7

एक आसान तय के लिए, आप कर सकते हैं

echo 1 > /proc/sys/vm/overcommit_memory

अगर आपको लगता है कि आपके सिस्टम में पर्याप्त मेमोरी है। लिनक्स को प्रतिबद्ध हेयुरिस्टिक पर देखें ।


1
आपको बहुत - बहुत धन्यवाद! ऐसा आसान उपाय, आपने मेरा दिन बचाया)
igolkotek

5

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

यहाँ fork(2)आदमी पृष्ठ का प्रासंगिक हिस्सा है :

त्रुटियों
       EAGAIN कांटा () माता-पिता के पृष्ठ तालिकाओं की प्रतिलिपि बनाने के लिए पर्याप्त मेमोरी आवंटित नहीं कर सकता है और इसके लिए कार्य संरचना आवंटित कर सकता है
              बच्चे।

       EAGAIN नई प्रक्रिया बनाना संभव नहीं था क्योंकि कॉलर की RLIMIT_NPROC संसाधन सीमा का सामना करना पड़ा था। सेवा
              इस सीमा से अधिक होने पर, प्रक्रिया में CAP_SYS_ADMIN या CAP_SYS_RESOURCE क्षमता होनी चाहिए।

       ENOMEM कांटा () आवश्यक कर्नेल संरचनाओं को आवंटित करने में विफल रहा क्योंकि मेमोरी तंग है।

मेरा सुझाव है कि उपयोगकर्ता स्टॉक, जेनेरिक कर्नेल में बूटिंग के बाद यह कोशिश करें और केवल लोड किए गए मॉड्यूल और ड्राइवरों का एक न्यूनतम सेट (आपके एप्लिकेशन / स्क्रिप्ट को चलाने के लिए न्यूनतम आवश्यक)। वहाँ से, यह मानते हुए कि यह उस कॉन्फ़िगरेशन में काम करता है, वे उस और कॉन्फ़िगरेशन के बीच एक द्विआधारी खोज कर सकते हैं जो समस्या को प्रदर्शित करता है। यह मानक sysadmin 101 समस्या निवारण है।

आपके लिए प्रासंगिक पंक्ति straceहै:

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f12708) = -1 ENOMEM (Cannot allocate memory)

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

हालांकि मुझे संदेह है कि यह अभी भी एक लाल हेरिंग है।

तथ्य यह freeहै कि कैश और बफ़र्स द्वारा उपयोग में 0 (ZERO) मेमोरी की रिपोर्टिंग बहुत परेशान कर रही है। मुझे संदेह है कि freeआउटपुट ... और संभवतः आपके आवेदन का मुद्दा यहां, कुछ मालिकाना कर्नेल मॉड्यूल के कारण है जो किसी तरह से मेमोरी आवंटन में हस्तक्षेप कर रहा है।

फोर्क () / क्लोन () फोर्क () सिस्टम कॉल के मैन पेजों के अनुसार यदि आपके कॉल में संसाधन सीमा उल्लंघन (RLIMIT_NPROC) का कारण होता है, तो EAGAIN को वापस करना चाहिए ... हालांकि, यह नहीं कहता है कि EAGAIN को लौटाया जाना है। अन्य RLIMIT द्वारा * उल्लंघन। किसी भी घटना में यदि आपके लक्ष्य / मेजबान में किसी प्रकार की अजीब Vormetric या अन्य सुरक्षा सेटिंग्स हैं (या यहां तक ​​कि अगर आपकी प्रक्रिया कुछ अजीब SELinux नीति के तहत चल रही है) तो यह -ENOMEM विफलता हो सकती है।

यह एक सामान्य रन-ऑफ-द-मिल लिनक्स / यूनिक्स मुद्दा होने की संभावना नहीं है। आपको वहां कुछ गैर-मानक मिल रहा है।


1
सर्वर मीडिया टेम्प्लेट (DV) बेस पर चल रहा है जो वर्चुअलाइजेशन के लिए Virtuozzo का उपयोग करता है।
davidmytton

Virtuozzo संदेश बोर्डों और बग ट्रैकिंग सिस्टम और, शायद, Virtuozzo सबसिस्टम के उन्नयन की तलाश में खोज का प्रयास करें।
जिम डेनिस

2

क्या आपने प्रयोग करने की कोशिश की है:

(status,output) = commands.getstatusoutput("ps aux")

मैंने सोचा कि यह मेरे लिए एक ही समस्या तय की थी। लेकिन फिर मेरी प्रक्रिया समाप्त होने में विफल रहने के बजाय मार दी गई, जो कि और भी बदतर है ..

कुछ परीक्षण के बाद मैंने पाया कि यह केवल अजगर के पुराने संस्करणों पर हुआ था: यह 2.6.5 के साथ होता है, लेकिन 2.7.2 के साथ नहीं

मेरी खोज ने मुझे यहां अजगर-क्लोज़_फेस-इश्यू के लिए प्रेरित किया था, लेकिन बंद किए गए_फंड्स ने समस्या हल नहीं की थी। यह अभी भी अच्छी तरह से पढ़ने लायक है।

मैंने पाया कि अजगर सिर्फ इस पर नज़र रखते हुए फ़ाइल डिस्क्रिप्टर लीक कर रहा था:

watch "ls /proc/$PYTHONPID/fd | wc -l"

आपकी तरह, मैं कमांड के आउटपुट को कैप्चर करना चाहता हूं, और मैं OOM त्रुटियों से बचना चाहता हूं ... लेकिन ऐसा लगता है कि लोगों के लिए एकमात्र तरीका पायथन के कम बगिया संस्करण का उपयोग करना है। आदर्श नहीं...


0

मूनमैप (0xb7d28000, 4096) = 0
लिखना (2, "OSError", 7) = 7

मैंने मैला कोड देखा है जो इस तरह दिखता है:

serrno = errno;
some_Syscall(...)
if (serrno != errno)
/* sound alarm: CATROSTOPHIC ERROR !!! */

आपको यह देखने के लिए जांचना चाहिए कि क्या यह अजगर कोड में हो रहा है। यदि कार्यवाही सिस्टम कॉल विफल हुआ, तो Errno केवल मान्य है।

जोड़ने के लिए संपादित:

आप यह नहीं कहते कि यह प्रक्रिया कब तक रहती है। स्मृति के संभावित उपभोक्ता

  • कांटे की प्रक्रिया
  • अप्रयुक्त डेटा संरचनाएँ
  • साझा पुस्तकालय
  • स्मृति मैप की गई फ़ाइलें

2
हां, लेकिन हम ओपी के स्ट्रेस से देखते हैं कि पहली syscall विफलता - क्लोन () से - जैसा कि बताया गया है ENOMEM है। इस त्रुटि को ट्रेसबैक निर्माण के माध्यम से अजगर की कम-मेमोरी ठोकर के साथ संरक्षित किया जाता है, भले ही सी-लाइब्रेरी errnoको रास्ते में कई बार रीसेट किया गया हो।
विमान चालक दल

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