에 read()
을 사용하여 다른 크기의 파일 (1KB - 1GB)을 읽습니다. 그러나 언제든지 page-faults
을 사용하여 perf-stat
을 사용할 때마다 항상 거의 동일한 값을 갖습니다.read() 시스템 호출 페이지 오류는 파일 크기에 의존하지 않습니다.
내 기계 :(페도라 18 가상 머신에, RAM - 1GB의 디스크 공간 - 20기가바이트)
uname -a
Linux localhost.localdomain 3.10.13-101.fc18.x86_64 #1 SMP Fri Sep 27 20:22:12 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
mount | grep "^/dev"
/dev/mapper/fedora-root on/type ext4 (rw,relatime,seclabel,data=ordered)
/dev/sda1 on /boot type ext4 (rw,relatime,seclabel,data=ordered)
내 코드 :
10 #define BLOCK_SIZE 1024
. . .
19 char text[BLOCK_SIZE];
21 int total_bytes_read=0;
. . .
81 while((bytes_read=read(d_ifp,text,BLOCK_SIZE))>0)
82 {
83 write(d_ofp, text, bytes_read); // writing to /dev/null
84 total_bytes_read+=bytes_read;
85 sum+=(int)text[0]; // doing this just to make sure there's
// no lazy page loading by read()
// I don't care what is in `text[0]`
86 }
87 printf("total bytes read=%d\n", total_bytes_read);
88 if(sum>0)
89 printf("\n");
를 성능 -stat 출력 :(파일 크기, 파일 읽기 시간 및 페이지 오류 수 표시)
[read]: f_size: 1K B, Time: 0.000313 seconds, Page-faults: 150, Total bytes read: 980
[read]: f_size: 10K B, Time: 0.000434 seconds, Page-faults: 151, Total bytes read: 11172
[read]: f_size: 100K B, Time: 0.000442 seconds, Page-faults: 150, Total bytes read: 103992
[read]: f_size: 1M B, Time: 0.00191 seconds, Page-faults: 151, Total bytes read: 1040256
[read]: f_size: 10M B, Time: 0.050214 seconds, Page-faults: 151, Total bytes read: 10402840
[read]: f_size: 100M B, Time: 0.2382 seconds, Page-faults: 150, Total bytes read: 104028372
[read]: f_size: 1G B, Time: 5.7085 seconds, Page-faults: 148, Total bytes read: 1144312092
질문 :
1.하는 방법 1킬로바이트 & 1기가바이트의 크기의 파일 read()
의 페이지 폴트가 동일 할 수 있습니까? 데이터를 읽으므로 (코드 라인 # 84), 데이터가 인 것을 확인하고 실제로는을 읽습니다.
2. 데이터가 이미 메인 메모리에 존재하기 때문에 많은 페이지 폴트가 발생하지 않는다고 생각할 수있는 유일한 이유입니다. 이 경우 코드를 실행하면 실제로 페이지 오류가 표시되도록 플러시 할 수 있습니까? 그렇지 않으면 나는 사실의 성능을 read()
으로 측정 할 수 없습니다.
는 EDIT1 :
echo 3 > /proc/sys/vm/drop_caches
도움이되지 않습니다, 출력은 여전히 동일하게 유지됩니다.
Edit2가 : mmap
를 들어, perf-stat
의 출력은 다음과 같습니다
[mmap]: f_size: 1K B, Time: 0.000103 seconds, Page-faults: 14
[mmap]: f_size: 10K B, Time: 0.001143 seconds, Page-faults: 151
[mmap]: f_size: 100K B, Time: 0.002367 seconds, Page-faults: 174
[mmap]: f_size: 1M B, Time: 0.007634 seconds, Page-faults: 401
[mmap]: f_size: 10M B, Time: 0.06812 seconds, Page-faults: 2,688
[mmap]: f_size: 100M B, Time: 0.60386 seconds, Page-faults: 25,545
[mmap]: f_size: 1G B, Time: 4.9869 seconds, Page-faults: 279,519
도움이 될지 확실하지 않습니다. 무료 페이지 캐시로 : 에코 1> 변수/proc/sys/vm /는 drop_caches하지 무료 dentries와 아이 노드로 : 에코 2>/proc/sys/vm/drop_caches가 무료 페이지 캐시, dentries와 아이 노드로 : echo 3>/proc/sys/vm/drop_caches – Sasi
@wildplasser : 어떤 차이가 있습니까? 언급해야 할 것은, 나는 그 합계를 사용하지 않고, 나는 그것이 무엇을 계산하는지 상관하지 않는다. – brokenfoot
이러한 페이지 오류는 코드를로드 한 결과 일 가능성이 있습니다 (즉, mmap (2) - 실행 파일 자체). –