2012-03-22 16 views
1

필자가 작성한 도구를 실행하는 몇 개의 프로세스가 파이프로 연결되어 있고 valgrind으로 수집 된 메모리 사용을 측정하고 싶습니다. 지금까지 내가 시도 뭔가 같은 : myProcesses.script 두 번 내 도구 foo의 동등한를 실행 예를 들어,valgrind로 파이프 된 명령의 메모리 사용량 추적

$ valgrind tool=massif trace-children=yes --peak-inaccuracy=0.5 --pages-as-heap=yes --massif-out-file=myProcesses".%p" myProcesses.script 

:

foo | foo > /dev/null 

Valgrind의 내가 기대하는이 방법의 수집 메모리 사용을 캡처하지 않는 것 같습니다. 이것을 추적하기 위해 top을 사용하면 첫 번째 foo에서 10 %의 메모리 사용을 얻고 myProcesses.script이 완료되기 전에 두 번째 foo에서 또 다른 10 %가 수집됩니다. 이것은 측정하고자하는 일종의 두 가지 프로세스의 사용법입니다.

Massif: ms_main.c:1891 (ms_new_mem_brk): Assertion 'VG_IS_PAGE_ALIGNED(len)' failed. 

(valgrind 사용) 나 파이프 방식으로 사용하고 명령에 대한 메모리 사용 데이터를 수집 할 수있는 방법이 있나요 : Valgrind의 대신 다음과 같은 오류를 반환? 또는 이러한 측정을 정확하게 자동화하는 데 사용할 수있는 유사한 도구입니까?

폴링하는 동안 top이 반환하는 숫자는 나에게 손으로 물결처럼 보입니다. 정확하고 반복 가능한 측정을 찾고 있습니다. 다른 도구에 대한 제안 사항이 있으면 환영 할 것입니다.

수정 - valgrind 옵션으로 오타가 수정되었습니다.

EDIT 2 - 어떤 이유로 인해 --pages-as-heap 옵션이 테스트중인 바이너리에 문제가있는 것으로 보입니다. 귀하의 예제가 잘 실행됩니다. 새 페이지는 인라인되지 않은 함수를 입력 할 때마다 만들어집니다 (스택 오버플로 - ㅎ). 우리는 그 수를 산정하려고했지만, 우리가 테스트중인 메모리 사용량의 규모면에서 그다지 중요하지 않습니다. (ls 또는 less에 함수 호출이없는 것 같습니다.) --pages-as-heap을 제거하면 테스트가 다시 작동하는 데 도움이됩니다. 큰 도움을 주신 MrGomez에게 감사드립니다.

+0

페이지 정렬 문제는 새 메모리 중단 점이 대용량으로 설정된 경우 페이징 동작이 실패한 것과 분명히 관련이 있습니다. 필자는이 문제를 재현 할 수는 없지만, 시스템에서의 호출과 관련하여'--pages-as-heap = yes'가 이에 책임이 있다고 추측합니다. 디버거에서 이것이 왜 타격을 받는지 확인하는 것이 오류 상황을 탐색하고자 할 때 가장 좋은 방법입니다. (내 대답을 아래 참조하십시오.) – MrGomez

답변

1

정오표에 표시된 valgrind 버전을 사용하면 Valgrind 3.6.1에 나와있는 것처럼 보입니다.내 호출 : 내 테스트 스크립트의

<me>@harley:/tmp/test$ /usr/local/bin/valgrind --tool=massif \ 
    --trace-children=yes --peak-inaccuracy=0.5 --pages-as-heap=yes \ 
    --massif-out-file=myProcesses".%p" ./testscript.sh 
==21067== Massif, a heap profiler 
==21067== Copyright (C) 2003-2010, and GNU GPL'd, by Nicholas Nethercote 
==21067== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==21067== Command: ./testscript.sh 
==21067== 
==21068== Massif, a heap profiler 
==21068== Copyright (C) 2003-2010, and GNU GPL'd, by Nicholas Nethercote 
==21068== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==21068== Command: /bin/ls 
==21068== 
==21070== Massif, a heap profiler 
==21070== Copyright (C) 2003-2010, and GNU GPL'd, by Nicholas Nethercote 
==21070== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==21069== Massif, a heap profiler 
==21069== Copyright (C) 2003-2010, and GNU GPL'd, by Nicholas Nethercote 
==21069== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==21069== Command: /bin/sleep 5 
==21069== 
==21070== Command: /usr/bin/less 
==21070== 
==21068== 
(END) ==21069== 
==21070== 
==21067== 

내용, testscript.sh : --massif-out-file=myProcesses".%p"에 의해 생성 된 파일 중 하나에서

ls | sleep 5 | less 

스파 스 내용 (myProcesses.21055) :

