Насколько я понимаю, когда read
из ядра файлового дескриптора должен отобразить файл в основную память и только затем скопировать область в предоставленный буфер.Это означает, что чтение из файла, который еще не находится в кеше, должно вызвать серьезную ошибку страницы.Поэтому я пытаюсь поймать его следующим образом:
int main(void){
int fd = open("/home/xxxxx/test_mmap", O_CREAT | O_RDWR, S_IRWXU);
char buf[] = "1234";
int i = read(fd, buf, strlen(buf));
printf("%s%s\n", buf, strerror(errno));
}
Я очистил кэш файловой системы с помощью команды
free && sync && echo 3 > /proc/sys/vm/drop_caches && free
и запустил
sudo perf stat -e major-faults:k ./bin
Я получил результат
Performance counter stats for './bin':
0 major-faults:k
0.002235652 seconds time elapsed
, означающее, что в ядре не было серьезных сбоев.Я полагаю, что сделал что-то не так с этим, так как если я запускаю sudo perf stat -e major-faults ./bin
после очистки кэшей на
int main(void){
int fd = open("/home/xxxxx/test_mmap", O_CREAT | O_RDWR, S_IRWXU);
char buf[] = "1234";
int i = read(fd, buf, strlen(buf));
char *mapped_region = mmap(NULL, sysconf(_SC_PAGESIZE), PROT_WRITE, MAP_PRIVATE, fd, 0);
mapped_region[0] = '0';
printf("%c\n", mapped_region[0]);
}
, я получаю вывод
Performance counter stats for './bin':
0 major-faults
0.002411539 seconds time elapsed
Это означает, что основная ошибка произошла при чтении изфайл, но не был записан с -e major-faults:k
.
Вопрос : Как записать основные ошибки страницы с perf
, вызванные read
извлечением из файладескриптор