Вопрос или проблема
Я работаю над встроенной системой Linux (ядро-5.19.20) и пробовал инструмент perf на своем SoC, обнаружил, что некоторые функции НЕ работают.
После выполнения perf record /test/perf_test
я получил perf.data
, и perf report
также показал список функций.
Я кросс-компилировал objdump
и addr2line
для своей цели, затем я запустил
./perf annotate --addr2line /data/addr2line --objdump /data/objdump
Процент | Исходный код и дизассемблирование perfload для cpu-clock:ppp (33248 образцов, процент: локальный период)
--------------------------------------------------------------------------------------------------------------
:
:
:
: 3 Дизассемблирование секции .text:
:
: 5 0040060c <workload2>:
: 6 workload2():
0.00 : 40060c: addiu sp,sp,-24
0.00 : 400610: sw s8,20(sp)
0.00 : 400614: move s8,sp
0.00 : 400618: sw zero,12(s8)
0.00 : 40061c: sw zero,8(s8)
0.00 : 400620: b 400698 <workload2+0x8c>
0.00 : 400624: nop
39.08 : 400628: lw v1,8(s8)
0.00 : 40062c: lw v0,8(s8)
2.07 : 400630: mul v0,v1,v0
0.00 : 400634: lw v1,12(s8)
4.08 : 400638: addu v0,v1,v0
0.00 : 40063c: sw v0,12(s8)
....
Затем я попытался сделать график пламени с perf.data
с помощью следующих команд.
perf script -i perf.data &> perf.unfold
cat perf.unfold | head -20
perfload 1822 1443.361889: 250000 cpu-clock:ppp: 80769534 _raw_spin_unlock+0x3c ([kernel.kallsyms])
perfload 1822 1443.362138: 250000 cpu-clock:ppp: 77eb6a28 __mips_syscall5+0x8 (/lib/ld-linux-mipsn8.so.1)
perfload 1822 1443.362388: 250000 cpu-clock:ppp: 800fe1e0 filemap_map_pages+0x118 ([kernel.kallsyms])
perfload 1822 1443.362639: 250000 cpu-clock:ppp: 77eb75f8 memcpy+0x1c8 (/lib/ld-linux-mipsn8.so.1)
perfload 1822 1443.362945: 250000 cpu-clock:ppp: 800eec8c perf_event_mmap_output+0x218 ([kernel.kallsyms])
perfload 1822 1443.363196: 250000 cpu-clock:ppp: 8001ec38 enable_restore_fp_context+0x208 ([kernel.kallsyms])
perfload 1822 1443.363440: 250000 cpu-clock:ppp: 4005d0 workload1+0x80 (/data/perfload)
perfload 1822 1443.363690: 250000 cpu-clock:ppp: 400584 workload1+0x34 (/data/perfload)
perfload 1822 1443.363939: 250000 cpu-clock:ppp: 4005e8 workload1+0x98 (/data/perfload)
perfload 1822 1443.364189: 250000 cpu-clock:ppp: 4005ec workload1+0x9c (/data/perfload)
perfload 1822 1443.364439: 250000 cpu-clock:ppp: 4005ec workload1+0x9c (/data/perfload)
perfload 1822 1443.364689: 250000 cpu-clock:ppp: 400594 workload1+0x44 (/data/perfload)
perfload 1822 1443.364939: 250000 cpu-clock:ppp: 400588 workload1+0x38 (/data/perfload)
perfload 1822 1443.365189: 250000 cpu-clock:ppp: 400574 workload1+0x24 (/data/perfload)
perfload 1822 1443.365439: 250000 cpu-clock:ppp: 4005d4 workload1+0x84 (/data/perfload)
perfload 1822 1443.365689: 250000 cpu-clock:ppp: 40058c workload1+0x3c (/data/perfload)
perfload 1822 1443.365939: 250000 cpu-clock:ppp: 40058c workload1+0x3c (/data/perfload)
perfload 1822 1443.366189: 250000 cpu-clock:ppp: 40058c workload1+0x3c (/data/perfload)
perfload 1822 1443.366439: 250000 cpu-clock:ppp: 40059c workload1+0x4c (/data/perfload)
perfload 1822 1443.366689: 250000 cpu-clock:ppp: 400598 workload1+0x48 (/data/perfload)
Я скопировал perf.unfold
на свой рабочий хост и запустил perl-скрипты с сайта Грега.
stackcollapse-perf.pl ~/shared/perf.unfold &> ~/shared/perf.fold
flamegraph.pl ~/shared/perf.fold > ~/shared/perf.svg
Количество стеков низкое (0). Что-то пошло не так?
ОШИБКА: Не найдено счетчиков стека
Я проверил perf.fold
, его размер равен 0!!!
Инструмент perf
был кросс-компилирован с включенными следующими функциями.
Автоопределение возможностей системы:
... dwarf: [ ВЫКЛ ]
... dwarf_getlocations: [ ВЫКЛ ]
... glibc: [ ВКЛ ]
... libbfd: [ ВЫКЛ ]
... libbfd-buildid: [ ВЫКЛ ]
... libcap: [ ВЫКЛ ]
... libelf: [ ВКЛ ]
... libnuma: [ ВЫКЛ ]
... numa_num_possible_cpus: [ ВЫКЛ ]
... libperl: [ ВЫКЛ ]
... libpython: [ ВЫКЛ ]
... libcrypto: [ ВЫКЛ ]
... libunwind: [ ВКЛ ]
... libdw-dwarf-unwind: [ ВЫКЛ ]
... zlib: [ ВКЛ ]
... lzma: [ ВЫКЛ ]
... get_cpuid: [ ВЫКЛ ]
... bpf: [ ВЫКЛ ]
... libaio: [ ВКЛ ]
... libzstd: [ ВЫКЛ ]
SoC – это MIPS, и я не уверен, почему flamegraph.pl
не сработал, казалось, что информация о стеке пуста в perf.data
? Или есть какая-то функция, которой мне не хватает для работы распаковки стека? Или perf НЕ поддерживает анализ стека MIPS?
Спасибо,
Ответ или решение
Ваша ситуация с использованием инструмента perf на встраиваемой системе Linux под ядром 5.19.20 требует комплексного подхода к диагностике и решению проблем. Рассмотрим несколько ключевых аспектов, которые могут помочь в вашей ситуации.
1. Проблема с анализом стека
Основная проблема, которую вы наблюдаете, заключается в том, что команда stackcollapse-perf.pl
возвращает нулевой размер для файла perf.fold
, из-за чего воспроизведение графиков в формате flamegraph не удается. Это указывает на то, что данные стека в файле perf.data
отсутствуют, что можно объяснить несколькими причинами.
Возможные причины:
- Отсутствие поддержки стека в perf для MIPS: К сожалению, не все платформы и архитектуры поддерживаются инструментом perf в одинаковой степени. Вам стоит проверить документацию для версии perf, которую вы используете, чтобы определить, поддерживает ли она работу со стеком для архитектуры MIPS.
- Ошибки в конфигурации сборки: По информации о конфигурации, вы неключевые компоненты, такие как
libdw-dwarf-unwind
,dwarf
иlibbfd
, отключены. Эти библиотеки часто используются для работы с отладочной информацией и для анализа стека. Вам нужно убедиться в том, что они включены при сборке. - Недостаточная информация о символах: Убедитесь, что ваш исполняемый файл
/data/perfload
скомпилирован с включением отладочной информации (например, флаг-g
для gcc). Это необходимо для обеспечения корректного отображения символов и адресов функций.
2. предложения по устранению проблем
Вот несколько шагов, которые могут привести к успешному сбору данных и визуализации:
-
Пересборка perf с включенной поддержкой: попробуйте пересобрать perf с включением всех необходимых библиотек, особенно
libdw
иlibunwind
. Это может потребовать установки дополнительных пакетов в вашей системе разработчика или использования другой конфигурации. -
Сборка вашего приложения с отладочной информацией: убедитесь, что вы компилируете ваше приложение с флагами, включающими отладочную информацию. Например:
gcc -g -o /data/perfload source.c
-
Проверка на доступность других архивов: Если ваше оборудование действительно не поддерживает полноценный анализ стека, посмотрите на возможность использования других инструментов для профилирования, таких как
gprof
илиgperftools
, которые может потребоваться также интегрировать в вашу сборку.
3. Альтернативные подходы
Если указанные шаги не приводят к успеху, рассмотрите возможность использования более простых инструментов профилирования, таких как gprof
. Это может помочь получить начальное представление о производительности, прежде чем вернуться к более сложным методам анализа с использованием perf.
Заключение
Решение вашей проблемы требует внимательного анализа конфигураций как системы perf, так и вашего приложения. Интерпретация данных и корректная сборка является ключом к успешному использованию инструмента perf для создания flamegraphs. Надеюсь, эти рекомендации помогут вам в устранении обнаруженных проблем и успешном использовании perf на вашей архитектуре MIPS. Если у вас будут дополнительные вопросы или потребуется более детальная помощь, не стесняйтесь обращаться!