2010-11-22 6 views
2

GNU/Linux의 에서 I/O 집중 프로그래밍을 수행합니다.에서 모든 I/O 호출을 추적하고 응용 프로그램이 소비하는 시간을 알고 싶습니다. 사방 gettimeoftheday 사용하는 DIY 방식에서 각 호출io 시스템 호출의 타이밍을 추적하는 도구

아파트에 대한 IO를 기다리고, 자고, 그렇게 할 수있는 몇 가지 도구가 있습니까? 서로 통화를 구분할 수 있기를 바랍니다. 유용한 것 출력의

예 :

 
sendto at myprog.c:42 : 30µs 
recvfrom at myprog.c:48 : 45µs 
... 

참고 : 제가 원하는 것은 실시간으로, 일반적으로 제공 프로파일과 같은하지의 CPU 시간입니다.

감사

+0

어떤 OS? 예 : Mac OS X에는 이러한 종류의 작업을 수행하는 "Instruments"가 있습니다. –

+0

주제에서 다소 벗어나지 만,이 경우 Google에서 높은 결과를 얻습니다. 정확히 python''에서 작업을 수행하려면, 당신은 strace를 당신을 제공합니다 타이밍 옵션에 깊은 봐이 도구 http://mg.pov.lt/blog/you-gotta-love-profiling.html – Falmarri

답변

3

strace 명령은 당신이 필요로하는 무엇을해야 할 옵션 -T 있습니다. 소스 코드를 확인한 후 gettimeofday (2)을 호출하여 시간을 얻으므로 CPU 시간이 아닌 벽시계 시간을보고합니다. 내 컴퓨터에 strace -p 2956 -T에서

예 출력 :

stat("/proc/sys/fs/binfmt_misc", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0 <0.000028> 
stat("/media/Klatch", {st_mode=S_IFDIR|0711, st_size=4096, ...}) = 0 <0.000021> 
stat("/media/Drum", {st_mode=S_IFDIR|0711, st_size=4096, ...}) = 0 <0.000021> 
close(18)        = 0 <0.000019> 
munmap(0x7fa088e60000, 4096)   = 0 <0.000022> 
open("/etc/mtab", O_RDONLY)    = 18 <0.000024> 
fstat(18, {st_mode=S_IFREG|0644, st_size=742, ...}) = 0 <0.000015> 

시간은 초, 줄의 끝에서입니다. 위의 예에서 시스템 콜은 15 ~ 28 마이크로 초입니다.

+0

을 확인할 수 있습니다. 절대, 상대 및 누적 타이머 모드가 있습니다. 그들은 모두 좋은 용도를 가지고 있습니다. – Marcin

+0

그래, 디버깅 기호를 사용하여 소스 코드의 어느 줄에서 호출이 발생했는지 알 수 없다는 것이 너무 좋았다. –

+1

@Jocelyn : strace'-i' 옵션과'addr2line -fe' 옵션을 조합해서 처리해야합니다. – ninjalj

0

어떤 이상한 이유로, 모두가 너무 간단한 (그리고 추한) 어쩌면 때문에, 알고, 스위스 - 군대 칼이있다. GDB와 just pause it을 10 번처럼 몇 번 실행하십시오. 매번 호출 스택을 연구하십시오.

시간의 50 %가 I/O 인 경우 샘플의 50 % +/-가 I/O에 표시되며 호출 스택의 각 코드 줄에 왜 체인이 표시됩니까? 그것은 I/O를하고 있습니다. 수면 또는 다른 차단 전화와 동일합니다. 거대한 배열을 버블 정렬하는 것처럼 시간이 막히지 않으면 그걸 보여줄 것이고 그 이유도 알 수 있습니다. 어떤 시스템 라이브러리에서 시간을 보내고 차단되었거나 그렇지 않은지 알지 못하는 경우 (또는주의) 동일한 거래. 다른 프로세스가 CPU 시간의 일부를 사용하고 있기 때문에 더 오래 복용하면 이들은 매우 많은 코드를 백분율을 기준으로 그 시간을 보낸다 방법을 변경하지 않기 때문에

, 그건 중요하지 않습니다. 입출 력, 수면 또는 사각 지대를 백분율별로, 정확히 왜 알아낼 수 있습니다. 당신이 예뻐 무언가를 원하는 경우에

, 정말 더 이상 효과적이지 불구하고, Zoom 시도를 제공합니다.

+0

좋은 속임수이지만, 타이밍을 얻는 것이 진짜 필요합니다. –

+0

@Jocelyn : 루틴 X에 대한 호출을 N 건받을 수 있습니까? 총 시간에 X가 활성 시간의 분수를 곱한 값을 N으로 나눈 값은 대략 호출 당 평균 시간입니다. 서투른,하지만 거기있다. –

관련 문제