Работают ли фильтры PERF внутри контейнеров (при трассировке с Intel PT)?Linux

Ответить
Anonymous
 Работают ли фильтры PERF внутри контейнеров (при трассировке с Intel PT)?

Сообщение Anonymous »

(этот пост основан на сообщении списка рассылки, который я представил вчера) Работа
объединилась, потому что тесты не удались внутри трубопровода CI Dockerised, который мы используем. При
ближе, трассы выглядят пустыми (помимо некоторых скучных неконтроль
Flow Pt Packets). < /P>
Я тогда смог воспроизвести проблему, используя стандартные инструменты пользователя perf
. Я думать < /em> (но я не уверен), что это может быть выделение ошибки в
perf при использовании в контейнерах. < /P>
Я использую Debian stable: < /p>

Код: Выделить всё

# cat /etc/debian_version
12.9
# uname -a
Linux bencher16 6.1.0-31-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.128-1 (2025-02-07) x86_64 GNU/Linux
< /code>
Вот минимальный пример, который показывает проблему. Предположим, мы хотим отследить исполняемый сегмент
/bin /ls с Intel pt. Во -первых, давайте сделаем это  снаружи < /em> из
docker, чтобы увидеть, что мы ожидаем получить: < /p>
host$ readelf --segments /bin/ls
...
Program Headers:
Type           Offset             VirtAddr           PhysAddr
FileSiz            MemSiz              Flags  Align
...
LOAD           0x0000000000004000 0x0000000000004000 0x0000000000004000
0x0000000000015759 0x0000000000015759  R E    0x1000
< /code>
Есть наш исполняемый сегмент. Чтобы собрать его след, мы можем сделать: < /p>
host$ perf record -e intel_pt//u -v --filter 'filter 0x0000000000004000/0x0000000000015759@/bin/ls' /bin/ls -- /dev/null
DEBUGINFOD_URLS=
Address filter: filter 0x4000/0x15759@/usr/bin/ls
nr_cblocks: 0
affinity: SYS
mmap flush: 1
comp level: 0
mmap size 528384B
Control descriptor is not initialized
mmap size 528384B
perf_event__synthesize_bpf_events: can't get next program: Operation not permitted
/dev/null
[ perf record: Woken up 1 times to write data ]
failed to write feature HYBRID_TOPOLOGY
[ perf record: Captured and wrote 0.035 MB perf.data ]
< /code>
Тогда мы сможем посмотреть на пакеты PT и проверить, что мы видим некоторые пакеты TNT и TIP,
, как можно было бы ожидать: < /p>
host$ perf report -D
...
.  00002d98:  06                                              TNT T (1)
.  00002d99:  59 e6 00 00 00 00                               MTC 0xe6
.  00002d9f:  c1 b0 d0 66 5f 80 7f 00 00                      TIP.PGD 0x7f805f66d0b0
.  00002da8:  00 00 00 00 00 00 00                            PAD
.  00002daf:  d1 34 4b 7c 4b 82 55 00 00                      TIP.PGE 0x55824b7c4b34
.  00002db8:  04 00 00 00 00 00 00                            TNT N (1)
.  00002dbf:  c1 b0 d0 66 5f 80 7f 00 00                      TIP.PGD 0x7f805f66d0b0
...
^C
host$ perf report -D | grep -e 'TNT' | wc -l
130
host$ perf report -D | grep -e 'TIP' | wc -l
190
< /code>
хорошо. Теперь давайте повторим этот эксперимент в контейнере Docker (тот, который имеет
способность Perfmon включена). < /P>
, как это происходит, исполняемый сегмент для LS контейнера < /code> находится в том же смещении
, что и в хосте: < /p>
container$ readelf --segments /bin/ls
...
Program Headers:
Type           Offset             VirtAddr           PhysAddr
FileSiz            MemSiz              Flags  Align
...
LOAD           0x0000000000004000 0x0000000000004000 0x0000000000004000
0x0000000000015759 0x0000000000015759  R E    0x1000
В свете команда perf Record одинакова:

Код: Выделить всё

container$ perf record -e intel_pt//u -v --filter 'filter 0x0000000000004000/0x0000000000015759@/bin/ls' /bin/ls -- /dev/null
DEBUGINFOD_URLS=
Address filter: filter 0x4000/0x15759@/usr/bin/ls
nr_cblocks: 0
affinity: SYS
mmap flush: 1
comp level: 0
maps__set_modules_path_dir: cannot open /lib/modules/6.1.0-31-amd64 dir
Problems setting modules path maps, continuing anyway...
mmap size 528384B
Control descriptor is not initialized
mmap size 528384B
perf_event__synthesize_bpf_events: can't get next program: Operation not permitted
/dev/null
[ perf record: Woken up 1 times to write data ]
failed to write feature HYBRID_TOPOLOGY
[ perf record: Captured and wrote 0.056 MB perf.data ]
< /code>
Но на этот раз нет пакетов TIP или TNT, которые можно увидеть: < /p>
container$ perf report -D | grep -e 'TNT' | wc -l
0
container$ perf report -D | grep -e 'TIP' | wc -l
0
< /code>
Я нахожу это поведение неожиданным. Это говорит о том, что исполняемый сегмент
не был прослежен.  Я ожидаю, что контейнер сможет проследить с помощью фильтра
такого же, как если бы он вообще не был контейнером, но, возможно, мои ожидания
wrong(?).
Одно теория заключается в том, что Perf -фильтровал на хосте /бин /ls, что, конечно, не было выполнено, что я не был, несмотря на то, что я не был, чтобы подтвердить это. Пример, указав путь хоста в ls 
(/var/lib/docker/overlay2/...) в строке фильтра, но PERF отклонит это,
, предположительно, потому что он проверяет путь в гостевой файловой системе. Копирование
ls< /code> на этот путь в госте не дает нам трассировку с пакетами Tint и Tnt
, поэтому я не уверен, что происходит. Их проблема кажется связанной с фильтром.
Кто-нибудь знает, должны ли фильтры работать в контейнерах?

Подробнее здесь: https://stackoverflow.com/questions/795 ... h-intel-pt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»