从c程序中测量页面错误
我比较了几个从内存读/写的系统调用。是否定义了任何API来测量从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(其中包括进程的页面错误统计信息),我已经取得了很多成功,这允许我在程序运行时实时监控计数,并以我喜欢的方式存储这些计数 请记住,这样做本身可能会导致
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):)