当mmap中的大文件时,零主要故障

时间:2016-05-26 03:18:41

标签: c perf

我写了一个示例C程序:

程序:

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<time.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include<inttypes.h>
int main()
{       
    int fd;
    char *data;
    fd = open("file.txt", O_RDWR);  
    int pagesize = getpagesize();
    data = mmap((caddr_t)0, pagesize, PROT_READ, MAP_SHARED, fd, pagesize); 
    srand(time(NULL));  
    while(1)
    {
        int r = ( rand() % 9999 ) + 1;
        char x = data[r];
    }   
    return 0;
}

我正在为c中的大文件(大小为11GiB)做“mmap”。当我编译这个程序并尝试使用perf检查主要页面错误时我得到零。

Perf命令:

perf stat -e major-faults ./test

我已经运行了这个程序大约30秒并试图杀死,perf报告的主要页面错误数量为零。我的物理内存大小是8GiB。

此外,如果我使用非常大的随机数代替9999,我会遇到分段错误。

任何人都可以建议我在这里做错了什么。

1 个答案:

答案 0 :(得分:1)

mmap的第二个参数应该是你要打开的文件的大小(在这种情况下,11GB或其他任何东西,你可以fseek到最后或{{1}获取确切的大小),而不是pagesize。另外,我认为fstat的第三个参数应该匹配mmap标志。您只是从文件中读取内容,因此我会将open更改为O_RDWR。有意义的是,如果您仅将页面大小O_RDONLY放入文件中,则不会出现页面错误。此外,将9999增加到随机大数可能会尝试读取页面大小以上,这可以解释段错误。最后,最好在继续之前检查mmap对-1的回报以及openmmap的回报。