Использование 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 не знает механизм "переключения", упомянутый на этой странице.
Я вижу два обходных пути:
- Если у вас есть доступ к исходному коду, который вы хотите профилировать, вы можете использовать системный вызов perf_event_open непосредственно из вашего исходного кода, чтобы начать и остановить подсчет входа и выхода из функции.
- Clone Jolsa хранилище
git clone https://kernel.googlesource.com/pub/scm/linux/kernel/git/jolsa/perf
переключите ветку core_togglegit co remotes/origin/perf/core_toggle
а затем скомпилируйте и запустите ядро с этой поддержкой.
Что касается 2, я совсем не знаком с версиями ядра и разработкой, и я думаю, что это решение может быть довольно сложным в использовании и обслуживании. Возможно, вам следует спросить в списке рассылки perf, есть ли планы по интеграции функции переключения в основное ядро.