desc: --peak-inaccuracy=0.5 --pages-as-heap=yes --massif-out-file=myProcesses.%p 
cmd: ./testscript.sh 
time_unit: i 
#----------- 
snapshot=0 
#----------- 
time=0 
mem_heap_B=110592 
mem_heap_extra_B=0 
mem_stacks_B=0 
heap_tree=empty 
#----------- 
snapshot=1 
#----------- 
time=0 
mem_heap_B=118784 
mem_heap_extra_B=0 
mem_stacks_B=0 
heap_tree=empty 
... 
#----------- 
snapshot=18 
#----------- 
time=108269 
mem_heap_B=1708032 
mem_heap_extra_B=0 
mem_stacks_B=0 
heap_tree=peak 
n2: 1708032 (page allocation syscalls) mmap/mremap/brk, --alloc-fns, etc. 
n3: 1474560 0x4015E42: mmap (mmap.S:62) 
    n1: 1425408 0x4005CAC: _dl_map_object_from_fd (dl-load.c:1209) 
    n2: 1425408 0x4007109: _dl_map_object (dl-load.c:2250) 
    n1: 1413120 0x400CEEA: openaux (dl-deps.c:65) 
    n1: 1413120 0x400D834: _dl_catch_error (dl-error.c:178) 
     n1: 1413120 0x400C1E0: _dl_map_object_deps (dl-deps.c:247) 
     n1: 1413120 0x4002B59: dl_main (rtld.c:1780) 
     n1: 1413120 0x40140C5: _dl_sysdep_start (dl-sysdep.c:243) 
     n1: 1413120 0x4000C6B: _dl_start (rtld.c:333) 
      n0: 1413120 0x4000855: ??? (in /lib/ld-2.11.1.so) 
    n0: 12288 in 1 place, below massif's threshold (01.00%) 
    n0: 28672 in 3 places, all below massif's threshold (01.00%) 
    n1: 20480 0x4005E0C: _dl_map_object_from_fd (dl-load.c:1260) 
    n1: 20480 0x4007109: _dl_map_object (dl-load.c:2250) 
    n0: 20480 in 2 places, all below massif's threshold (01.00%) 
n0: 233472 0xFFFFFFFF: ??? 
#----------- 
snapshot=19 
#----------- 
time=108269 
mem_heap_B=1703936 
mem_heap_extra_B=0 
mem_stacks_B=0 
heap_tree=empty 
#----------- 
snapshot=20 
#----------- 
time=200236 
mem_heap_B=1839104 
mem_heap_extra_B=0 
mem_stacks_B=0 
heap_tree=empty 

대산 괴가 계속 내 파일의 나머지 부분에서 힙 할당에 대해 불평합니다. 이 오류는 사용자의 오류와 매우 유사합니다.

사용자의 valgrind 버전이 디버그 모드로 작성되어 어설 션이 발생한다고 이론화합니다. 출처에서 다시 작성 (this을 사용하여 기본값 : ./configure) 문제가 해결됩니다.

어느 쪽이든,이 seems to be expected with Massif.

+0

나는이 문제에 대한 복사 - 붙여 넣기에 오타를 만들었습니다. 내 테스트 스크립트는 실제로 추적 아동이 아니라 추적 어린이를 사용합니다. 이 오류를 발견해 주셔서 감사합니다. 오타를 수정하기 위해 질문을 편집했습니다. –

+0

문제 없습니다. 질문에 대한 답을 얻으려면 사용중인 'valgrind'버전도 포함하십시오. 이것은 파이프 라인 프로세스를 처리하기위한 'valgrind'기능이 부족하지 않은 것처럼 커맨드 라인이나 프로그램'foo'를 처리 할 때 문제가되는 것 같습니다. – MrGomez

+0

valgrind v3.6.1을 사용하고 있습니다. –

0

일부 프로그램이 libmemusage.so 라이브러리를 미리로드하고 메모리 할당을 기록 할당했는지에 대한 보고서 얻을 수 있습니다 :

$ LD_PRELOAD=libmemusage.so less /etc/passwd 

Memory usage summary: heap total: 36212, heap peak: 35011, stack peak: 15008 
     total calls total memory failed calls 
malloc|   39   5985    0 
realloc|   3    64    0 (nomove:2, dec:0, free:0) 
calloc|  238   30163    0 
    free|   51   11546 
Histogram for block sizes: 
    0-15   128 45% ================================================== 
    16-31    13 4% ===== 
    32-47   105 37% ========================================= 
    48-63    2 <1% 
    64-79    4 1% = 
    80-95    5 1% = 
    96-111    3 1% = 
    112-127    3 1% = 
    160-175    1 <1% 
    192-207    1 <1% 
    208-223    2 <1% 
    256-271    1 <1% 
    432-447    1 <1% 
    560-575    1 <1% 
    656-671    1 <1% 
    768-783    1 <1% 
    944-959    1 <1% 
1024-1039   2 <1% 
1328-1343   1 <1% 
2128-2143   1 <1% 
3312-3327   1 <1% 
7952-7967   1 <1% 
8240-8255   1 <1% 

나는 항상 작동하지 않는다는 것을 인정해야하지만를 - LD_PRELOAD=libmemusage.so ls 아무것도보고하지, 예를 들면 - 나는 그것이 작동하거나 작동하지 못하게하는 조건을 알고 있었으면 좋겠다.

+0

이것은 흥미 롭다. 나는 이것을 나의 특정 설정에 활용할 수있는 방법을 알고 싶다. 그래도 고마워! –