Измерьте ошибки страницы из программы переменного тока
Я сравниваю несколько системных вызовов, где я читаю / пишу из / в память. Существует ли какой-либо API, определенный для измерения ошибок страниц (страниц в / из) в C
?
Я нашел эту библиотеку libperfstat.a, но это для AIX
Я ничего не мог найти для Linux.
Редактировать: я в курсе time
& perf-stat
команды в Linux, просто исследовать, есть ли что-нибудь для меня, чтобы использовать внутри C
программа.
3 ответа
Есть 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 */
rusage
также сообщается в wait4
(можно использовать только во внешней программе). Этот используется /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 как таковой, однако я добился большого успеха, прокручивая свою собственную и читая /proc/myPID/stat из моей программы на C, которая включает статистику сбоев страниц для моего процесса, это позволяет мне отслеживать количество в реальном времени время, как моя программа работает и хранит их, как мне нравится.
Помните, что это может привести к ошибкам в самой странице, поэтому будут некоторые неточности, но вы получите общее представление.
Подробнее о формате файла см. Здесь: 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