Показатель производительности для части программы
Возможно ли с помощью perf собирать статистику счетчиков оборудования только для части выполнения программы? Если так, то как?
likwid предлагает возможность определять именованные регионы, но было бы замечательно, если бы это было возможно в системах с установленным только perf.
На некоторые предыдущие вопросы были получены соответствующие ответы, но есть некоторые недостатки:
- Используя щуп, я получаю ту же ошибку, и я использую немного более новое ядро (3.13). Доступны ли эти исправления в более новой версии?
- Используя perf_event_open я хотел бы сохранить гибкость для определения событий в командной строке. Я также взглянул на код самой статистики perf, но кажется, что он не настраивается, вызывая perf_event_open.
2 ответа
Создайте дочерний процесс для запуска perf stat.
Прикреплять perf stat
к родителю.
Убейте дочерний процесс от родителя по мере необходимости.
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
int main()
{
int pid= getpid();
int cpid = fork();
if( cpid == 0)
{
// child process . Run your perf stat
char buf[50];
sprintf(buf, "perf stat -p %d > stat.log 2>&1",pid);
execl("/bin/sh", "sh", "-c", buf, NULL);
}
else
{
// set the child the leader of its process group
setpgid(cpid, 0);
//////////////////////////////////////////////
// part of program you wanted to perf stat
sleep(3);
////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
// stop perf stat by killing child process and all its descendants(sh, perf stat etc )
kill(-cpid, SIGINT);
////////////////////////////////////////////////////////////////////
// rest of the program
sleep(2);
}
}
Вы можете использовать libpfc или jevents, которые являются Linux-совместимыми библиотеками, которые позволяют программировать и считывать счетчики производительности через rdpmc
в произвольных точках в программе пользователя.
Это не поможет напрямую с вашим запросом указать события в командной строке, но вы можете создать что-то вместе, возможно, на основе кода ocperf.py или libpfm4.