从ac程序中测量页面错误

我正在比较几个系统调用,我从哪里读/写内存。 是否有定义的API来测量C中的页面错误(页面input/输出)?

我发现这个库libperfstat.a,但它是为AIX ,我找不到任何东西的Linux。

编辑:我知道在Linux的timeperf-stat命令,只是探索是否有什么可用于我在C程序内使用。

Solutions Collecting From Web of "从ac程序中测量页面错误"

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 */ 

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

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

这不是一个API,但是,我已经有很多的成功,通过在我的C程序中滚动我自己的和阅读/ proc / myPID / stat,其中包括我的进程的页面错误统计信息,这使我能够监视我的程序运行的时间和存储这些,但我喜欢。

请记住,这样做会导致页面错误本身,所以会有一些不准确的地方,但你会得到一个大致的想法。

有关文件格式的详细信息,请参阅此处: https : //access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_MRG/1.3/html/Realtime_Reference_Guide/chap-Realtime_Reference_Guide-Memory_allocation.html