Когда фильтровать детали функций в linux perf?

При использовании linux perf для записи трассировки с использованием события intel_pt можно отфильтровать трассировку определенной функции (func1).

 perf record -e intel_pt/branch_type=call/u --filter ' filter func1 @ a.out ' -- ./a.out

Альтернативным подходом может быть:

  perf record -e intel_pt/branch_type=call/u -T --switch-events -- ./a.out

с последующим

  perf script --itrace -c | grep 'func1'

--itrace -c для выбора только тех ветвей, которые являются вызовами функций.

Мой вопрос заключается в том, лучше ли точность временных меток, записанных при первом подходе, чем при втором подходе?

Это может быть так, что в то время как первый подход специально фильтрует и записывает трассировку конкретной функции, второй подход записывает все трассировки.

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


person ajit    schedule 07.07.2020    source источник
comment
Аджит, какая у тебя точная модель процессора? Существуют разные версии аппаратного обеспечения Intel PT.   -  person osgx    schedule 13.07.2020
comment
Процессор — Xeon Gold 6148 с тактовой частотой 2,4 ГГц. CPUID ПодлинныйIntel,6,85,4. производительность версии 3.10.0-693.   -  person ajit    schedule 14.07.2020
comment
Я также заметил, что иногда при использовании флага --filter трассировка не записывается или не записывается полностью. Это ошибка?   -  person ajit    schedule 14.07.2020
comment
Журнал трассировки пакетов генерируется аппаратно на очень высокой скорости. Он записывается в предварительно выделенное буферное пространство и периодически сохраняется подсистемой ядра perf_events и передается инструменту perf user-space для записи на ваш диск. Когда сгенерированный журнал трассировки огромен, будет много событий пробуждения для сохранения, и некоторые фрагменты этого журнала могут быть потеряны. С включенной адекватной фильтрацией журнал трассировки будет меньше, и я ожидаю, что он будет сохраняться более корректно. Проверьте вывод perf record, там указано, сколько фрагментов данных было потеряно.   -  person osgx    schedule 14.07.2020


Ответы (1)


Теоретически фильтрация может выполняться на разных уровнях: на аппаратном уровне, в ядре ОС или в коде пользовательского пространства. Для последних версий Intel Processor Trace (intel_pt) фильтрация выполняется модулем PMU аппаратной трассировки:

Справочная страница perf-record

   --filter=<filter>
       Event filter. This option should follow an event selector (-e)
       which selects either tracepoint event(s) or a hardware trace PMU
       (e.g. Intel PT or CoreSight).  ...

       ·   address filters

               A hardware trace PMU advertises its ability to accept a number of
               address filters by specifying a non-zero value in
               /sys/bus/event_source/devices/<pmu>/nr_addr_filters.

               Address filters have the format:

               filter|start|stop|tracestop <start> [/ <size>] [@<file name>]

               Where:
               - 'filter': defines a region that will be traced.

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

Обработка фильтров выполняется аппаратно, поэтому нет больших накладных расходов. Я думаю, что оборудование для трассировки не будет генерировать каких-либо накладных расходов на выполнение кода за пределами отфильтрованного диапазона адресов и создаст около 1-5% накладных расходов на выполнение кода в отфильтрованном (обязательном) диапазоне.

http://halobates.de/blog/p/406 дает ссылку на описание оборудования intel sdm, том 3, глава 35, процессор Intel трассировка 35.2.4.3 Фильтрация по IP (в таблице 35-6 указано 4 регистра диапазона аппаратной фильтрации. IA32_RTIT_CTL MSR, поэтому можно определить до 4 диапазонов адресов)

Генерация пакетов трассировки с настраиваемой фильтрацией по IP поддерживается, если CPUID. (EAX=14H, ECX=0):EBX[бит 2] = 1. Intel PT можно настроить для включения генерации пакетов, содержащих архитектурные состояния, только когда процессор выполнение кода в определенных диапазонах IP-адресов. Если IP-адрес находится за пределами этих диапазонов, генерация некоторых пакетов блокируется. ... Когда ADDRn_CFG настроен на включение IP-фильтрации (см. Раздел 35.3.1), трассировка начнется, когда будет замечена принятая ветвь или событие, целевой адрес которого находится в диапазоне ADDRn. ... Обратите внимание, что некоторые пакеты, такие как MTC (раздел 35.3.7) и другие пакеты синхронизации, не зависят от FilterEn.

35.2.5.5 Включение фильтра (FilterEn) Включение фильтра указывает на то, что указатель инструкций (IP) находится в диапазоне IP-адресов, для наблюдения за которыми настроен Intel PT. ... Когда FilterEn равен 0, пакеты потока управления не генерируются (например, TNT, TIP). Однако некоторые пакеты, такие как PIP, MTC и PSB, могут по-прежнему генерироваться, пока FilterEn не установлен.

Для получения точных временных меток необходимо правильно настроить параметры intel_pt. Временные метки в режиме трассировки intel_pt генерируются аппаратным обеспечением в соответствии с параметрами perf Record intel_pt. Справочная страница perf-intel-pt говорит что есть опции tsc, mtc, cyc для получения временных меток

   tsc Always supported. Produces TSC timestamp packets to provide
   timing information.  ...


   mtc Produces MTC timing packets.

       MTC packets provide finer grain timestamp information than TSC
       packets.  MTC packets record time using the hardware crystal
       clock (CTC) which is related to TSC packets using a TMA packet.

       Support for this feature is indicated by:

       /sys/bus/event_source/devices/intel_pt/caps/mtc

       which contains "1" if the feature is supported and
       "0" otherwise.

       The frequency of MTC packets can also be specified - see
       mtc_period below.


   cyc Produces CYC timing packets.

       CYC packets provide even finer grain timestamp information than
       MTC and TSC packets.  A CYC packet contains the number of CPU
       cycles since the last CYC packet. Unlike MTC and TSC packets,
       CYC packets are only sent when another packet is also sent.
person osgx    schedule 13.07.2020
comment
Другими словами, фильтрация с использованием --filter выполняется аппаратным обеспечением PMU. Это происходит параллельно с обработкой инструкций приложения на основном процессоре. Таким образом, это не повлияет на синхронизацию трассировки и, следовательно, создаст журнал более точных отметок времени. Второй подход записи полной трассировки повлечет за собой более высокие накладные расходы. И с большей вероятностью искажает записанную временную метку функции. Я прав? - person ajit; 14.07.2020
comment
@ajit, опция фильтрации записи perf с intel_pt реализована аппаратно с очень небольшими накладными расходами на выполнение кода вне фильтра, вы правы. Когда создается журнал трассировки, на обработку инструкций ЦП приходится 1-5% накладных расходов (поскольку огромное количество записей данных генерируется аппаратным обеспечением pmu, и эти записи отнимают часть пропускной способности кэша/памяти). Без опции фильтра вы просите PMU генерировать 100 мегабайт в секунду для всего кода, что замедляет выполнение всей программы; с фильтром только ваш регион будет иметь замедление на 1-5%. Полная трассировка настолько велика, что будет частично потеряна. - person osgx; 14.07.2020