Запишите основные ошибки, вызванные чтением из обычных файлов - PullRequest
2 голосов
/ 04 июня 2019

Насколько я понимаю, когда 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 извлечением из файладескриптор

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...