2012-03-26 15 views
6

चलाता है जब यह अजीब चीज है!ओएस बहु-थ्रेडेड पायथन प्रक्रिया

मेरे पास पाइथन में लिखा गया एक बहु थ्रेडेड क्लाइंट एप्लिकेशन है। मैं समवर्ती रूप से पृष्ठों को डाउनलोड और संसाधित करने के लिए थ्रेडिंग का उपयोग कर रहा हूं। मैं कर्ल मल्टी-हैंडल का उपयोग करता हूं सिवाय इसके कि बाधा निश्चित रूप से प्रोसेसर (बैंडविड्थ नहीं) इस एप्लिकेशन में है, इसलिए यह थ्रेड पूल का उपयोग करने के लिए अधिक कुशल है।

मेरे पास 64 जी i7 रॉकिंग 16 जीबी रैम है। मांसल। मैं पेंडोरा को सुनकर और स्टैक ओवरफ्लो और बीएएम को टोल करते हुए 80 धागे लॉन्च करता हूं! माता-पिता की प्रक्रिया कभी कभी संदेश

Killed

अन्य बार एक ही पृष्ठ (जो यह क्रोम में स्वयं की प्रक्रिया है) मर जाएगा के साथ समाप्त होता है। अन्य बार पूरा ब्राउज़र दुर्घटनाग्रस्त हो जाता है। यहाँ

def start(): 
    while True: 
    for url in to_download: 
     queue.put((url, uri_id)) 

    to_download = [ ] 

    if queue.qsize() < BATCH_SIZE: 
     to_download = get_more_urls(BATCH_SIZE) 

    if threading.activeCount() < NUM_THREADS: 
     for thread in threads: 
     if not thread.isAlive(): 
      print "Respawning..." 
      thread.join() 
      threads.remove(thread) 
      t = ClientThread(queue) 
      t.start() 
      threads.append(t) 

    time.sleep(0.5) 

और ClientThread का सार है:

यहाँ माता पिता प्रक्रिया है:

class ClientThread(threading.Thread): 

    def __init__(self, queue): 
    threading.Thread.__init__(self) 
    self.queue = queue 

    def run(self): 
    while True: 
     try: 
     self.url, self.url_id = self.queue.get() 
     except: 
     raise SystemExit 

     html = StringIO.StringIO() 
     curl = pycurl.Curl() 
     curl.setopt(pycurl.URL, self.url) 
     curl.setopt(pycurl.NOSIGNAL, True) 
     curl.setopt(pycurl.WRITEFUNCTION, html.write) 
     curl.close() 

     try: 
     curl.perform() 
     except pycurl.error, error: 
     errno, errstr = error 
     print errstr 

     curl.close() 

आप यहाँ कोड का एक सा देखना चाहते हैं तो यह का सार है

संपादित करें: ओह, ठीक है ... सवाल पूछना भूल गया ... स्पष्ट होना चाहिए: मेरी प्रक्रियाओं को क्यों मार दिया जाता है? क्या यह ओएस स्तर पर हो रहा है? कर्नेल स्तर? क्या यह खुले टीसीपी कनेक्शन की संख्या पर एक सीमा के कारण हो सकता है? क्या यह एक बार में चलने वाले धागे की संख्या पर एक सीमा है? cat /proc/sys/kernel/threads-max का आउटपुट 257841 है। तो ... मुझे नहीं लगता कि यह है ....

मुझे लगता है कि मुझे यह मिल गया है ... ठीक है ... मेरे पास मेरे ड्राइव पर कोई स्वैप स्थान नहीं है। क्या अब कुछ स्वैप स्पेस बनाने का कोई तरीका है? मैं फेडोरा 16 चला रहा हूं। वहां स्वैप था ... फिर मैंने अपनी सारी रैम को सक्षम किया और यह जादुई रूप से गायब हो गया। पीछा /var/log/messages मैं इस त्रुटि मिली:।

Mar 26 19:54:03 gazelle kernel: [700140.851877] [15961] 500 15961 12455  7292 1  0    0 postgres 
Mar 26 19:54:03 gazelle kernel: [700140.851880] Out of memory: Kill process 15258 (chrome) score 5 or sacrifice child 
Mar 26 19:54:03 gazelle kernel: [700140.851883] Killed process 15258 (chrome) total-vm:214744kB, anon-rss:70660kB, file-rss:18956kB 
Mar 26 19:54:05 gazelle dbus: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper) 
+1

