Использование perf датчик для контроля производительности во время определенной функции

Я пытаюсь отслеживать статистику производительности во время определенной функции с помощью linux perf tool.

Я следовал инструкциям, данным на https://perf.wiki.kernel.org/index.php/Jolsa_Features_Togle_Event.

Я пытался получить количество команд простой программы на Си. (Как показано ниже)

1) Мой простой C-код

#include<stdio.h>

int sum=0;
int i=0;

void func(void)
{
   for(i=0;i<100;i++)
   {
     sum=sum+i;
   }
}

int main(void)
{
   func();
   return 0;
}

2) Компиляция и добавление зондов

root@sunimal-laptop:/home/sunimal/temp# gcc -o ex source.c 
root@sunimal-laptop:/home/sunimal/temp# perf probe -x ./ex entry=func
Added new event:
  probe_ex:entry       (on 0x4ed)

You can now use it in all perf tools, such as:

        perf record -e probe_ex:entry -aR sleep 1

root@sunimal-laptop:/home/sunimal/temp# perf probe -x ./ex exit=func%return
Added new event:
  probe_ex:exit        (on 0x4ed%return)

You can now use it in all perf tools, such as:

        perf record -e probe_ex:exit -aR sleep 1

3) Попытка использовать perf stat для измерения количества команд в функции func(). Это приводит к ошибке.

root@sunimal-laptop:/home/sunimal/temp# perf stat -e instructions:u,probe_ex:entry/on=instructions/,probe_ex:exit/off=instructions/ ./ex
invalid or unsupported event: 'instructions:u,probe_ex:entry/on=instructions/,probe_ex:exit/off=instructions/'
Run 'perf list' for a list of valid events

Может ли кто-нибудь указать мне, где я поступил неправильно?

[Я использую ядро ​​Linux 3.11.0-12-generic]

1 ответ

Решение

Я думаю, что инструкции, которые вы выполняете, еще не включены в основное ядро ​​Linux. Как следствие, perf говорит вам, что события не поддерживаются: perf не знает механизм "переключения", упомянутый на этой странице.

Я вижу два обходных пути:

  1. Если у вас есть доступ к исходному коду, который вы хотите профилировать, вы можете использовать системный вызов perf_event_open непосредственно из вашего исходного кода, чтобы начать и остановить подсчет входа и выхода из функции.
  2. Clone Jolsa хранилище git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/jolsa/perf переключите ветку core_toggle git co remotes/origin/perf/core_toggle а затем скомпилируйте и запустите ядро ​​с этой поддержкой.

Что касается 2, я совсем не знаком с версиями ядра и разработкой, и я думаю, что это решение может быть довольно сложным в использовании и обслуживании. Возможно, вам следует спросить в списке рассылки perf, есть ли планы по интеграции функции переключения в основное ядро.

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