2016-07-13 35 views
7

我有一個實用工具,它使用Python multiprocessing模塊生成多個工作人員,我希望能夠通過出色的memory_profiler實用程序跟蹤他們的內存使用情況,該工具可以完成我想要的任何事情 - 尤其是隨着時間的推移對內存使用情況進行採樣並繪製最終結果(我不關心這個問題的逐行內存分析)。如何使用Python多處理和memory_profiler來分析多個子進程?

爲了設置這個問題,我創建了一個更簡單的腳本版本,它具有一個工作函數,用於分配類似於memory_profiler庫中給出的example的內存。工人如下:

import time 

X6 = 10 ** 6 
X7 = 10 ** 7 

def worker(num, wait, amt=X6): 
    """ 
    A function that allocates memory over time. 
    """ 
    frame = [] 

    for idx in range(num): 
     frame.extend([1] * amt) 
     time.sleep(wait) 

    del frame 

鑑於4名工人的順序工作量如下:

if __name__ == '__main__': 
    worker(5, 5, X6) 
    worker(5, 2, X7) 
    worker(5, 5, X6) 
    worker(5, 2, X7) 

運行爲每個工人運行一前一後的mprof可執行文件來分析我的腳本需要70秒。該腳本,運行如下:

$ mprof run python myscript.py 

產生如下的內存使用情況圖:

Sequential Memory Generating Workers

說完這些工人並行去multiprocessing意味着腳本將完成最慢的工人一樣慢(25秒)。該腳本如下:

import multiprocessing as mp 

if __name__ == '__main__': 
    pool = mp.Pool(processes=4) 
    tasks = [ 
     pool.apply_async(worker, args) for args in 
     [(5, 5, X6), (5, 2, X7), (5, 5, X6), (5, 2, X7)] 
    ] 

    results = [p.get() for p in tasks] 

存儲器剖析確實工作,或者至少有使用mprof時沒有錯誤,但結果是有點奇怪:

enter image description here

快速查看活動監視器顯示實際上有6個Python進程,一個用於mprof一個用於python myscript.py,然後每個工作程序子進程一個。看起來mprof僅測量python myscript.py進程的內存使用情況。

Python Processes in Activity Monitor

memory_profiler庫是高度可定製的,我很有信心,我應該能夠捕捉到每一個進程的內存,並有可能把它們寫出來,通過使用圖書館本身分開日誌文件。我只是不確定從哪裏開始或如何接近這個級別的定製。

編輯

通過mprof劇本我確實發現了-C標誌,它概括了所有的孩子(叉)進程的內存使用量看完。這導致了(很大的改善)圖如下:

Multiprocessing Workers with Include Children Flag

但是我正在尋找的是隨着時間的推移每個單獨的子進程的內存使用情況,以便我可以積所有工人(和主)在同一張圖上。我的想法是將每個子進程memory_usage寫入不同的日誌文件,然後我可以將其視覺化。

+0

這個問題正在與GitHub上的開發人員討論,如果有人感興趣,可以在https://github.com/fabianp/memory_profiler/issues/118上找到。 – bbengfort

回答

1

截至今天,內存分析器庫中增加了一項新功能,可以完全實現這一點。如果您需要此功能,首先更新memory_profiler如下:

$ pip install -U memory_profiler 

這應該安裝內存分析器的v0.44版本。要檢查這種情況下,在運行操作使用help命令:

mprof run --help 
Usage: mprof run [options] 

Options: 
    --version    show program's version number and exit 
    -h, --help   show this help message and exit 
    --python    Activates extra features when the profiling executable 
         is a Python program (currently: function 
         timestamping.) 
    --nopython   Disables extra features when the profiled executable 
         is a Python program (currently: function 
         timestamping.) 
    -T INTERVAL, --interval=INTERVAL 
         Sampling period (in seconds), defaults to 0.1 
    -C, --include-children 
         Monitors forked processes as well (sum up all process 
         memory) 
    -M, --multiprocess Monitors forked processes creating individual plots 
         for each child 

如果你看到-M標誌,那麼你是好去!

然後,您可以運行該腳本如下:

$ mprof run -M python myscript.py 
$ mprof plot 

,你應該得到一個數字,看起來像這樣:

mprof tracking individual child proccesses

請注意,如果您使用--include-children標誌作爲好的,主進程內存將是所有子進程和主進程的總內存使用量,這也是一個有用的圖。

+0

特別感謝@ fabian-pedregosa幫助實現這一目標! – bbengfort

+0

在這種模式下啓用時間戳和'@ profile'裝飾器怎麼樣?可能嗎? – petroslamb

+0

我不確定你的意思是啓用時間戳嗎?我認爲這應該可以用'@ profile'裝飾器來實現,它使用相同的參數。 – bbengfort

相關問題