'dmesg (8)' आउटपुट देखने के लिए जांचें अगर कर्नेल ने कोई जानकारी लॉग कर दी है। – sarnold

+0

धन्यवाद ... – KeatsKelleher

+0

'dmesg (8) 'में अंतिम प्रविष्टियां मेरे राउटर के साथ संबद्ध मेरे वाईफाई एडाप्टर से संबंधित हैं। ... जो घंटों पहले – KeatsKelleher

उत्तर

7

आप कर्नेल के चालू होने गए मेमोरी आउट (ओओएम) हैंडलर; यह चुनता है कि जटिल प्रक्रियाओं में कौन सी प्रक्रियाओं को मारना है को सबसे अधिक प्रभाव बनाने के लिए जितनी संभव हो सके उतनी प्रक्रियाओं को मारने के लिए कड़ी मेहनत करता है। क्रोम स्पष्ट रूप से कर्नेल के मानदंडों के तहत मारने के लिए सबसे अधिक आमंत्रित प्रक्रिया बनाता है।

आप /proc/[pid]/oom_score फ़ाइल के तहत proc(5) मैनपेज में मापदंड का एक सारांश देख सकते हैं:

/proc/[pid]/oom_score (since Linux 2.6.11) 
      This file displays the current score that the kernel 
      gives to this process for the purpose of selecting a 
      process for the OOM-killer. A higher score means that 
      the process is more likely to be selected by the OOM- 
      killer. The basis for this score is the amount of 
      memory used by the process, with increases (+) or 
      decreases (-) for factors including: 

      * whether the process creates a lot of children using 
      fork(2) (+); 

      * whether the process has been running a long time, or 
      has used a lot of CPU time (-); 

      * whether the process has a low nice value (i.e., > 0) 
      (+); 

      * whether the process is privileged (-); and 

      * whether the process is making direct hardware access 
      (-). 

      The oom_score also reflects the bit-shift adjustment 
      specified by the oom_adj setting for the process. 

आप यदि आप इसे एक है कि मार दिया जाता है होना चाहता हूँ अपने अजगर कार्यक्रम के लिए oom_score फ़ाइल समायोजित कर सकते हैं।

शायद बेहतर तरीका आपके सिस्टम में ओओएम-किलर को बुलाए जाने के समय को धक्का देने का प्रयास करने के लिए और अधिक स्वैप जोड़ रहा है। माना जाता है कि अधिक स्वैप होने का मतलब यह नहीं है कि आपका सिस्टम कभी भी स्मृति से बाहर नहीं होगा - और यदि आप बहुत सारे स्वैप यातायात के जरिए इसे संभालने के तरीके की परवाह नहीं करते हैं - लेकिन यह आपको कम से कम तंग कर सकता है स्मृति समस्याएं

आप पहले से ही स्वैप विभाजन के लिए सभी जगह उपलब्ध आवंटित है, तो आप स्वैप फ़ाइलों जोड़ सकते हैं। क्योंकि वे फाइल सिस्टम के माध्यम से जाते हैं, स्वैप फाइलों के लिए स्वैप फ़ाइलों के लिए अधिक ओवरहेड होता है, लेकिन ड्राइव के विभाजन के बाद आप उन्हें जोड़ सकते हैं, जिससे यह एक आसान शॉर्ट-टर्म समाधान बन सकता है। आप फ़ाइल आवंटित करने के लिए (seek उपयोग नहीं करते स्पार्स फ़ाइल बनाने के लिए) और फिर mkswap(8) का उपयोग स्वैप उपयोग के लिए फ़ाइल प्रारूपित, तो उस विशिष्ट फ़ाइल को चालू करने के swapon(8) का उपयोग dd(1) आदेश का उपयोग करें। (मुझे लगता है कि आप अगली रीबूट पर स्वचालित रूप से उपलब्ध कराने के लिए fstab(5) पर स्वैप फ़ाइलों को भी जोड़ सकते हैं, लेकिन मैंने कभी भी कोशिश नहीं की है और सिंटैक्स नहीं जानते हैं।)

+0

धन्यवाद, आदमी :) यह है! – KeatsKelleher

0

आप एक

raise SystemExit 

जो वास्तव में अजगर दुभाषिया और नहीं धागा आप में चल रहे हैं बाहर निकल जाता है कर रहे हैं

+0

था ठीक है, यह स्पष्ट नहीं करता है कि एक पूरी तरह से अलग प्रक्रिया क्यों मर जाती है। उपरोक्त संपादन देखें। – KeatsKelleher

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