2016-04-12 25 views
5

Tôi chưa tìm thấy cách tốt để giám sát việc sử dụng bộ nhớ của tập lệnh Python bằng cách sử dụng multiprocessing. Cụ thể hơn, nói rằng tôi làm điều này:Đa xử lý Python - Cách giám sát việc sử dụng bộ nhớ?

import time 

biglist = range(pow(10, 7)) 
time.sleep(5) 

Việc sử dụng bộ nhớ là 1.3 GB, được đo bằng cả /usr/bin/time -vtop. Nhưng bây giờ, nói rằng tôi làm điều này:

import time 
from multiprocessing import Pool 

def worker(x): 
    biglist = range(pow(10, 7)) 
    time.sleep(5) 
    return 

Pool(5).map(worker, range(5)) 

Hiện tại top báo cáo 5 x 1,3 GB, điều này là chính xác. Nhưng /usr/bin/time -v vẫn báo cáo 1,3 GB, điều này không có ý nghĩa. Nếu nó đang đo lường mức tiêu thụ của quá trình cha mẹ, sau đó nó sẽ nói 0. Nếu nó được đo lường cha mẹ và trẻ em, sau đó nó phải báo cáo 5 x 1,3 GB. Tại sao nó nói 1,3 GB? Bây giờ, hãy thử copy-on-write:

import time 
from multiprocessing import Pool 

biglist = range(pow(10, 7)) 

def worker(x): 
    time.sleep(5) 
    return 

Pool(5).map(worker, range(5)) 

Bây giờ /usr/bin/time -v báo cáo 1,3 GB (lần nữa), điều này là đúng. Nhưng top báo cáo 6 x 1,3 GB, không chính xác. Với copy-on-write, nó chỉ nên báo cáo 1,3 GB.

Tôi có thể theo dõi đáng tin cậy cách sử dụng bộ nhớ của tập lệnh Python bằng cách sử dụng multiprocessing?

Trả lời

0

Nó thực sự phụ thuộc vào ý nghĩa của "đáng tin cậy". Bạn có thể muốn sử dụng lệnh pmap <pid> để nhận thống kê về việc sử dụng bộ nhớ của các quy trình (Tôi đoán bạn quan tâm đến trường total). Bạn cần phải theo dõi tất cả các quy trình đã được tạo trong khi thực hiện chương trình của bạn (tôi đoán ps --forest có thể giúp bạn ở đây).

Nếu bạn muốn nhận thông tin chi tiết, thì bạn có thể muốn sử dụng /proc/[pid]/{smaps,status,maps} (man pages).

Đồng thời hãy nhớ về sự khác biệt giữa RSS and VSZ.

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