Показатель производительности для части программы

Возможно ли с помощью 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.

Другие вопросы по тегам