예를 들어 모든 Apache 인스턴스를 추적하는 데 사용할 수 있는 perf trace
오버헤드가 낮은 대안은 다음과 같습니다.strace
perf trace -p $(pidof apache2 | tr ' ' ',')
최대 10초 동안만 추적을 실행합니다.
perf trace -p $(pidof apache2 | tr ' ' ',') -- sleep 10
몇 가지 출력 예:
server ~ # perf trace -p $(pidof apache2 | tr ' ' ',') -- sleep 10 2>&1 | head
? ( ): apache2/8661 ... [continued]: poll()) = 0 Timeout
0.022 ( 0.005 ms): apache2/8661 close(fd: 28 ) = 0
0.066 ( 0.007 ms): apache2/8661 read(fd: 13<pipe:[3452760950]>, buf: 0x7ffe815038ff, count: 1 ) = -1 EAGAIN Resource temporarily unavailable
? ( ): apache2/26492 ... [continued]: semop()) = 0
0.088 ( ): apache2/8661 semop(semid: 557481986, tsops: 0x7f846e0cfd6c, nsops: 1 ) ...
? ( ): apache2/7580 ... [continued]: epoll_wait()) = 1
46.136 ( ): apache2/26492 epoll_wait(epfd: 27<anon_inode:[eventpoll]>, events: 0x7f846dd0c698, maxevents: 5, timeout: 10000) ...
46.081 ( 0.013 ms): apache2/7580 accept4(fd: 12<socket:[3452759675]>, upeer_sockaddr: 0x7ffe81503830, upeer_addrlen: 0x7ffe81503810, flags: 524288) = 28
46.100 ( 0.010 ms): apache2/7580 semop(semid: 557481986, tsops: 0x7f846e0cfd60, nsops: 1 ) = 0
46.116 ( 0.002 ms): apache2/7580 getsockname(fd: 28<socket:[3465711918]>, usockaddr: 0x7f846dd0a130, usockaddr_len: 0x7f846dd0a110) = 0
이것은 예상대로 작동합니다. 이제 나중에 자세히 분석할 수 있도록 이러한 이벤트를 파일에 기록하고 싶습니다. 나는 perf trace record
이것을 예상했지만 이것이 올바르게 문서화되어 있는지조차 확신할 수 없습니다.
server ~ # perf trace record -p $(pidof apache2 | tr ' ' ',') -- sleep 10
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0,312 MB perf.data (67 samples) ]
perf trace ... | wc -l
총 행 수는 약 12,000개인데 왜 record
67개의 샘플만 기록됩니까?
이 파일을 읽는 올바른 명령이 무엇인지조차 확신할 수 없습니다. 불행하게도 매뉴얼 페이지에는 이에 대한 내용이 나와 있지 않습니다. 나는 그것이라고 가정하고 있지만 perf trace -i perf.data
아무것도 인쇄하지 않습니다.
server ~ # perf trace -i perf.data
server ~ #
perf script
뭔가를 인쇄하지만 출력처럼 보이지는 않습니다 perf trace
.
server ~ # perf script | head
apache2 10215 [002] 29556325.787512: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 20085 [006] 29556325.787597: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 20754 [000] 29556325.790512: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 7580 [007] 29556325.790757: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 8661 [001] 29556325.796044: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 10215 [006] 29556325.796845: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 20085 [004] 29556325.798481: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 10215 [004] 29556325.802922: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 20754 [001] 29556325.815999: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
apache2 20085 [003] 29556325.816025: 1 cycles:ppp: ffffffff83e5a704 native_write_msr+0x4 ([kernel.kallsyms])
답변1
귀하의 직감은 정확합니다. perf trace record
데이터가 충분하지 않습니다.man perf-trace
자체적으로 처리하는 것이 좋지만 시스템 호출을 기록해야 합니다.
perf trace record -e 'raw_syscalls:*' ...
그 다음에
perf trace -i perf.data
예상대로 작동합니다.