Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从c程序中测量页面错误_C_Linux_Perf_Page Fault - Fatal编程技术网

从c程序中测量页面错误

从c程序中测量页面错误,c,linux,perf,page-fault,C,Linux,Perf,Page Fault,我比较了几个从内存读/写的系统调用。是否定义了任何API来测量C中的页面错误(页面输入/输出) 我找到了这个库,但它是为AIX,我找不到任何适用于linux的库 编辑: 我知道linux中的time&perf stat命令,只是在探索C程序中是否有我可以使用的东西。它本身不是API,然而,通过在我的C程序中滚动并读取/proc/myPID/stat(其中包括进程的页面错误统计信息),我已经取得了很多成功,这允许我在程序运行时实时监控计数,并以我喜欢的方式存储这些计数 请记住,这样做本身可能会导致

我比较了几个从内存读/写的系统调用。是否定义了任何API来测量
C
中的页面错误(页面输入/输出)

我找到了这个库,但它是为
AIX
,我找不到任何适用于linux的库

编辑:
我知道linux中的
time
&
perf stat
命令,只是在探索
C
程序中是否有我可以使用的东西。

它本身不是API,然而,通过在我的C程序中滚动并读取/proc/myPID/stat(其中包括进程的页面错误统计信息),我已经取得了很多成功,这允许我在程序运行时实时监控计数,并以我喜欢的方式存储这些计数

请记住,这样做本身可能会导致页面错误,因此会有一些不准确的地方,但您会得到一个大致的想法


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

如果您在Linux上运行,则可以使用
perf\u event\u open
系统调用(由perf stat使用)。获取正确的参数有点棘手,请查看手册页并查看下面的代码

没有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));
有函数(SVr4,4.3BSD.POSIX.1-2001;但并非所有字段都在标准中定义)。linux中有几个字段,但列出了几个有趣的字段:

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
(仅在外部程序中可用)。这一个被
/usr/bin/time
程序使用(它打印次要/主要页面错误计数)。

这不是一个C库,但您可以使用
time-v a.out
来显示有关您的程序的大量信息,包括页面错误。在链接的第一行,它显示“C编程语言子程序的集合”。我知道
time
命令,但正在探索是否可以从
C
程序内部执行任何操作。谢谢你!“在C程序中对我可用。”——你能容忍不准确吗?可能没有太多的API用于此目的,因为它的定义太差(在进入和退出此系统调用的过程中可能会发生故障,因此您希望它在何时报告?。@BrianCain:同意,但在看到AIX库之后,我很好奇linux是否存在类似的情况。我想我将不得不使用
perf stat
。不要失去希望,linux中没有库来做这件事的原因是,没有库做这件事很简单,请看下面我的答案。这是一个很好的答案,你可能会注意到它没有C绑定。是的,我还没有时间在这里写下包装器代码。工作非常出色:)!非常感谢。清空页面缓存后,
ru_inblock
/
ru_oublock
是否对
read()
请求进行计数?是的,这是线性的<代码>块输入操作=
8
(文件大小1K)到
块输入操作
=
2234992
(文件大小1G):)