2012-03-26 34 views
6

Đây là điều kỳ lạ nhất!Hệ điều hành bắt đầu quá trình giết khi quá trình python đa luồng chạy

Tôi có ứng dụng khách đa luồng được viết bằng Python. Tôi đang sử dụng luồng để đồng thời tải xuống và xử lý các trang. Tôi sẽ sử dụng đa xử lý cURL ngoại trừ nút cổ chai chắc chắn là bộ vi xử lý (không phải băng thông) trong ứng dụng này vì vậy nó là hiệu quả hơn để sử dụng một hồ bơi thread.

Tôi có RAM 64 GB i7 rocking 16 GB. Thịt bò. Tôi khởi động 80 chủ đề trong khi nghe Pandora và trolling Stackoverflow và BAM! Quá trình cha mẹ đôi khi kết thúc với thông điệp

Killed

lần khác một trang duy nhất (mà là đó là quá trình riêng trong Chrome) sẽ chết. Lần khác toàn bộ trình duyệt bị treo.

Nếu bạn muốn xem một chút mã ở đây là các ý chính của nó:

Đây là quá trình cha mẹ:

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) 

Và đây là ý chính của 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() 

EDIT: Ồ, phải ... quên đặt câu hỏi ... nên rõ ràng: Tại sao các quy trình của tôi bị giết? Có phải nó đang xảy ra ở cấp hệ điều hành không? Cấp hạt nhân? Đây có phải là do hạn chế về số lượng kết nối TCP mở mà tôi có thể có không? Có giới hạn số lượng chủ đề tôi có thể chạy cùng một lúc không? Đầu ra của cat /proc/sys/kernel/threads-max257841. Vì vậy ... Tôi không nghĩ rằng đó là ....

Tôi nghĩ rằng tôi đã có nó ... OK ... Tôi không có không gian trao đổi ở tất cả trên ổ đĩa của tôi. Có cách nào để tạo không gian hoán đổi không? Tôi đang chạy Fedora 16. Có trao đổi ... sau đó tôi kích hoạt tất cả RAM của tôi và nó biến mất một cách kỳ diệu. Tailing /var/log/messages tôi thấy lỗi này:.

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

Kiểm tra đầu ra 'dmesg (8)' để xem nếu hạt nhân đăng nhập bất kỳ thông tin nào. – sarnold

+0

Cảm ơn ... sẽ làm ... – KeatsKelleher

+0

mục cuối cùng trong 'dmesg (8)' liên quan đến bộ điều hợp wifi của tôi kết hợp với bộ định tuyến của tôi. ... đó là giờ trước đây – KeatsKelleher

Trả lời

7

Bạn đã kích hoạt của hạt nhân Bộ xử lý Out of Memory (OOM); nó chọn các quy trình để giết theo một cách phức tạp mà cố gắng khó để giết càng ít quy trình càng tốt để tạo ra tác động nhiều nhất. Chrome dường như là quá trình hấp dẫn nhất để giết theo các tiêu chí mà hạt nhân sử dụng.

Bạn có thể thấy một bản tóm tắt của các tiêu chí trong proc(5) manpage dưới file /proc/[pid]/oom_score:

/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. 

Bạn có thể điều chỉnh các tập tin oom_score cho chương trình Python của bạn nếu bạn muốn nó trở thành một trong đó là bị giết.

Có lẽ cách tiếp cận tốt hơn là thêm hoán đổi nhiều hơn vào hệ thống của bạn để cố gắng giảm thời gian khi kẻ giết người OOM được gọi. Cấp, trao đổi nhiều hơn không nhất thiết có nghĩa là hệ thống của bạn sẽ không bao giờ hết bộ nhớ - và bạn có thể không quan tâm đến cách nó xử lý nếu có nhiều lưu lượng trao đổi - nhưng ít nhất bạn cũng có thể vấn đề bộ nhớ.

Nếu bạn đã phân bổ tất cả dung lượng có sẵn cho phân vùng trao đổi, bạn có thể thêm trao đổi tệp. Bởi vì chúng đi qua hệ thống tập tin, có nhiều chi phí cho các tệp hoán đổi hơn các phân vùng trao đổi, nhưng bạn có thể thêm chúng sau khi ổ đĩa được phân vùng, làm cho nó trở thành một giải pháp ngắn hạn dễ dàng. Bạn sử dụng lệnh dd(1) để phân bổ tệp (không sử dụng seek để tạo tệp thưa thớt) và sau đó sử dụng mkswap(8) để định dạng tệp để sử dụng trao đổi, sau đó sử dụng swapon(8) để bật tệp cụ thể đó. (Tôi nghĩ bạn thậm chí có thể thêm các tệp hoán đổi vào fstab(5) để làm cho chúng tự động có sẵn khi khởi động lại tiếp theo, nhưng tôi chưa bao giờ thử và không biết cú pháp.)

+0

Cảm ơn, người đàn ông :) Đây là nó! – KeatsKelleher

0

Bạn đang làm một

raise SystemExit 

mà thực sự thoát trình thông dịch Python và không phải là chủ đề mà bạn đang chạy trong

+0

Đó là tốt, nó không giải thích lý do tại sao một quá trình hoàn toàn riêng biệt chết. Xem chỉnh sửa ở trên. – KeatsKelleher

Các vấn đề liên quan