我正在比较一些系统调用,我从/向内存读/写。是否有任何API用于衡量C
中的页面错误(页面输入/输出)?
我找到了这个库libperfstat.a,但它是AIX
,我找不到任何关于linux的东西。
修改
我知道time
& linux中的perf-stat
命令,只是探索我是否可以在C
程序中使用。
答案 0 :(得分:6)
如果您在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));
答案 1 :(得分:3)
有getrusage
函数(SVr4,4.3BSD。POSIX.1-2001;但并非所有字段都在标准中定义)。在linux中有几个broken fields,但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
程序使用(它打印次要/主要页面错误计数)。
答案 2 :(得分:2)
它不是这样的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