从 C 程序测量页面错误

问题描述 投票:0回答:3

我正在比较一些从内存读取/写入的系统调用。

C
中是否定义了任何 API 来测量页面错误(页面输入/输出)?

我找到了这个库libperfstat.a,但它是针对

AIX
的,我找不到任何适用于linux的东西。

编辑: 我知道 linux 中的

time
perf-stat
命令,只是探索一下
C
程序中是否有任何东西可供我使用。

c linux perf page-fault
3个回答
10
投票

如果您在 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));

5
投票

getrusage
函数(SVr4、4.3BSD. POSIX.1-2001;但并非所有字段都在标准中定义)。在linux中有几个破碎的字段,但是
man getrusage
列出了几个有趣的字段:

long   ru_minflt;        /* page reclaims (soft page faults) */
long   ru_majflt;        /* page faults (hard page faults) */

long   ru_inblock;       /* block input operations */
long   ru_oublock;       /* block output operations */

rusage
也在
wait4
中报告(仅在外部程序中可用)。这个由
/usr/bin/time
程序使用(它打印次要/主要页面错误计数)。


4
投票

它本身并不是一个 API,但是我通过自己编写并从我的 C 程序中读取 /proc/myPID/stat 取得了很大的成功,其中包括我的进程的页面错误统计信息,这使我能够监视当我的程序运行时实时并以我喜欢的方式存储这些。

请记住,这样做本身可能会导致页面错误,因此可能会出现一些不准确的情况,但您会得到一个大概的了解。

有关文件格式的详细信息,请参阅此处:

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.