mmap 영역의 순차/무작위 읽기에서 이상한 수의 주요 페이지 오류가 발생합니다.

mmap 영역의 순차/무작위 읽기에서 이상한 수의 주요 페이지 오류가 발생합니다.

나는 후속 조치를 취하고 있다이 답변, 다음을 사용하여 몇 가지 주요 페이지 오류를 생성해 보십시오 mmap.

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main(int argc, char ** argv) {
  int fd = open(argv[1], O_RDONLY);
  struct stat stats;
  fstat(fd, &stats);
  posix_fadvise(fd, 0, stats.st_size, POSIX_FADV_DONTNEED);
  char * map = (char *) mmap(NULL, stats.st_size, PROT_READ, MAP_SHARED, fd, 0);
  if (map == MAP_FAILED) {
    perror("Failed to mmap");
    return 1;
  }
  int result = 0;
  int i;
  for (i = 0; i < stats.st_size; i++) {
    result += map[i];
  }
  munmap(map, stats.st_size);
  return result;
}

1.6G파일을 매핑한 다음 읽으려고 시도했지만 1주요 페이지 오류가 발생했습니다.

Major (requiring I/O) page faults: 1
Minor (reclaiming a frame) page faults: 38139

무작위로 데이터를 읽을 때

// hopefully this won't trigger extra page faults
unsigned int idx = 0;
for (i = 0; i < stats.st_size; i++) {
  result += map[idx % stats.st_size];
  idx += i;
}

페이지 오류가 급증했습니다.16415

Major (requiring I/O) page faults: 16415
Minor (reclaiming a frame) page faults: 37665

데이터를 미리 로드하기 위해 커널에 미리 가져오는 것과 같은 것이 있습니까 mmap? /usr/bin/timeOR을 통해 이를 어떻게 알 수 있나요 perf?

나는 gcc 6.5.0and를 사용하고 있습니다.Ubuntu 18.044.15.0-54-generic

답변1

예, 커널은 기본적으로 미리 읽기(프리페칭이라고 함)를 수행합니다.https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/mm/filemap.c?h=v5.5#n2476

posix_madvise()mmap()after를 호출하고 어드바이스를 제공하여 이 메모리 영역에 대한 미리 읽기를 비활성화 할 수 있습니다 POSIX_MADV_RANDOM.

관련 정보