Measure page faults from a c program

后端 未结 3 2080
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-08 17:18

I am comparing a few system calls where I read/write from/to memory. Is there any API defined to measure page faults (pages in/out) in C ?

I found this

3条回答
  •  庸人自扰
    2020-12-08 18:10

    If you are running on Linux, you can use the perf_event_open system call (used by perf stat). It's a little bit tricky to get the right parameters, look at the man page http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html and see the code below.

    There is no lib C wrapper so you have to call it as following:

    static long perf_event_open(struct perf_event_attr *hw_event,
                    pid_t pid,
                    int cpu,
                    int group_fd,
                    unsigned long flags) {
      int ret = syscall(__NR_perf_event_open, hw_event, pid, cpu,
                group_fd, flags);
      return ret;
    }
    

    and then to count page faults:

      struct perf_event_attr pe_attr_page_faults;
      memset(&pe_attr_page_faults, 0, sizeof(pe_attr_page_faults));
      pe_attr_page_faults.size = sizeof(pe_attr_page_faults);
      pe_attr_page_faults.type =   PERF_TYPE_SOFTWARE;
      pe_attr_page_faults.config = PERF_COUNT_SW_PAGE_FAULTS;
      pe_attr_page_faults.disabled = 1;
      pe_attr_page_faults.exclude_kernel = 1;
      int page_faults_fd = perf_event_open(&pe_attr_page_faults, 0, CPU, -1, 0);
      if (page_faults_fd == -1) {
        printf("perf_event_open failed for page faults: %s\n", strerror(errno));
        return -1;
      }
    
      // Start counting
      ioctl(page_faults_fd, PERF_EVENT_IOC_RESET, 0);
      ioctl(page_faults_fd, PERF_EVENT_IOC_ENABLE, 0);
    
      // Your code to be profiled here 
      .....
    
      // Stop counting and read value
      ioctl(page_faults_fd, PERF_EVENT_IOC_DISABLE, 0);
      uint64_t page_faults_count;
      read(page_faults_fd, &page_faults_count, sizeof(page_faults_count));
    

提交回复
热议问题