2014-10-08 2 views
6

Как использовать ftrace() (или что-то еще) для отслеживания определенной, определяемой пользователем функции в ядре Linux? Я пытаюсь создать и запустить некоторые микропредметки, поэтому я хотел бы иметь время, необходимое для выполнения определенных функций. Я прочитал (по крайней мере, насколько это возможно) документацию, но шаг в правильном направлении был бы потрясающим.Как измерить или отслеживать определенную функцию в ядре Linux?

Я склоняюсь к ftrace(), но у меня возникают проблемы с его работой на Ubuntu 14.04.

ответ

1

Он напечатает несколько следов функции, называемых так.

Для времени трассировки я думаю, вы должны использовать отметку время показа в журнале ядра или использовать jiffies счетчик

1

Также Systemtap будут полезны в вашей ситуации. Systemtap - это своего рода инструмент, в котором вы можете писать код, как на языках сценариев. Он очень мощный, но если вы хотите знать только время выполнения, то определенная функция ftrace будет лучше, но если вам нужен очень продвинутый инструмент для анализа, например проблемы с производительностью в пространстве ядра, это может быть очень полезно.

Pls читает больше: (то, что вы хотите сделать, это здесь: - 5,2 Зубчатое время выполнения функции) enter link description here

4

Вот несколько вариантов вы можете иметь в зависимости от версии ядра вы находитесь на:

Systemtap - это идеальный способ проверить примеры, которые поставляются вместе с stap, у вас может быть что-то готовое с минимальными изменениями.

Oprofile - если вы используете более старые версии ядра, stap дает лучшую точность по сравнению с oprofile.

debugfs с опцией стека трассировки - хорошо для отладки переполнения стека. Для этого вам необходимо включить функции проверки глубины на mounting debugfs, а затем echo 1 > /proc/sys/kernel/stack_tracer_enabled.

strace - если вы ищете идентификацию системных вызовов, вызываемых программой пользовательского пространства и некоторыми номерами производительности. использование strace -fc <program name>

Надеюсь, это поможет!

1

Если время выполнения функции является интересным, потому что оно вызывает вспомогательные вызовы для медленных/блокирующих функций, то трассировка по каждому из операторов может работать для вас без чрезмерных искажений из-за «накладных расходов» самого инструментария ,

probe kernel.statement("[email protected]/file.c:*") { println(tid(), " ", gettimeofday_us(), " ", pn()) } 

даст вам след каждого отдельного оператора в имени функции. Дельта между смежными операциями легко вычисляется вручную или большим скриптом. См. Также https://sourceware.org/systemtap/examples/#profiling/linetimes.stp

0

Чтобы получить точные значения, которые мне нужны (циклы CPU), я закончил использование get_cycles(), который по существу является оберткой для RDTSC (но переносимой). ftrace() может по-прежнему быть полезным в будущем, но все, что я сейчас делаю, - это разница между начальными циклами процессора и конечными циклами процессора и использованием этого в качестве эталона.

Обновление: во избежание распараллеливания инструкций я фактически упал вместо RDTSCP. Я не мог использовать RDTSC + CPUID, потому что это вызвало много задержек с hypercalls (я работаю в VM).

 Смежные вопросы

  • Нет связанных вопросов^_^