c - 从 c 程序测量页面错误

标签 c linux perf page-fault

我正在比较一些系统调用,其中我从内存读取/写入内存。 C 中是否定义了任何 API 来测量页面错误(页面输入/输出)?

我找到了这个图书馆 libperfstat.a但它适用于 AIX,我找不到任何适用于 linux 的东西。

编辑: 我知道 linux 中的 timeperf-stat 命令,只是探索是否有任何东西可供我在 C 程序中使用。

最佳答案

如果您在 Linux 上运行,则可以使用 perf_event_open 系统调用(由 perf stat 使用)。获取正确的参数有点棘手,请查看手册页 http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html并查看下面的代码。

没有 lib C 包装器,因此您必须按如下方式调用它:

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;
}

然后计算页面错误:

  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));

关于c - 从 c 程序测量页面错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23302763/

相关文章:

python - datetime.datetime.strptime() 使用可变输入长度

c - 如何读取整数值,直到在C中敲击字符 'o'?

linux - "book"的输出中的 'lscpu -p' 是什么意思?

linux - 使用 Intel PEBS 的 DTLB 未命中地址跟踪

linux - 为什么命令 "perf report"什么都不显示?

linux - perf 记录的默认行为是什么?

c - 尝试动态选择的菜单..卡在某些部分

c - 删除单链表中第二次出现的节点

linux - 将非 PIC 对象链接到具有 PIC 对象的可执行文件是否有效

java - 命令在终端中有效但在脚本中无效?