2013-11-01 5 views
11

현재 테스트중인 PostgreSQL 빌드에서 팬텀 입/출력을 추적하려고합니다. 다중 프로세스 서버이므로 디스크 입출력을 특정 백엔드 및 쿼리와 다시 연관시키는 것은 간단하지 않습니다.perf에서 사용자 공간 스택 정보 가져 오기

Linux의 perf 도구가 이상적이라고 생각했지만 I/O 성능 카운터 메트릭을 캡처하여 사용자 공간 작업과 연결하는 데 어려움을 겪고 있습니다.

이 기록 블록 I/O 요청과와 완료, 예를 쉽게 :

sudo perf record -g -T -u postgres -e 'block:block_rq_*' 

과 사용자 공간 PID가 기록되어 있지만 커널 또는 사용자 공간 캡처 스택, 또는 스냅 샷을 할 수있는 능력이 없다 비트, 사용자 공간 프로세스의 힙 (예 : 쿼리 텍스트) 등. 그래서 당신이 PID를 가지고있는 동안, 당신은 그 시점에서 프로세스가 무엇을했는지 모릅니다. 같은 단지 perf script 출력 : 나는 perf record-g 플래그를 추가하는 경우

postgres 7462 [002] 301125.113632: block:block_rq_issue: 8,0 W 0() 208078848 + 1024 [postgres] 

IT는 커널 스택의 스냅 샷을 찍 겠지만, 커널에서 캡처 반환 한 이벤트를 사용자 공간의 상태를 캡처하지 않습니다. 사용자 공간 스택은 LWLockRelease, LWLockAcquire, memcpy

__GI___libc_write (IO를 확실히 mmap) 겠어요 - 같이, 사용자 공간에서 항목 점까지 간다 어떤 팁? 사용자 공간 커널 이벤트에 대한 응답으로 사용자 공간의 스냅 샷을 캡처하는 것이 이상적입니다.

성능 버전 3.10.9-200.fc19.x86_64 인 Fedora 19, 3.11.3-201.fc19.x86_64, Schrödinger 's Cat입니다. 이 몇 가지 부분이있는 것처럼

+0

이렇게 되 돌리면 frace/systemtap/uprobes/...를 대신 사용할 수 있습니다. 2014 년 linux.conf.au에서 systemtap이이 시점에서보다 쉽게 ​​이것을 할 수 있다고 제안했습니다. –

답변

15

확인, 같습니다

  • 나는 대부분의 배포판은 기본적으로 -fomit-frame-pointer 빌드 x86_64에,에있어

    perf 프레임 포인터없이 스택을 따라 갈 수 없어이;

  • .... libunwind을 지원하는 최신 버전이 아닌 경우 perf record -g dwarf을 지원합니다.

참조 :

나는 페도라 18 만 the same issue applies에 있어요. 따라서 작업중인 코드를 프로파일 링하는 경우 (스택 오버플로 가능성이 있음) -fno-omit-frame-pointer-ggdb으로 다시 작성하십시오.적절한 kernel-.....src.rpm SRPM

  • rpmdev-setuptree
    • sudo yum build-dep perf
    • sudo yum install yum-utils rpmdevtools libunwind-devel
    • yumdownloader --source perf 또는 다운로드 : 나는 주식 RPM을 비교 할 수 있기를 원하기 때문에

      나는 perf 재건까지 도착 rpm -Uvh kernel-*.src.rpm

    • 당신은 단지 새로운 perf을 구축 할 수 있습니다이 시점에서 rpmbuild -bp --target=$(uname -m) kernel.spec

    6,

  • cd $HOME/rpmbuild/SPECS
  • 당신이 원하는 경우 : 내가 한

    • cd $HOME/rpmbuild/BUILD/kernel-*/linux-*/tools/perf
    • make

    ... 테스트 한 결과 업데이트 된사실은 libunwind를 사용하여 빌드 된 경우 유용한 스택을 캡처합니다.

    당신은 또한 새로운 rpm으로 구축 할 수 있습니다 :

    • 편집 kernel.spec을 줄 %define buildid ...의 주석, 변화는 .perfunwind 같은 것으로 buildid. 그것은 %define이 아니라 % define입니다.

      %global perf_make \ 
      make %{?_smp_mflags} -C tools/perf -s V=1 WERROR=0 NO_LIBUNWIND=1 HAVE_CPLUS_DEMANGLE=1 NO_GTK2=1 NO_LIBNUMA=1 NO_STRLCPY=1 prefix=%{_prefix} 
      

      NO_LIBUNWIND=1

    • rpmbuild -bb --without up --without mp --without pae --without debug --without doc --without headers --without debuginfo --without bootwrapper --without with_vdso_install --with perf kernel.spec 전체 커널을 구축하지 않고 새로운 perf RPM을 생산하기 위해 삭제 :

      같은 사양 파일에서
    • , 찾을 수 있습니다. 당신이 원하는 경우 또는, 당신은 또한 the fedora project guide on building a custom kernel 참조 등 헤더, 따라서 debuginfo,

    • sudo rpm -Uvh $HOME/rpmbuild/RPMS/x86_64/perf-*.fc19.x86_64.rpm

    을 구축 할 것입니다 경우에 당신이 원하는 커널 맛의 --without를 생략합니다.

    나는이 문제를 페도라에게보고했다. 그들은 NO_LIBUNWIND=1을 사용하면 안됩니다. bug 1025603을 참조하십시오.

    perf을 다시 작성한 경우 perf record -g dwarf을 사용하여 전체 스택을 얻을 수 있습니다.

  • +0

    매우 철저하고 계몽! –

    +1

    @ErwinBrandstetter 다음 블로그 게시물을 좋아할 수도 있습니다. http://blog.2ndquadrant.com/tracing-postgresql-perf/ –