Не удалось запустить некоторые функции с инструментом производительности в встраиваемом Linux.

Вопрос или проблема

Я работаю над встроенной системой 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. Если у вас будут дополнительные вопросы или потребуется более детальная помощь, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...