2016-07-13 4 views
7

저는 파이썬 multiprocessing 모듈을 사용하여 여러 명의 작업자를 생성하는 유틸리티를 가지고 있으며, 내가 원하는 모든 것을 해주는 우수한 memory_profiler 유틸리티를 통해 메모리 사용을 추적 할 수 있기를 바랍니다. 특히 시간이 지남에 따라 메모리 사용을 샘플링하고 최종 결과 (이 질문에 대해 줄 단위 메모리 프로파일 링에 관심이 없다).파이썬 다중 처리 및 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 초 실행합니다. 로 실행 스크립트는 다음과 같습니다 이러한 노동자 multiprocessing와 병렬로 이동 갖는 스크립트가 느린 노동자로 느린 완료된다는 것을 의미합니다

Sequential Memory Generating Workers

:

$ mprof run python myscript.py 

는 다음과 같은 메모리 사용량 그래프를 생성 (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

얼핏에서 Activity Monitor는 실제로 6 개의 파이썬 프로세스가 있음을 보여줍니다. 하나는 이고 하나는 python myscript.py이고 나머지 하나는 각 작업자 프로세스입니다. mprofpython myscript.py 프로세스의 메모리 사용량을 측정하는 것으로 나타납니다.

Python Processes in Activity Monitor

memory_profiler 라이브러리

은 매우 사용자 정의하고, 나는 각 프로세스의 메모리를 캡처 가능성이 라이브러리 자체를 사용하여 로그 파일을 분리하는 그들을 쓸 수 있어야 꽤 확신한다. 나는 어디서부터 시작해야하는지, 어떻게 그 수준의 커스터마이징에 접근해야하는지 확신 할 수 없다.

나는 모든 자식 (갈래) 프로세스의 메모리 사용량을 합산 -C 플래그를 발견했던 mprof 스크립트를 통해 읽은 후 편집

.

Multiprocessing Workers with Include Children Flag

을하지만 내가 찾는 것은 시간이 지남에 따라 각각의 서브 프로세스의 메모리 사용 나는 모든 근로자 (마스터)를 그릴 수 있도록입니다 다음과 같이 이것은 (많이 개선) 그래프로 연결 같은 그래프에. 내 생각은 각 서브 프로세스 memory_usage을 다른 로그 파일에 기록한 다음 시각화 할 수있게하는 것입니다.

+0

이 질문은 관심있는 사람이 있다면 https://github.com/fabianp/memory_profiler/issues/118의 GitHub 개발자와 논의 중입니다. – bbengfort

답변

1

오늘부터 정확히이 작업을 수행하는 메모리 프로파일 러 라이브러리에 새로운 기능이 추가되었습니다. 다음과 같이이 기능, 첫 번째 업데이트의 memory_profiler을해야하는 경우 :

$ pip install -U memory_profiler 

이 메모리 프로파일의 v0.44 릴리스를 설치해야합니다. 이런 경우가 확인하려면 실행 작업에 도움이 명령을 사용

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

이 모드에서 timestamp와'@ profile' 데코레이터를 활성화시키는 것은 어떻습니까? 가능한가? – petroslamb

+0

타임 스탬프를 활성화하는 것이 무슨 뜻인지 잘 모르겠습니다. 이것은'@ profile' 데코레이터에서 가능해야한다고 생각합니다. 동일한 인수를 사용합니다. – bbengfort