2010-07-28 4 views
3

페이지 오류에 대한 문서를 작성 중이며 작동 할 구체적인 번호를 얻으려고하므로 12 * 1024 * 1024 바이트의 데이터를 읽는 간단한 프로그램을 작성했습니다. 간편 :디스크에서 페이지를 폴트 할 때 (OS X) dtrace 프로브가 작동합니까?

int main() 
{ 
    FILE*in = fopen("data.bin", "rb"); 
    int i; 
    int total=0; 
    for(i=0; i<1024*1024*12; i++) 
    total += fgetc(in); 
    printf("%d\n", total); 
} 

그렇기 때문에 전체 파일을 읽습니다. 문제는이 과정에서 1536 번 발사 될 dtrace 프로브가 필요하다는 것입니다 (12M/8k). 모든 fbt : mach_kernel : vm_fault * : 프로브와 vminfo ::: 프로브를 모두 계산하더라도 500을 치지 않으므로 올바른 프로브를 찾지 못한다는 것을 알고 있습니다.

페이지가 디스크에서 오류가 발생한 경우 실행되는 dtrace 프로브를 어디에서 찾을 수 있습니까?

는 UPDATE :

int main() 
{ 
    int in = open("data.bin", O_RDONLY | O_NONBLOCK); 
    int i; 
    int total=0; 
    char buf[128]; 
    for(i=0; i<1024*1024*12; i++) 
    { 
    read(in, buf, 1); 
    total += buf[0]; 
    } 
    printf("%d\n", total); 
} 

이 버전은 훨씬 더 오래 걸립니다 : 문제가 몇 가지 지능 프리 페칭이 표준 입출력 기능에 어떤 일이 일어나고 있다는 것을 것을 오프 기회에

, 나는 다음과 같은 시도 (42s 실시간, 10s는 사용자 였고 나머지는 시스템 시간 오류 였고, 나는 추측하고있다.) 그러나 예상했던 것보다 5 분의 1 많은 오류를 생성한다.

흥미로운 점은 루프 오버 헤드와 캐스팅 (int에서 char)으로 인한 시간 증가가 아니라는 것입니다. 이러한 동작을 수행하는 코드 버전의 시간은 0.07 초입니다.

+0

... 그리고 후속 질문 ... 왜 dtrace 질문은 항상 "chirping crickets"범주에 들지 않습니까? 필자는 dtrace 프로브에 대한 유일한 실제 문서가 OS X이 드물게 배포하는 커널 소스에 있기 때문이라고 생각합니다. 이것이 솔라리스 상자에서 dtrace를 사용하는 것을 선호하는 이유입니다. 따라서 Open Solaris에서 필요한 것을 파헤 칠 수 있습니다. – Sniggerfardimungus

+0

FreeBSD에서'dtrace'를 시도해 볼 수도 있습니다 :) –

답변

1

직접적인 대답은 아니지만 디스크 읽기와 페이지 결함을 동일시하는 것으로 보입니다. 반드시 같을 필요는 없습니다. 코드에서 파일의 데이터를 작은 사용자 메모리 덩어리로 읽으므로 I/O 시스템은 버퍼/VM 캐시에 맞는 방식으로 파일을 읽을 수 있습니다. 나는 틀렸을 수도 있습니다. 다윈이 어떻게하는지 모르겠습니다.

신뢰할 수있는 테스트가 전체 메모리에 mmap(2)이 될 것이라고 생각하고 각 페이지를 터치하면 그 공간이 이동합니다.

+0

왜 읽기가 강제로 오류를 일으킨다 고 가정하고 있었는지 전혀 모르겠습니다. 당신은 mmap으로 죽었고, 나는 더 잘 알려야했습니다. – Sniggerfardimungus

0

별도의 작업으로 터치되는 모든 페이지에서 운영 체제가 작동하지 않는다는 가정하에 (따라서 N 페이지를 터치하면 DTrace 프로브가 N 번 실행 됨) 결함이 발생합니다. 대부분의 UN * Xes는 일종의 미리 읽기 또는 사전 오류를 수행 할 것이고 페이지가있는 것과 정확히 동일한 수의 전화를받을 가능성은 거의 없습니다. mmap()을 직접 사용하는 경우에도 마찬가지입니다.

정확한 비율은 파일 시스템에 따라 달라질 수 있습니다. 미리보기 및 페이지 클러스터링 구현과 임계 값은 모두 동일하지 않을 수 있습니다.

mmap을 직접 사용하고 madvise (MADV_DONTNEED) 또는 유사 항목을 적용하거나 msync (MS_INVALIDATE)로 전체 범위를 제거하는 경우 페이지 별 오류 정책을 적용 할 수 있습니다.

1

나는 최근에 같은 녀석을 쓰러 뜨렸다. 지금 당장 사용할 수있는 DTrace 스크립트 나 테스트 프로그램이 없지만 다음과 같은 조언을 해드릴 것입니다 :

1) 1. Amit Singh의 OS X Internals와 가상 메모리의 8.3 절을 읽으십시오. DTrace 프로브 선택에 대한 올바른 참조 프레임을 제공합니다).

2.) Solaris Performance and Tools에서 Brendan Gregg/Jim Mauro의 도움을 받으십시오. 가상 메모리에 대한 절을 읽고 vminfo 공급자를 사용하는 예제 DTrace 스크립트에 세심한주의를 기울이십시오.

3.) OS X은 확실히 파일 시스템에서 많은 양의 페이지를 프리 페치하고 있으며, 테스트 프로그램은 순차적으로 읽었으므로이 최적화 작업을 수행하고 있습니다. 흥미롭게도 솔라리스의 경우는 아닙니다. 프리 페치를 무효화하기 위해 무작위로 빅 어레이에 액세스하십시오.