我正在比较几个系统调用,我从哪里读/写内存。 是否有定义的API来测量C中的页面错误(页面input/输出)?
我发现这个库libperfstat.a,但它是为AIX
,我找不到任何东西的Linux。
编辑:我知道在Linux的time
和perf-stat
命令,只是探索是否有什么可用于我在C
程序内使用。
有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