объединилась, потому что тесты не удались внутри трубопровода 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
Код: Выделить всё
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 , предположительно, потому что он проверяет путь в гостевой файловой системе. Копирование
ls< /code> на этот путь в госте не дает нам трассировку с пакетами Tint и Tnt
, поэтому я не уверен, что происходит. Их проблема кажется связанной с фильтром.
Кто-нибудь знает, должны ли фильтры работать в контейнерах?
Подробнее здесь: https://stackoverflow.com/questions/795 ... h-intel-pt
Мобильная версия